相关源码文件:framework/base/service/core/java/com/android/server/am/ActiveServices.javaframework/base/service/core/java/com/android/server/am/ActiveManagerServices.java
1.adj更新时机
realStartActivityLocked: 启动ActivityresumeTopActivityInnerLocked: 恢复栈顶ActivityfinishCurrentActivityLocked: 结束当前ActivityfinishSubActivityLockedfinishVoiceTaskdestroyActivityLocked: 摧毁当前ActivityrealStartServiceLocked: 启动服务bindServiceLocked: 绑定服务(只更新当前app)unbindServiceLocked: 解绑服务 (只更新当前app)bringDownServiceLocked: 结束服务 (只更新当前app)sendServiceArgsLocked: 在bringup或cleanup服务过程调用 (只更新当前app)removeConnectionLockedserviceDoneExecutingLockedprocessNextBroadcast: 处理下一个广播processCurBroadcastLocked: 处理当前广播deliverToRegisteredReceiverLocked: 分发已注册的广播 (只更新当前app)removeContentProvider: 移除providerremoveContentProviderExternalUncheckedpublishContentProviders: 发布provider (只更新当前app)getContentProviderImpl: 获取provider (只更新当前app)setSystemProcess: 创建并设置系统进程addAppLocked: 创建persistent进程attachApplicationLocked: 进程创建后attach到system_server的过程;trimApplications: 清除没有使用appappDiedLocked: 进程死亡killAllBackgroundProcesses: 杀死所有后台进程.即(ADJ>900或removed=true的普通进程)killPackageProcessesLocked: 以包名的形式 杀掉相关进程;importanceTokenDiedsetProcessImportantupdateSleepIfNeededLockedsetHasTopUiupdateProcessForegroundLockedsetAppIdTempWhitelistStateLockedsetUidTempWhitelistStateLockedtrimApplicationssetHasOverlayUideliverToRegisteredReceiverLocked相关文件:
framework/base/service/core/java/com/android/server/am/ProcessList.java
2.lmk的framework层部分
2.1.setOomAdj函数
Android进程调度:Low memory killer(3)中介绍到adj的设置最终在setOomAdj方法中完成。
2.2三大命令协议
[LMK_PROCPRIO]+ pid + uid + amt 设置ADJ [LMK_TARGET+minFree0+oom_adj0+minFree1+oom_adj1...] 更新oom_adj ProcessList.remove方法与lmkd通信协议格式:[LMK_PROCREMOVE+pid] 移除进程3.lmkd部分
相关源文件:system/core/lmkd/lmkd.rcsystem/core/lmkd/lmkd.c
3.1.lmkd守护进程
3.2.init函数
3.3.init_mp_common函数
- O_RDONLY | O_CLOEXEC方式打开/dev/memcg/memory.pressure_level返回mpfd
- O_RDONLY | O_CLOEXEC方式打开/dev/memcg/cgroup.event_control返回evctlfd
- 构建eventfd,这个东东是用来通信的,不同的进程可以通过这个FD来读写里面的数据从而达到通信的目的
- “evctlfd mpfd levelStr”的格式字符串写到/dev/memcg/cgroup.event_control
- evctlfd 加入epoll监听序列,事件data=event_handler,这个FD的读事件被监听到时将触发event_handler处理,也就是mp_event_common函数
- eventfd存放在mpevfd数组中,“media” evfd对应index=0位置,“critical” evfd对应index=1位置
- epoll会监听mpevfd数组中的两个fd,一旦有读事件发生就会触发事件相关的处理函数,实现细节参考3.4小节
3.4.mp_event_common函数
- 169行:如果系统已用内存占比大于downgrade_pressure(60%),交换出去的内存低于40%说明系统可用内存还算充裕,不用通过杀死进程来获取更多内存;
- 175行:系统的已用内存高于upgrade_pressure(40%)阈值,交换出去的内存低于60%说明内存压力有所缓解,此时如果内存压力级别是critical则可以将内存压力级别降为medium
3.5.find_and_kill_process函数
- 如果is_critical为真,采用critical_oomadj(默认0);否则media(默认800)
- find_and_kill_process函数从1000开始往下查找进程直到临界值,找到则杀掉该进程释放所占内存
3.6.mainLoop函数
- epoll_wait等待事件被触发,如果有监听事件触发,则执行对应data中的处理函数
3.7.ctrl_connect_handler函数
3.8.ctrl_data_handler->ctrl_command_handler函数
3.9.minfree和adj文件
android:/# cat /sys/module/lowmemorykiller/parameters/minfree18400,23030,27608,32236,55286,82640 //单位:页android:/# cat /sys/module/lowmemorykiller/parameters/adj0,100,200,300,900,906
以上两条数据,可解释为如下含义:
当系统剩余内存低于82640页的时候,系统会杀死adj>=906级别的进程
当系统剩余内存低于55286页的时候,系统会杀死adj>=900级别的进程
当系统剩余内存低于32236页的时候,系统会杀死adj>=300级别的进程
当系统剩余内存低于27608页的时候,系统会杀死adj>=200级别的进程
当系统剩余内存低于23030页的时候,系统会杀死adj>=100级别的进程