Android進(jìn)程管理篇(二)-進(jìn)程查殺方式總結(jié)

本篇文章簡單總結(jié)一下Android系統(tǒng)查殺進(jìn)程的方式务漩。

一、進(jìn)程查殺方式總結(jié)
殺進(jìn)程方法 方法所在類 使用層 方法描述
System.exit(int status) System 應(yīng)用 退出虛擬機(jī)卫漫。status=0為正常退出、非0為異常退出肾砂。
Process.killProcess(int pid) Process 應(yīng)用列赎、系統(tǒng) 調(diào)用sendSignal發(fā)送信號9,殺死指定pid進(jìn)程。app調(diào)用只能自殺包吝,系統(tǒng)可以殺掉指定pid進(jìn)程饼煞。
Process.killProcessGroup(int uid, int pid) Process 系統(tǒng) 殺掉pid所在的進(jìn)程組內(nèi)的所有進(jìn)程。
killApplicationProcess(String processName, int uid) AMS 系統(tǒng) 系統(tǒng)uid應(yīng)用才能調(diào)用诗越,binder call到客戶端自殺:app.thread.scheduleSuicide();
killApplication(String pkg, int appId, int userId, String reason) AMS 系統(tǒng) 系統(tǒng)uid應(yīng)用才能調(diào)用砖瞧,會將目標(biāo)應(yīng)用強(qiáng)殺,作用于指定用戶空間。
killAllBackgroundProcesses() AMS 系統(tǒng) 需要KILL_BACKGROUND_PROCESS權(quán)限嚷狞,殺死系統(tǒng)所有優(yōu)先級小于等于CACHED進(jìn)程块促。
killBackgroundProcesses(final String packageName, int userId, String reason) AMS 應(yīng)用、系統(tǒng) 需要KILL_BACKGROUND_PROCESS權(quán)限床未,殺死指定package所有優(yōu)先級小于等于SERVICE進(jìn)程,作用于指定用戶空間竭翠。
killProcessesBelowForeground(String reason) AMS 系統(tǒng) 系統(tǒng)uid應(yīng)用才能調(diào)用,殺死系統(tǒng)所有優(yōu)先級小于FOREGROUND的進(jìn)程薇搁。
killPackageDependents(String packageName, int userId) AMS 系統(tǒng) 需要KILL_UID權(quán)限斋扰,殺死指定package所有優(yōu)先級小于等于FOREGROUND進(jìn)程,作用于指定用戶空間。
killPids(int[] pids, String pReason, boolean secure) AMS 系統(tǒng) 系統(tǒng)UID應(yīng)用才能調(diào)用啃洋,首先找出所有進(jìn)程所有worstType(跟adj相關(guān)的一個判斷值)传货,殺死小于等于這個優(yōu)先級的進(jìn)程。很保守的查殺方法,并不保證進(jìn)程被殺
killUid(int appId, int userId, String reason) AMS 應(yīng)用、系統(tǒng) 需要KILL_UID權(quán)限缅糟,殺死UID下所有進(jìn)程估脆,system_server與native進(jìn)程除外
killAppAtUsersRequest(ProcessRecord app, Dialog fromDialog) AMS 系統(tǒng) 系統(tǒng)發(fā)生異常后調(diào)用,例如ANR ,多為用戶主動觸發(fā)
forceStopPackage(final String packageName, int userId) AMS 系統(tǒng) 需要FORCE_STOP_PACKAGE權(quán)限废累,殺死應(yīng)用所有進(jìn)程,并清除各個進(jìn)程組件信息,作用于指定用戶空間窟勃,強(qiáng)殺之后連根拔起,寸草不生逗堵。屬于終極Kill秉氧。

注:AMS對應(yīng)的應(yīng)用層調(diào)用方法在ActivityManager中,通過如下方法獲取ActivityManager來調(diào)用:

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
二蜒秤、進(jìn)程查殺核武器:force stop介紹

2.1 查殺方法:

調(diào)用AMS forceStopPackageLocked(final String packageName, int uid, String reason)

2.2 查殺條件:

  • forceStop不殺系統(tǒng)persistent進(jìn)程汁咏;
  • 當(dāng)指定用戶userId時,不殺其他用戶空間的進(jìn)程作媚;

除此之外攘滩,以下情況則必然會成為被殺進(jìn)程:

  • 進(jìn)程已標(biāo)記remove=true的進(jìn)程,則會被殺纸泡;
  • 進(jìn)程的pkgDeps中包含該packageName漂问,則會被殺;
  • 進(jìn)程的pkgList中包含該packageName,且該進(jìn)程與包名所指定的AppId相等則會被殺蚤假;

進(jìn)程的pkgList是在啟動組件或者創(chuàng)建進(jìn)程的過程向該隊列添加的栏饮,代表的是該應(yīng)用下有組件運(yùn)行在該進(jìn)程。那么pkgDeps是指該進(jìn)程所依賴的包名磷仰,調(diào)用ClassLoader的過程添加袍嬉。

2.3 查殺過程:

  • 應(yīng)用狀態(tài):pms.setPackageStoppedState()將應(yīng)用的狀態(tài)置為STOP,并且無法通過帶有EXCLUDE_STOPPED flag的廣播啟動進(jìn)程
  • Process: 調(diào)用AMS.killPackageProcessesLocked()清理該package所涉及的進(jìn)程;
  • Activity: 調(diào)用ASS.finishDisabledPackageActivitiesLocked()清理該package所涉及的Activity;
  • Service: 調(diào)用AS.bringDownDisabledPackageServicesLocked()清理該package所涉及的Service;
  • Provider: 調(diào)用AMS.removeDyingProviderLocked()清理該package所涉及的Provider;
  • BroadcastRecevier: 調(diào)用BQ.cleanupDisabledPackageReceiversLocked()清理該package所涉及的廣播
  • 發(fā)送廣播ACTION_PACKAGE_RESTARTED灶平,用于停止已注冊的alarm,notification.

當(dāng)app被force-stop后伺通,90%保活策略都會失效:

  1. 無法接收到任何普通廣播民逼,那么也就常見的監(jiān)聽手機(jī)網(wǎng)絡(luò)狀態(tài)的變化或者屏幕亮滅的廣播來拉起進(jìn)程肯定是不可行泵殴;
  2. alarm鬧鐘一并被清理,無法實(shí)現(xiàn)定時響起的功能拼苍;
  3. 四大組件以及相關(guān)進(jìn)程都被一一剪除清理笑诅,即便多進(jìn)程架構(gòu)的app也無法拉起自己;
  4. 級聯(lián)誅殺:當(dāng)app通過ClassLoader加載另一個app疮鲫,則會在force-stop的過程中會被級聯(lián)誅殺吆你;
  5. 生死與共:當(dāng)app與另個app使用了share uid,在force-stop的過程俊犯,任意一方被殺則另一方也被殺妇多,建立起生死與共的強(qiáng)關(guān)系。

參考:
http://gityuan.com/2016/10/22/force-stop/

系列文章:
Android進(jìn)程管理篇(一)-應(yīng)用進(jìn)程啟動過程
Android進(jìn)程管理篇(二)-進(jìn)程查殺方式總結(jié)
Android進(jìn)程管理篇(三)-AMS進(jìn)程調(diào)度
lowmemorykiller總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載燕侠,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者者祖。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绢彤,隨后出現(xiàn)的幾起案子七问,更是在濱河造成了極大的恐慌,老刑警劉巖茫舶,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械巡,死亡現(xiàn)場離奇詭異,居然都是意外死亡饶氏,警方通過查閱死者的電腦和手機(jī)讥耗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疹启,“玉大人古程,你說我怎么就攤上這事『把拢” “怎么了挣磨?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵菲宴,是天一觀的道長。 經(jīng)常有香客問我趋急,道長,這世上最難降的妖魔是什么势誊? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任呜达,我火速辦了婚禮,結(jié)果婚禮上粟耻,老公的妹妹穿的比我還像新娘查近。我一直安慰自己,他們只是感情好挤忙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布霜威。 她就那樣靜靜地躺著,像睡著了一般册烈。 火紅的嫁衣襯著肌膚如雪戈泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天赏僧,我揣著相機(jī)與錄音大猛,去河邊找鬼。 笑死淀零,一個胖子當(dāng)著我的面吹牛挽绩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驾中,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼唉堪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肩民?” 一聲冷哼從身側(cè)響起唠亚,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎此改,沒想到半個月后趾撵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡共啃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年占调,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移剪。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡究珊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纵苛,到底是詐尸還是另有隱情剿涮,我是刑警寧澤言津,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站取试,受9級特大地震影響悬槽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞬浓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一初婆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猿棉,春花似錦磅叛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杖爽,卻和暖如春敲董,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慰安。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工臣缀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泻帮。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓精置,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锣杂。 傳聞我的和親對象是個殘疾皇子脂倦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容