1.1 Android reboot流程
[圖片上傳失敗...(image-6eeea-1526054751305)]
**思路: **執(zhí)行到shutdown::run
時(shí),
a.設(shè)置Flag
QuickShutdown=true
b.以廣播通知系統(tǒng)一鍵加速清理進(jìn)程,此時(shí)聯(lián)網(wǎng)撤摸、影響用戶體驗(yàn)、最經(jīng)使用的TopN
應(yīng)用均需清理蜀漆;
一鍵加速原理參考:
手機(jī)管理應(yīng)用研究【4】—— 手機(jī)加速篇
2.1 AMS::startProcessLocked
private final void startProcessLocked(ProcessRecord app, String hostingType,
String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
if(QuickShutdown) return;
...
}
2.2 AMS::handleAppDiedLocked
/**
* Main function for removing an existing process from the activity manager
* as a result of that process going away. Clears out all connections
* to the process.
*/
private final void handleAppDiedLocked(ProcessRecord app,
boolean restarting, boolean allowRestart) {
if(QuickShutdown) { // 禁止Process重啟
restarting = false;
allowRestart = false;
}
...
}
handleAppDiedLocked相關(guān)調(diào)用棧
[圖片上傳失敗...(image-f39c4e-1526054751305)]
左邊分支cleanUpApplicationRecordLocked
用于清理死亡進(jìn)程中運(yùn)行的四大組件service
, BroadcastReceiver
, ContentProvider
相關(guān)信息;
右邊分支ASS.handleAppDiedLocked
清理死亡進(jìn)程中運(yùn)行的activity
相關(guān)信息
參考:
binder_died
2.3 AMS::killPackageProcessesLocked
private final boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj, boolean callerWillRestart, boolean allowRestart,
boolean doit, boolean evenPersistent, String reason) {
if (QuickShutdown) {
callerWillRestart = false;
allowRestart = false;
evenPersistent = true; //persistent 進(jìn)程需清理
doit = true; //app.removed=true時(shí)虾攻,添加進(jìn)程到procs中莫瞬,procs中的進(jìn)程將被removeProcessLocked
}
...
}