Android学习积累杂项

本文档主要探讨了Android系统的低内存优化,包括内存管理、平台优化、编译时配置和内核调整。介绍了如何改善内存管理、精简系统内存、调整内核配置,以及通过KSM、swap to zRAM等技术提升内存效率。同时,还涉及dalvik源码阅读和Android适配512MB内存设备的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android是一个基于linux内核的操作系统

Android阵营包含HTC、T-Mobile、三星、华为、LG、摩托罗拉、ARM、软银移动、中国移动和华为;Android特点:1.开放性。平台免费开源。Google通过与运营商、设备制造商、开发商等机构形成了战略联盟2.应用程序的权限由开发人员决定,降低Android程序开发成本;3.舒适的开发环境。Android体系结构:应用层:开发者的应用程序应用框架层:提供开发者API系统运行库层:java虚拟机Dalvik,java要想访问硬件,必须使用NDK(由C/C++语言编写的库,主要是*.so文件)Android开发需要什么?JDKEclipseAndroid SDKADT(Android Development Tools)Busybox的使用Android系统去掉了大多数工具(如grep find),因此在调试过程中,需自行安装busybox。下载busybox后push至手机:adb push busybox /system/xbin ;;/system/xbin为了避免冲突cd /system/xbinchmod 755 busyboxbusybox –install ;;完成安装

1 Android源码下载

1.1

  1. 工具下载 sudo apt-get install git-core curl
  2. 创建工程根目录,并进入 mkdir ~/develop/download-froyo ;cd ~/develop/download-froyo
  3. 下载repo脚本,用于下载android源码 curl http://Android.git.kernel.org/repo > ./repo 

2 Android内存管理学习

  1. 谁需要内存分配?
  2. 谁提供内存分配?
  3. 内存分配方案?
  4. 内存监控工具?
  5. 内存应用场景? 从GC触发的原因得知,内存使用的分类


3 Android发布

  1. 2.2 -> Froyo冻酸奶
  2. 2.3.x -> Ginger Bread姜饼
  3. 3.x.x -> Honey Comb蜂巢
  4. 4.0.x -> Ice Cream Sandwich冰欺凌三明治
  5. 4.1.x -> Jelly Bean果冻豆
  6. 4.2.x -> Jelly Bean果冻豆


4 dalvik源码阅读,涉及cpp,不熟悉

5 Android适配低内存

5.1 介绍

Android现在支持512MB内存的设备。该文档的旨在指导OEMs厂商优化和配置android4.4上的低内存设备。

5.2 Android平台优化

5.2.1 改善内存管理
  1. 已验证过的省内存内核配置:Kernel Same-page Merging(KSM)和交换到ZRAM
  2. 杀掉哪些无法再缓存或已缓存过大的进程
  3. 禁止开销大的服务嵌入到Android服务,所以不会导致luncher被杀掉
  4. 杀掉哪些长期空转的进程,尽管是一般不可杀的当前IME
  5. 系列化launch的后台服务
  6. 微调低配设备的内存使用:加大OOM的调整级别,更小的图形缓存,等


5.2.2 精简系统内存
  1. 裁剪系统服务和系统UI进程,可节省几MBs
  2. 往Dalvik中预载dex cache
  3. 关掉JIT-off选项
  4. 减少每个进程前端cache开销
  5. 在framework中引进ArrayMap/ArraySet替代HashMap/HashSet


5.2.3 Procstats

增加一个新的开发选项,用来显示内存状态和应用程序内存使用

5.2.4 API

增加ActivityManage.isLowRamDevice(),以便应用程序子啊运行时能检测系统内存规格,并决定是否选择Low-Memory功能

5.2.5 Memory Tracking

新的内存追踪HAL,用来追踪graphics内存分配,在dumpsys meminfo中增加额外的信息,显示meminfo的概貌

5.3 编译时配置

5.3.1 打开Low Ram Device标志

PRODUCT_PROPERTY_OVERRIDES += ro.config.lowram=true

5.3.2 关掉JIT特性

PRODUCT_PROPERTY_OVERRIDES += dalvik.vm.jit.codecachesize=0

5.3.3 Launcher 配置

不支持动态壁纸

5.4 内核配置

5.4.1 调节kernel/ActivityManager,减少内存直接回收

当一个进程或内核尝试分配一页内存(直接或者在产生新的page fault),但内核已用光所有可用的内存时,内存直接回收将被触发。

当释放页时,内核需要阻塞分配内存。接着轮流请求磁盘I/O协会脏的page,或者等待lowmemorykiller去杀掉一些进程,这将为每个线程带来额外的I/O开销。

内核有触发kswapd或者后台回收的watermarks,这些线程将周期性地回收内存。触发后台内存回收的默认阈值相当低,2GB的设备为2MB,512MB的设备配置为636KB。

内核在后台回收通常仅仅回收几MB内存,这意味着进程只要申请超过几M内存,那么很快就会被直接回收。

这次升级提供补丁去配置一些预留的内存,如:/proc/sys/vm/extra_freekbytes

5.4.2 调整LowMemoryKiller

A ctivityManager设置LowMemoryKiller的阈值,以调整每个进程运行时的缓存大小

5.4.3 KSM(Kernel samepage merging)

KSM是一个运行在后台的线程,用来比较内存中哪些页在上层程序运行时被标记为MADV_MERAGEABLE;如果发现两个page相同,KSM线程就会把它们合并到一个写时拷贝的页中。KSM可以为系统节省内存,但同时因为内存拷贝操作,而带来更大功耗。

打开内核选项:CONFIG_KSM

上层配置借口:

write /sys/kernel/mm/ksm/pagestoscan 100

write /sys/kernel/mm/ksm/sleepmillisecs 500

write /sys/kernel/mm/ksm/run 1

相关调试工具:procrank,librank,&ksminfo

5.4.4 swap to zRAM

zRAM通过压缩内存页并放于动态内存来增加系统可用内存。但是,它会带来CPU开销。

内核选项:CONFIG_SWAP

CONFIG_CGROUP_MEM_RES_CTLR

CONFIG_CGROUP_MEM_RES_CTLR_SWAP

CONFIG_ZRAM

挂载命令:/dev/block/zram0 none swap defaults zramsize=<size in bytes>,swapprio=<swap partition priority>

5.4.5 carveouts,Ion 和 Contiguous Memory Allocation(CMA)

低内存的设备重视CARVEOUTS是很重要的,特别是还没被充分利用的情况下,如用于secure video 回播。这里有几种针对依赖于硬件额外设计的carveouts region的优化方案:

  1. 如果硬件允许不连续的内存分配,ION heap允许从系统内存分配内存,以减少对carveouts的使用;
  2. 如果memory regions必须是连续的或限制在特定地址方位时,可以用CMA


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值