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 ;;完成安装
Table of Contents
1 Android源码下载
1.1
- 工具下载 sudo apt-get install git-core curl
- 创建工程根目录,并进入 mkdir ~/develop/download-froyo ;cd ~/develop/download-froyo
- 下载repo脚本,用于下载android源码 curl http://Android.git.kernel.org/repo > ./repo
2 Android内存管理学习
- 谁需要内存分配?
- 谁提供内存分配?
- 内存分配方案?
- 内存监控工具?
- 内存应用场景? 从GC触发的原因得知,内存使用的分类
3 Android发布
- 2.2 -> Froyo冻酸奶
- 2.3.x -> Ginger Bread姜饼
- 3.x.x -> Honey Comb蜂巢
- 4.0.x -> Ice Cream Sandwich冰欺凌三明治
- 4.1.x -> Jelly Bean果冻豆
- 4.2.x -> Jelly Bean果冻豆
4 dalvik源码阅读,涉及cpp,不熟悉
5 Android适配低内存
5.1 介绍
Android现在支持512MB内存的设备。该文档的旨在指导OEMs厂商优化和配置android4.4上的低内存设备。
5.2 Android平台优化
5.2.1 改善内存管理
- 已验证过的省内存内核配置:Kernel Same-page Merging(KSM)和交换到ZRAM
- 杀掉哪些无法再缓存或已缓存过大的进程
- 禁止开销大的服务嵌入到Android服务,所以不会导致luncher被杀掉
- 杀掉哪些长期空转的进程,尽管是一般不可杀的当前IME
- 系列化launch的后台服务
- 微调低配设备的内存使用:加大OOM的调整级别,更小的图形缓存,等
5.2.2 精简系统内存
- 裁剪系统服务和系统UI进程,可节省几MBs
- 往Dalvik中预载dex cache
- 关掉JIT-off选项
- 减少每个进程前端cache开销
- 在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的优化方案:
- 如果硬件允许不连续的内存分配,ION heap允许从系统内存分配内存,以减少对carveouts的使用;
- 如果memory regions必须是连续的或限制在特定地址方位时,可以用CMA