当前位置: 首页 > news >正文

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”

默认值范围(典型情况)

设备 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=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不同平台不同方案修改位置可能也不一样,但是方向思路不会变的,灵活应用。
  • 遇到坑的地方,当穷尽很多方法,认为已经改了就是没有效果。 就全编一次吧,这是个人经验。
http://www.dtcms.com/a/266591.html

相关文章:

  • 利用TCP协议,创建一个多人聊天室
  • 使用reactor-rabbitmq库监听Rabbitmq
  • Go中使用Google Authenticator
  • 东软8位MCU低功耗调试总结
  • 如何使用python识别出文件夹中全是图片合成的的PDF,并将其移动到指定文件夹
  • 【ASP.NET Core】REST与RESTful详解,从理论到实现
  • 当前主流AI智能代理框架对比分析报告
  • 分布式光伏监控系统防孤岛保护装置光功率预测
  • 【论文阅读】VARGPT-v1.1
  • Webpack构建工具
  • node.js下载教程
  • 机器学习数学基础与Python实现
  • 机器学习在智能建筑中的应用:能源管理与环境优化
  • 每日问题总结记录
  • 一、如何用MATLAB画一个三角形 代码
  • 基于AR和SLAM技术的商场智能导视系统技术原理详解
  • 京东小程序JS API仓颉改造实践
  • 深圳安锐科技发布国内首款4G 索力仪!让斜拉桥索力自动化监测更精准高效
  • 【centos8服务如何给服务器开发3306端口】
  • Python 中线程和进程在实际项目使用中的区别和联系
  • 解决HttpServletRequest无法获取@RequestBody修饰的参数
  • Java并发性能优化|读写锁与互斥锁解析
  • Python 中的可迭代对象与迭代器:原理与项目实战
  • 【Verilog】parameter、localparam和 `define的区别
  • Android View的绘制原理详解
  • 基于虚拟化技术的网闸安全交换:物理隔离时代的智能数据流通引擎
  • 最快实现的前端灰度方案
  • python打卡day58@浙大疏锦行
  • 算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
  • 用原生 JS + Vue 实现一套可复用的前端错误监控系统