在说明内存优化前,先用工具来说明
android 应用的内存分布
上面是一个默认的android项目
里面很清楚的描述了应用内存的各种占比
- Java:从 Java 或 Kotlin 代码分配的对象的内存。
-
Native:从 C 或 C++ 代码分配的对象的内存。
-
Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)
-
Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关。
-
Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。
-
Others:您的应用使用的系统不确定如何分类的内存。
-
Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。
java 可以理解为堆。堆的介绍参考《深入理解java jvm》中
总结来说就是减少对象的内存占比 一般来说图片资源及时释放,避免不必要的对象开销
Native 暂时不用解释
Graphics 后面在单独解释
Stack 可以理解为栈。栈的介绍参考《深入理解java jvm》中
栈是线程私有,它的生命周期与线程相同。是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
总结来说就是控制线程数,避免多个线程, 一般来说就是线程池
Code 理解为代码量和资源
代码量:推荐《重构》
官方文档 https://developer.android.com/topic/performance/reduce-apk-size#support-densities
简单介绍
缩减资源数量和大小
APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。缩减 APK 大小的一种简单方法是缩减其包含的资源数量和大小。具体来说,您可以移除应用不再使用的资源,并且可以用可伸缩的 Drawable
对象取代图片文件。此部分将讨论上述这些方法,以及另外几种可减少应用中的资源以缩减 APK 总大小的方法。
仅支持特定密度
尽管 Android 支持所有这些密度,但您无需将光栅化资源导出为每个密度。
使用可绘制对象
某些图片不需要静态图片资源;框架可以在运行时动态绘制图片。Drawable
对象(XML 中为 <shape>
)会占用 APK 中的少量空间。此外,XML Drawable
对象会生成符合 Material Design 准则的单色图片。
重复使用资源
压缩 PNG 文件
压缩 PNG 和 JPEG 文件
使用 WebP 文件格式
使用矢量图形
避免使用枚举
单个枚举会使应用的 classes.dex
文件增加大约 1.0 到 1.4KB 的大小。这些增加的大小会快速累积,产生复杂的系统或共享库。如果可能,请考虑使用 @IntDef
注释和代码缩减移除枚举并将它们转换为整数。此类型转换可保留枚举的各种安全优势。
等。
以上就是我们常用的优化手段