Android framework--谈谈AMS.updateOomAdjLocked

关于Android系统的内存回收机制,相信大家都不陌生,Android基于各个应用进程承载四大组件的状态对应用进程进行重要性评估,并在系统内存紧张时根据重要性由低到高来选择杀死应用进程,以达到释放内存的目的。重要性评估由AMS执行,具体来说就是AMS.updateOomAdjLocked函数,反过来说,AMS.updateOomAdjLocked的作用就是更新应用进程的重要性。

应用进程(ProcessRecord)的重要性由三个状态值表示:

  • adj:LMK杀进程的评分依据
  • procState:指示进程状态
  • schedGroup:指示进程调度策略

本文不会分析该函数的具体执行,而是讨论这三个状态值之间的差异,代码参考Android N。


基本的思考

既然要评估进程的重要性,并以此作为LMK回收进程的依据,理论上来讲由单个状态来指示重要性,并告知LMK应该是最好的方案,简单粗暴,逻辑清晰。大家从很多地方都可以得知,oom_adj就是提供给LMK进行内存回收的依据,但是对于procState和schedGroup要么一笔带过,要么干脆不提及。但是既然存在这么两个东西,必然有其存在的意义。

我们先大概讲下AMS.updateOomAdjLocked的执行流程:

updateOomAdjLocked(ProcessRecord app)
    -updateOomAdjLocked(ProcessRecord app, int cachedAdj,
               ProcessRecord TOP_APP, boolean doingAll, long now) 
        -computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP,
            boolean doingAll, long now)
        -applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
            long nowElapsed)
updateOomAdjLocked()
    -computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP,
            boolean doingAll, long now)
        -applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
            long nowElapsed)

有上述两种执行路径,相同的空格缩进表示函数调用栈的同一级,注意updateOomAdjLocked有多个重载版本。重点说明出下面几点:

  • updateOomAdjLocked在应用进程的组件运行状态发生改变时被调用,比如有Service启动,有广播接收者收到广播,有Activity启动等,这很好理解,因为进程重要性的计算就依赖于组件运行状态,既然组件运行状态发生了改变,就应该实时更新;
  • computeOomAdjLocked根据一定规则计算出三个状态值,这个规则跟Android将进程划分的5个优先级有关系,即前台进程、可见进程、服务进程、后台进程、空进程,这里不详细说明;
  • applyOomAdjLocked将computeOomAdjLocked计算出的三个状态值应用起来,即真正发挥这三个状态值的作用。

既然要分析这三个状态值的作用,看源码如何使用这些值就是最好的办法,从上面可以知道,applyOomAdjLocked是我们的切入点。


applyOomAdjLocked

下面代码中涉及的ProcessRecord中cur开头的字段均为computeOomAdjLocked函数计算出的当前状态值,比如curAdj,curProcState,curSchedGroup,下面从代码的角度分别描述它们的作用。

adj

if (app.curAdj != app.setAdj) {
    ProcessList.setOomAdj(app.pid, app.info.uid, app.curAdj);
    if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(TAG_OOM_ADJ,
            "Set " + app.pid + " " + app.processName + " adj " + app.curAdj + ": "
            + app.adjType);
    app.setAdj = app.curAdj;
    app.verifiedAdj = ProcessList.INVALID_ADJ;
}

curAdj是computeOomAdjLocked计算出的adj值,赋值给setAdj,并且调用ProcessList.setOomAdj,继续往下看:

public static final void setOomAdj(int pid, int uid, int amt) {
    if (amt == UNKNOWN_ADJ)
        return;

    long start = SystemClock.elapsedRealtime();
    ByteBuffer buf = ByteBuffer.allocate(4 * 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: xposed-framework-v90-beat3-magiskmodule.zip 是一个Magisk模块,它提供了对Xposed Framework的支持。Xposed Framework是一个强大的Android修改工具,可以让用户对系统进行深度定制,并添加各种功能和特性。 该模块需要通过Magisk来进行安装,因为Magisk是一个系统级的框架,可以在无需修改系统分区的情况下对Android设备进行修改。 Xposed Framework主要通过向Android系统注入代码,来实现对系统的修改。它提供了许多插件和模块,可以实现一些常见的功能,如修改某些应用的行为、添加新的快捷方式,甚至可以更改应用的外观和主题等。 通过使用xposed-framework-v90-beat3-magiskmodule.zip,用户可以将Xposed Framework集成到Magisk中,以便在Android设备上进行高级定制。安装这个模块非常容易,只需要将它放置在Magisk的模块文件夹中,然后在Magisk Manager中选择安装即可。 但是需要注意的是,由于Xposed FrameworkAndroid系统进行了深度修改,可能会导致系统的不稳定和安全性的风险。因此,在安装前务必备份设备,以防出现意外情况。另外,确保从可信的来源下载和安装该模块,以避免安全风险。 总之,xposed-framework-v90-beat3-magiskmodule.zip 是一个Magisk模块,用于将Xposed Framework集成到Magisk中,从而实现对Android系统的深度定制和功能增强。但是请谨慎操作,并确保安全和稳定性。 ### 回答2: xposed-framework-v90-beat3-magiskmodule.zip是一个针对安卓手机的Magisk模块,用于安装Xposed框架的。Xposed框架是一个开源的第三方框架,通过它可以实现在不修改系统的情况下对安卓手机进行个性化定制和功能增强。 这个Magisk模块的版本是v90-beat3,表示这是一个测试版本,可能存在一些问题和不稳定性。Magisk是一个用于完整系统脱机挂载的工具,可以在不修改系统分区的情况下对系统进行修改,因此可以避免一些安全性问题。 将xposed-framework-v90-beat3-magiskmodule.zip安装到Magisk Manager后,可以在手机上启用Xposed框架。Xposed框架具有丰富的模块,可以实现一些强大的功能,如修改系统UI、增加新的快捷方式、改变应用行为等。用户可以根据自己的需求选择和定制需要的模块。 需要注意的是,安装Xposed框架可能会对手机的稳定性和安全性产生一定的影响,因此在安装前需要做好备份,并确保自己具备一定的技术水平和知识来解决可能出现的问题。安全起见,建议仅在了解风险的情况下使用这个Magisk模块,并使用官方推荐的版本。 总结来说,xposed-framework-v90-beat3-magiskmodule.zip是一个通过Magisk安装的Xposed框架模块,可以在安卓手机上实现个性化定制和功能增强。安装前需要备份和了解风险,并需具备一定的技术水平来解决问题。 ### 回答3: xposed-framework-v90-beat3-magiskmodule.zip是一个用于安卓系统的模块,主要用途是通过修改系统文件来实现一些个性化的功能和优化。 Xposed Framework是一个非常流行的开源项目,它提供了让用户在不修改APK文件的情况下修改系统应用程序和框架的能力。它通过在系统启动时使用一个虚拟机来实现这一点,并通过安装不同的模块来添加各种功能。 v90-beat3意味着这是Xposed Framework的版本号,版本号的增加通常意味着更多的功能和更好的稳定性。这个版本可能是一个测试版本,意味着它仍然处于开发阶段,可能存在一些问题,但它也可能包含一些新功能的改进。 Magisk Module是一个用于Magisk Manager的模块,Magisk是一种基于开源的Android通用系统修改工具。它允许用户以系统级的方式对设备进行修改,而不会影响原始系统文件。Magisk Module可以通过Magisk Manager进行管理和安装,它可以添加各种功能,如Root权限、模块管理和隐藏特定应用程序等。 总的来说,xposed-framework-v90-beat3-magiskmodule.zip是一个用于安卓系统的Xposed Framework模块,通过修改系统文件来提供个性化功能和优化。它可能是一个测试版本,而Magisk Module是用于Magisk Manager的模块,可以添加各种功能和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值