杀进程场景

转载自:http://gityuan.com/2016/04/23/kill_process_case/

一. 杀进程场景

理解杀进程的实现原理, 介绍了杀进程的过程, 接下来本文介绍系统framework层, ActivityManagerService在哪些场景会调用ProcessRecord.java中的kill()方法来杀进程.

void kill(String reason, boolean noisy) {
    if (!killedByAm) {
        if (noisy) {
            Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);
        }
        //调用该方法,则会输出EventLog, 最后一个参数reason代表是通过何在方法触发kill
        EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
        Process.killProcessQuiet(pid);
        Process.killProcessGroup(info.uid, pid);
        if (!persistent) {
            killed = true;
            killedByAm = true;
        }
    }
}

reason对于分析问题很重要, 实例说明:

am_kill : [0,26328,com.gityuan.app,0,stop com.gityuan.app]

这是Eventlog,可知最后一个参数stop com.gityuan.app, 代表的是reason = stop packageName, 那么显然这个app是由于调用forceStopPackageLocked而被杀. 先看重点说说force-stop

1.1 force-stop

对于force-stop系统这把杀进程的利器, 还会额外出现一个reason来更详细的说明触发force-stop的原因.

Slog.i(TAG, "Force stopping " + packageName + " appid=" + appId + " user=" + userId + ": " + reason);

以下场景都会调用force-stop, 输出reason表格如下:

方法reason含义
AMS.forceStopPackagefrom pid callingPid
AMS.finishUserStopfinish user
AMS.clearApplicationUserDataclear data
AMS.broadcastIntentLockedstorage unmount
AMS.finishBootingquery restart
AMS.finishInstrumentationLockedfinished instevenPersistent
AMS.setDebugAppset debug appevenPersistent
AMS.startInstrumentationstart instrevenPersistent
PKMS.deletePackageLIuninstall pkg
PKMS.movePackageInternalmove pkg
PKMS.replaceSystemPackageLIreplace sys pkg
PKMS.scanPackageDirtyLIreplace pkg
PKMS.scanPackageDirtyLIupdate lib
PKMS.setApplicationHiddenSettingAsUserhiding pkg
MountService.killMediaProvidervold reset

PKMS服务往往是调用killApplication从而间接调用forceStopPackage方法.

当然除了force-stop, 杀进程的原因(reason)有很多种形式, 如下:

1.2 异常杀进程
方法reason含义
appNotRespondinganrANR
appNotRespondingbg anrANR
handleAppCrashLockedcrashCRASH
crashApplicationcrashCRASH
processStartTimedOutLockedstart timeout
processContentProviderPublishTimedOutLockedtimeout publishing content providers
removeDyingProviderLockeddepends on provider cpr.name in dying proc processName
1.3 主动杀进程
方法reason含义
forceStopPackageLockedstop user userId
forceStopPackageLockedstop packageName
killBackgroundProcesseskill background
killAllBackgroundProcesseskill all background
killAppAtUsersRequestuser request after errorFORCE_CLOSE
killUidkill uidPERMISSION
killUidPermission related app op changedPERMISSION
killProcessesBelowAdjsetPermissionEnforcement
killApplicationProcess-直接杀
killPidsFree memory
killPidsUnknown
killPids自定义调用者自定义
1.4 调度杀进程
方法reason含义
trimApplicationsempty
applyOomAdjLockedremove task
updateOomAdjLockedcached #numCached
updateOomAdjLockedempty #numEmpty
updateOomAdjLockedempty for tableimes
updateOomAdjLockedisolated not needed
1.5 其他杀进程
方法reason含义
cleanUpRemovedTaskLockedremove task
attachApplicationLockederror during init
systemReadysystem update done
getProcessRecordLockedlastCachedPssk from cached
performIdleMaintenanceidle maint (pss lastPss from initialIdlePss)
checkExcessivePowerUsageLockedexcessive wake held
checkExcessivePowerUsageLockedexcessive cpu
scheduleCrashscheduleCrash for message failed

二. 杀进程手段

以上介绍的所有杀进程都是调用ProcessRecord.kill()方法, 必然会输出相应的EventLog.那么还有哪些场景的杀进程不会输出log呢:

Process.killProcess(int pid) //可杀任何指定进程,或者直接发signal 
adb shell kill -9 <pid>  //可杀任何指定的进程  
直接lmk杀进程

也就是说进程被杀而无log输出,那么可能是通过直接调用kill或者发信号, 再或许是lmk所杀.

三. 小结

杀进程log举例:

am_kill : [0,3226,com.android.quicksearchbox,13,empty #13]
Force stopping com.android.providers.media appid=10010 user=-1: vold reset
Killing 5769:com.android.mms/u0a21 (adj 15): empty #13
processes xxx at adjustment 1 //杀adj=1的进程

进程记录信息:

进程结构体数据类型说明
mProcessNamesProcessMap根据进程名和uid查询
mPidsSelfLockedSparseArray根据pid查询
mLruProcessesArrayListforeach调用

评估:

  • killPids: 这个比较灵活,只需要指定pid即可杀进程, 也可定制kill reason.
  • forceStopPackage: 杀进程最为彻底;
  • killBackgroundProcesses: 只杀adj > SERVICE_ADJ(5)的进程;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值