杀进程场景

转载自: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)的进程;
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Delphi 是一种应用程序开发环境,可以用于开发 Windows 平台的程序。在 Delphi 中,有一个函数叫做 OpenProcess(),可以用来打开一个已知的进程,以便进行操作。但是,在某些情况下,程序可能会被毒软件或系统安全软件误判为恶意程序,从而被关闭或禁用。因此,为了防止这种情况发生,需要对 OpenProcess() 进行处理。 一种常用的做法是使用隐藏驱动程序,通过驱动程序操作,使进程无法被死。具体而言,就是在 Delphi 中调用驱动程序的接口,利用驱动程序的操作能力来完成进程的操作。该方法需要驱动程序具有管理员权限并且安装到系统目录下,否则无法执行。 另一种方法是通过代理程序来进行进程操作。代理程序的作用是代理 Delphi 程序进行进程操作,因此可以防止系统安全软件或毒软件对 Delphi 程序的干扰。具体实现方法是对需要操作的进程进行内存地址偏移,并将偏移后的地址传递给代理程序进行操作。代理程序要在系统启动时启动,并以管理员权限运行。 总之,为了保证 Delphi 程序正常运行,需要对进程技术进行深入的研究和应用。同时,需要注意遵守相关法律法规,防止在使用该技术时违反相关规定。 ### 回答2: Delphi是一种常用的开发语言,可以用于开发Windows平台上的程序,包括进程管理方面,其中包括进程的技术。 在Delphi中,通过使用openprocess()方法可以获取到一个指定的进程句柄,该句柄可以用于访问和控制该进程中的资源和数据。然而,该方法也为恶意程序提供了可乘之机,使得它们可以通过获取并关闭进程句柄来绕过毒软件等安全监控程序的控制,并在后台进行潜伏和恶意操作。 针对上述问题,可以通过以下几种方式来增强Delphi进程的效果: 1. 使用特权级别高的进程权限 在使用openprocess()方法时,可以通过设置相应的访问权限,获取特权级别高的进程句柄来提高进程的效果。这样便可以避免恶意程序通过低权限进程句柄来操纵系统进程的情况发生。 2. 密钥加密和动态域名解析的技术 在进程方面,可以采用密钥加密和动态域名解析的技术来增强程序的安全性,增加恶意程序绕过的难度。 3. 监控并直接关闭恶意进程 同时,可以采用监控进程的方式来检测恶意进程,在检测到后直接关闭该进程,从而有效地遏制其恶意行为。 总之,Delphi进程在开发防御恶意程序的应用程序过程中,必须要仔细考虑不同场景下的安全问题,结合不同的技术手段和方法来增强进程的安全性,以防止不法分子的入侵和恶意操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值