一. 概述
Android系统在很多情况下都会进入到一种无法自主恢复的状态下:例如无法开机,常驻系统进程无限crash等等,往往在这些情况下手机已经无法正常使用了,像这些情况小白用户往往都不知道怎么修复手机,只能送回售后了。在O上加了一个救援的机制就是来解决这些问题的,这个机制叫:
RescueParty
。
RescueParty
的原理大致为:同一个uid的应用发生多次异常,RescueParty会根据该uid记录发生的次数,当次数达到默认次数后会调整拯救的策略。拯救策略等级分为:
1.NONE
2.RESET_SETTINGS_UNTRUSTED_DEFAULTS
3.RESET_SETTINGS_UNTRUSTED_CHANGES
4.RESET_SETTINGS_TRUSTED_DEFAULTS
5.FACTORY_RESET
最终的拯救策略是进recovery模式。
那么哪些场景会造成触发这个机制呢?
1.a persistent app is stuck in a crash loop
2.we're stuck in a runtime restart loop.
二.RescueParty 原理介绍
RescueParty的原理我们从第一点“
a persistent app is stuck in a crash”来说,appCrash的流程这里就不多说了,看一张时序图好了:
O上在AppErrors.java的
crashApplicationInner方法中加上了
RescueParty监控,具体代码如下:
void crashApplicationInner(ProcessRecord r, ApplicationErrorReport.CrashInfo crashInfo,
int callingPid, int callingUid) {
。。。
// If a persistent app is stuck in a crash loop, the device isn't very
// usable, so we want to consider sending out a rescue party.
if (r != null && r.persistent) {
RescueParty.notePersistentAppCrash(mContext, r.uid);
}
AppErrorResult result = new AppErrorResult();
TaskRecord task;
。。。
}
这里调用了
RescueParty的