小内存版本android,Android系统在小内存下的使用

最近在调试的方案,硬件配置是512MB的DDR,这在Android4.4这号称优化很大的系统版本上运行还是很吃力,找了一些资料,发现我们的方案上使用到了ZRAM这一技术,直接使用压缩内存来作为交换分区,其中涉及到的内核配置如下:

CONFIG_SWAP=y

CONFIG_CGROUP_MEM_RES_CTLR=y

CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y

CONFIG_ZRAM=y

CONFIG_ZSMALLOC=y

接下来运行起来后(如上述编译失败,需要把SYSFS和BLOCK相关配置加上),可以看到有/dev/block/zram0 这一结点,然后我们的方案在init.rc里加了一个service,其为oneshot类型,就是执行一个脚本了,脚本内容如下:

#!/system/bin/sh

echo $((256*1024*1024))> /sys/block/zram0/disksize

mkswap /dev/block/zram0

swapon /dev/block/zram0

sleep 1

mkfs.ext2 -b 4096 /dev/block/zram0

sleep 1

mount -t rootfs -o remount -rw rootfs /

mkdir /swap_zram0

sleep 1

mount -t rootfs -o remount -r rootfs /

mount -t ext2 -o rw /dev/block/zram0 /swap_zram0

这样的话,我们就有了一个交换分区来使用了,但发现使用free -m命令查看时,SWAP分区一直没有使用,并且一直有lowmemorykiller的操作,后来发现是我们的/sys/module/lowmemorykiller/parameters/minfree参数还是1GB DDR的配置,故而将其按一定比例调小后就可以了。

对于/sys/module/lowmemorykiller/parameters/minfree,其6个值与/sys/module/lowmemorykiller/parameters/adj一一对应,而adj这个与每个进程的/proc/X/oom_adj有关系,其中oom_adj的值越小表示越重要,越不可能被杀掉,而adj对应的6组参数在Android源码的frameworks/base/services/java/com/android/server/am/ProcessList.java有其对应值,我们的平台为0,117,235,352,529,1000,相应的minfree在1GB时设置为2048,6144,7168,22528,25600,26624,在512MB时设置为2048,6144,7168,10240,15360,20480。在这里会根据每个进程的oom_adj的值去判断是属于adj的哪个范围,当内存小于minfree对就的值,就去杀掉adj对应范围内的oom_adj所对应的进程。

如果SWAP分区不使用,我们还可以调整/proc/sys/vm/swappiness对应值,提升磁盘数据置换到SWAP的可能性,默认为60。

如果不想APK对应的进程大容易被KILL掉,可以在AndroidManifest.xml里面加上android:persistent="true"配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值