RK-Android11-性能优化-限制App内存上限默认512m
提示: 单个APP内存上限默认为512M 需求实现
文章目录
- 前言
- 一、参考资料
- 二、实现方案
- 涉及到的文件
- 实现方案
- 三、 虚拟机参数 dalvik.vm.heapgrowthlimit-dalvik.vm.heapsize 介绍
- 核心区别
- 默认值范围(典型情况)
- 如何查看设备的具体值
- ADB 命令
- 代码动态获取
- 小结
- 四、实际遇到的坑点
- 遇到坑点
- 五、扩展内容
- ActivityManager 设置-获取 dalvik.vm.heapsize 值
- SystemProperties 设置 dalvik.vm.heapsize 属性值
- 总结
前言
其实就是要修改VM 虚拟机相关的参数,涉及到相关属性值修改实现,通过这个需求,最核心的还是了解 Android系统相关的性能内容
,比如GC、内存、堆栈 等
一、参考资料
Dalvik配置与JVM
老罗的Android 之旅阅读笔记(Dalvik/ART 虚拟机篇)
Android VM 02.Davilk 启动 内存 GC
Android Dalvik虚拟机内存参数优化指南
Android内存性能参数分析
所以这里只是通过一点带面,通过需求其实是需要了解最核心的性能优化 虚拟机相关的模块内容的。
二、实现方案
涉及到的文件
/frameworks/native/build/tablet-10in-xhdpi-2048-dalvik-heap.mk
实现方案
PRODUCT_PROPERTY_OVERRIDES += \dalvik.vm.heapstartsize=16m \dalvik.vm.heapgrowthlimit=192m \
- dalvik.vm.heapsize=512m \
+ dalvik.vm.heapsize=515m \dalvik.vm.heaptargetutilization=0.75 \dalvik.vm.heapminfree=512k \dalvik.vm.heapmaxfree=8m
修改dalvik.vm.heapsize 属性值默认为512m,自己可以修改为其它值 . ;如果需要也可以同步修改dalvik.vm.heapgrowthlimit 参数值,针对普通应用如果有需求的话可以加大一些。
三、 虚拟机参数 dalvik.vm.heapgrowthlimit-dalvik.vm.heapsize 介绍
核心区别
参数 | 作用 | 触发条件 |
---|---|---|
dalvik.vm.heapgrowthlimit | 普通应用的最大堆内存限制(软限制) | 默认应用(未声明 android:largeHeap) |
dalvik.vm.heapsize | 大堆应用的最大堆内存限制(硬限制) | 应用声明 android:largeHeap=“true” |
默认值范围(典型情况)
设备 RAM | heapgrowthlimit (普通应用) | heapsize (大堆应用) |
---|---|---|
≤ 512MB (低端) | 48MB ~ 96MB | 128MB ~ 256MB |
1GB ~ 2GB (中端) | 128MB ~ 192MB | 256MB ~ 384MB |
≥ 3GB (高端) | 192MB ~ 256MB | 512MB ~ 1GB |
如何查看设备的具体值
ADB 命令
# 查看普通应用堆限制
adb shell getprop dalvik.vm.heapgrowthlimit# 查看大堆应用堆限制
adb shell getprop dalvik.vm.heapsize# 查看所有 Dalvik/ART 内存参数
adb shell getprop | grep dalvik.vm
示例输出如下:
dalvik.vm.heapgrowthlimit=192mdalvik.vm.heapsize=512m
代码动态获取
// 获取普通应用堆限制(单位:MB)
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass(); // 对应 heapgrowthlimit
int largeMemoryClass = am.getLargeMemoryClass(); // 对应 heapsizeLog.d("Memory", "Default heap limit: " + memoryClass + "MB");
Log.d("Memory", "Large heap limit: " + largeMemoryClass + "MB");
小结
这里简单、针对性介绍了 VM 相关的 两个两个参数 dalvik.vm.heapgrowthlimit 、 dalvik.vm.heapsize 的区别、介绍和获取方式。其它VM相关参数也很重要,这里暂不分析。 剩下的就是针对性的在系统中默认它的值就可以了。
四、实际遇到的坑点
遇到坑点
- 配置位置大量出现,无法找到具体修改配置地方: 我们这里是解决RK 平台上,给定了指定的路径 然后直接修改过了。 实际上 系统中这两个参数配置根本不知道在哪里修改,修改了也没啥作用,使用 grep 大法 会出现大量的配置地方,对于新手来说一脸懵,对系统配置优先级不了解的更是无奈。
- 就算找到了真正的配置文件地方,修改了 编译ROOM 烧录固件,怎么都没有效果。 这里强烈建议修改一次后,删除out 目录,整编一次(好使接近两个小时要的吧)
上面是自己实际过程中走过的坑,特别是第二点 怎么都没想到,结果导致花费大量时间。
五、扩展内容
假使在第四点中遇到坑,出不来,换个思路?
说到底 就是已修改属性 dalvik.vm.heapgrowthlimit 、 dalvik.vm.heapsize 值,既然默认无用、找不到默认值修改地方。那就直接在运行的时候写入不就可以了嘛? 我们这里以 dalvik.vm.heapsize 属性值修改为例
前面用Java 动态获取值:
```java
// 获取普通应用堆限制(单位:MB)
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass(); // 对应 heapgrowthlimit
int largeMemoryClass = am.getLargeMemoryClass(); // 对应 heapsizeLog.d("Memory", "Default heap limit: " + memoryClass + "MB");
Log.d("Memory", "Large heap limit: " + largeMemoryClass + "MB");
既然有获取, 我们找到 ActivityManager 对应的服务,看看相关代码,找到对应的内容。
ActivityManager 设置-获取 dalvik.vm.heapsize 值
\frameworks\base\core\java\android\app\ActivityManager.java
获取实际上就是获取属性的值:
SystemProperties.get("dalvik.vm.heapsize", "16m");
SystemProperties 设置 dalvik.vm.heapsize 属性值
上面分析了AM 中获取值实际上调用的就是获取系统属性的值,那么我们在系统起来的时候设置一次这个值不就行了嘛。
/*** Set the value for the given {@code key} to {@code val}.** @throws IllegalArgumentException for non read-only properties if the {@code val} exceeds* 91 characters* @throws RuntimeException if the property cannot be set, for example, if it was blocked by* SELinux. libc will log the underlying reason.* @hide*/@UnsupportedAppUsagepublic static void set(@NonNull String key, @Nullable String val) {if (val != null && !key.startsWith("ro.") && val.getBytes(StandardCharsets.UTF_8).length> PROP_VALUE_MAX) {throw new IllegalArgumentException("value of system property '" + key+ "' is longer than " + PROP_VALUE_MAX + " bytes: " + val);}if (TRACK_KEY_ACCESS) onKeyAccess(key);native_set(key, val);}
我们发现 set 属性值是有规范要求的,非ro. 开头属性,系统不允许这样写权限。 所以 这条路大概率走不通 或者 修改一下 这里代码也行。 大家可以自行验证。
总结
- VM参数、性能 、GC 才是重点 这里暂未分析,这里只是修改其中两个内存相关参数值,默认。
- 这里的修改方案只针对RK平台,即使RK不同平台不同方案修改位置可能也不一样,但是方向思路不会变的,灵活应用。
- 遇到坑的地方,当穷尽很多方法,认为已经改了就是没有效果。 就全编一次吧,这是个人经验。