RK-Android11-性能优化-限制App内存上限默认512m

提示: 单个APP内存上限默认为512M 需求实现


前言

其实就是要修改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”

默认值范围(典型情况)

设备 RAMheapgrowthlimit (普通应用)heapsize (大堆应用)
≤ 512MB (低端)48MB ~ 96MB128MB ~ 256MB
1GB ~ 2GB (中端)128MB ~ 192MB256MB ~ 384MB
≥ 3GB (高端)192MB ~ 256MB512MB ~ 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=192m

dalvik.vm.heapsize=512m

代码动态获取

// 获取普通应用堆限制(单位:MB)
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass(); // 对应 heapgrowthlimit
int largeMemoryClass = am.getLargeMemoryClass(); // 对应 heapsize

Log.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(); // 对应 heapsize

Log.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
     */
    @UnsupportedAppUsage
    public 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不同平台不同方案修改位置可能也不一样,但是方向思路不会变的,灵活应用。
  • 遇到坑的地方,当穷尽很多方法,认为已经改了就是没有效果。 就全编一次吧,这是个人经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值