基于Android 6.0源代码分析,统计AMS可能会杀死该过程的所有场景。
一.杀死过程场景
了解了杀流程的实现原理,介绍了杀流程的流程。 其次,介绍系统framework层、ActivityManagerService在哪个场景下调用ProcessRecord.java的kill (方法执行杀死过程。
void kill (字符串区域,布尔通知) {
if (! killedByAm ) {
if(noisy ) {
slog.I(tag,' Killing ' toShortString () ) ) ) adj ' setAdj ) ) : ) reason );
}
//调用此方法时,将输出事件日志。 最后一个参数reason表示是用什么方法触发kill的
事件日志. write event (事件日志tags.am _ kill,userId,pid,processName,setAdj,reason );
process.killprocessquiet(PID
处理. kill处理组(info.uid,pid );
if (! 持续) {
killed=true;
killedByAm=true;
}
}
}
reason在分析问题中很重要,实例展示了:
am _ kill : [ 0,26328,com.gityuan.app,0,stop com.gityuan.app]
这是事件日志,您可以看到最后一个参数stop com.gityuan.app表示reason=stop packageName。 很明显,这个app是因为调用forceStopPackageLocked而被杀的。
首先,让我们集中讨论一下财富停止
1.1财富停止
在force-stop系统这一杀人过程的利器中,会添加reason,更详细地说明引起force-stop的理由。
sog.I(tag,' force stopping ' package name ' appid=' appid ' user=' userid ' : ' reason );
以下场景都调用force-stop,输出reason表为以下:
方法
利耶松
意思是
AMS.forceStopPackage
来自PID呼叫PID
AMS.finishUserStop
finish用户
AMS.clearApplicationUserData
clear data
AMS.broadcastIntentLocked
存储单元
AMS.finishBooting
查询重新启动
AMS.finishinstrumentationlocked
完成inst
事件持久性
AMS.setDebugApp
设置调试应用程序
事件持久性
AMS.startInstrumentation
开始不稳定
PKMS.deletePackageLI
通用公共汽车
PKMS.movePackageInternal
move pkg
PKMS.replaceSystemPackageLI
replace sys pkg
PKMS.scanPackageDirtyLI
更换pkg
PKMS.scanPackageDirtyLI
更新lib
pkms.setapplicationhiddensettingasuser
hiding pkg
MountService.killMediaProvider
卷重置
PMS服务通常通过调用kill应用程序间接调用forceStopPackage方法。
当然,除了财富停止,杀人过程的起因(reason )有多种形式,如下:
1.2异常杀人过程
方法
利耶松
意思是
appNotResponding
anr
ANR
appNotResponding
bg anr
ANR
handleAppCrashLocked
克拉什
克拉什
crash应用
克拉什
克拉什
processStartTimedOutLocked
开始时间输出
processcontentproviderpublishtimedoutlocked
timeoutpublishingcontentproviders
已恢复预配置锁定
dependsonprovidercpr.nameindyingprocprocessname
1.3积极杀人过程
|方法|含义|