Android 车载内存优化-二

166 阅读5分钟

目录

  1. SVG & PNG
  2. SP & MMKV
  3. layout 布局
  4. SystemUI 优化

SVG & PNG 图片 CPU 和 内存对比

测试数据对比:

PNG & SVG .png

测试结论:

  • 图片 png 资源对于在目前的台架设备上,图片放在 drawable-hdpi 目录下比图片放在默认 drawable 目录下更省内存及 cpu
  • svg 图片比 png 图片更占内存,但更节省 apk 包体积。对需要做多分辨率的设备更友好
  • 采用 svg 资源相对来说会占据更多的 cpu

SVG(Scalable Vector Graphics)

优点:
  1. 可缩放性:SVG 是矢量图形,可以任意缩放而不会失真,非常适合需要在多个屏幕尺寸和分辨率上显示的图像。
  2. 文件大小:对于简单的图形,SVG 文件通常比相应的 PNG 文件更小。
  3. 灵活性:SVG 图像可以通过代码动态修改,例如改变颜色、形状等。
缺点:
  1. 渲染开销:SVG 文件在运行时需要解析和渲染,这可能会增加 CPU 的负担,尤其是对于复杂的 SVG 图像。
  2. 内存使用:虽然 SVG 文件本身可能较小,但渲染后的内存占用可能会比等效的 PNG 图像更高,特别是在复杂的 SVG 图像或频繁重绘时。

PNG(Portable Network Graphics)

优点:
  1. 渲染速度:PNG 是位图图像,直接显示在屏幕上,不需要额外的解析和渲染步骤,因此渲染速度通常比 SVG 快。
  2. 内存占用:PNG 图像的内存占用是确定的,取决于图像的分辨率和色深。对于简单的图像,内存占用可能比等效的 SVG 渲染后更低。
  3. 兼容性:PNG 图像在所有平台和设备上都能一致地显示。
缺点:
  1. 文件大小:对于复杂的图像,PNG 文件可能比等效的 SVG 文件更大。
  2. 不可缩放性:PNG 是位图图像,缩放时可能会失真或模糊。

内存使用比较

  • SVG 渲染后的内存使用:SVG 文件在加载和渲染时会占用内存,具体内存使用量取决于图像的复杂性和渲染引擎的效率。对于复杂的 SVG 图像,渲染后的内存占用可能会高于等效的 PNG 图像。
  • PNG 内存使用:PNG 文件在加载时会直接占用内存,内存使用量取决于图像的分辨率和色深。对于简单的图像,内存占用可能比等效的 SVG 渲染后更低。

实践建议

  1. 简单图形使用 SVG:对于简单的、需要缩放的图形(如图标、矢量图形等),使用 SVG 可以减少文件大小并提供更好的缩放效果。
  2. 复杂图像使用 PNG:对于复杂的图像或照片,使用 PNG 可以提供更好的性能和一致的显示效果。
  3. 混合使用:在实际项目中,可以根据具体情况混合使用 SVG 和 PNG。例如,使用 SVG 作为图标和简单图形,使用 PNG 作为复杂图像和照片。

SP & MMKV 对比

测试数据对比

SP & MMKV.png

测试结论

  • 测试的是以切换壁纸桌面,在 cpu 和 内存上没有明显的优劣
  • mmkv 在代码使用上不依赖 context
  • 项目中切换壁纸,移动卡片,信号接收的数据是有做本地存储,这些数据的读写频率较高推荐使用 mmkv

SharedPreferences

优点:

  1. 内置支持SharedPreferences 是 Android SDK 的一部分,无需额外依赖库。
  2. 简单易用:适合存储少量的简单数据,如布尔值、字符串、整数等。

缺点:

  1. 性能:在处理大量数据或频繁读写操作时,性能不如一些第三方解决方案。
  2. 功能有限:不支持复杂的数据类型(例如自定义对象),需要额外的转换。

MMKV

优点:

  1. 高性能MMKV 由腾讯开发,基于 mmap 内存映射,读写性能优于 SharedPreferences
  2. 支持更多数据类型:除了基本数据类型,还支持自定义对象和复杂数据结构的存储。
  3. 线程安全MMKV 的读写操作是线程安全的。
  4. 数据恢复MMKV 提供了数据恢复机制,防止数据损坏。

缺点:

  1. 额外依赖:需要在项目中引入第三方库。

选择建议

  • 简单应用或小规模数据存储:如果你的应用只需要存储少量的简单数据,并且对性能要求不高,SharedPreferences 是一个足够的选择。
  • 高性能需求或复杂数据存储:如果你的应用需要频繁读写操作,处理大量数据,或者需要存储复杂的数据结构,MMKV 是一个更好的选择。

layout 布局

测试数据对比

去 Layout 标签.png

测试结论

  • 移除未使用的 dataBinding ,去除 layout 标签后内存占有减少了 10~100M
  • 删除使用了 layout 包裹且未使用数据绑定的 xml 文件

性能损耗

  • 使用 <layout> 标签包裹 XML 布局文件,会有数据绑定和布局解析的开销。

SystemUI 优化

测试数据对比

SystemUI 内存优化.png

测试结论

  • 优化之前和优化之后的数据有明显的提升,内存占比减少了 25~140M
  • systemui 的内存大头在负一屏上

修改手段

  • 更改 AppCenterActivity 配置,切换主题模式时不会重新销毁再次创建
  • 更改主题模式更新方式,主动更换主题而不是依赖重建切换主题UI
  • 负一屏内存泄漏优化:负一屏状态监听列表集合的资源释放逻辑添加