目录
一、介绍
recovery
二、进入recovery的问题集
1.关于触发拯救模式,导致机器进入recovery。
拯救模式又称救援模式,是Android 8.0新增的一个功能,它的功能介绍可以参见网络上的很多介绍文章,本文只关注问题分析。
问题场景如下:进入隐私空间,长按控制中心的移动数据按钮,此时com.android.phone进程报停,还有一定的几率进入recovery。
分析如下:
- 隐私空间:当前Android版本为Android 11,实现的隐私空间功能的方式是创建一个新USER,来达成该需求,主空间与隐私空间的切换就是一个用户切换的过程(有兴趣的可以网上搜索,原理比较简单,但是修改比较繁琐)。
- com.android.phone进程报错的原因:
由于隐私空间为非主用户,所以在com.android.phone进程中获取Phone的时候,Phone不允许被获取,详见com.android.internal.telephony.PhoneFactory的getPhone方法E AndroidRuntime: Caused by: java.lang.IllegalStateException: Default phones haven't been made yet! E AndroidRuntime: at com.android.internal.telephony.PhoneFactory.getPhone(PhoneFactory.java:369)
,而其中sMadeDefaults最为关键,在隐私空间的时候调用该方法,直接抛出该异常,而在正常的流程下,sMadeDefaults是会在PhoneFactory的静态方法makeDefaultPhone(Context context) 中被赋值为true的,所以导致getPhone失败,从而导致com.android.phone进程不断的报停。@UnsupportedAppUsage public static Phone getPhone(int phoneId) { String dbgInfo = ""; synchronized(sLockProxyPhones) { if (!sMadeDefaults) { throw new IllegalStateException("Default phones haven't been made yet!"); } else { Phone phone; if (phoneId == 2147483647) { phone = sPhone; } else { phone = phoneId >= 0 && phoneId < sPhones.length ? sPhones[phoneId] : null; } return phone; } } }
I Watchdog: Interesting Java process com.android.phone died. Pid 12818 I Watchdog: Interesting Java process com.android.phone started. Pid 12880
- 此时由于com.android.phone是个常驻进程,不断的重启,又不断的died,所以触发救援模式。
- 救援模式:在com.android.phone进程的不断started与died的过程中,level等级被不断的提升,一旦到达FACTORY_RESET等级,系统就会自主进入recovery(注:最后一句log是自行添加的,用来判断是哪个进程导致触发救援模式)。
W RescueParty: Attempting rescue level RESET_SETTINGS_UNTRUSTED_DEFAULTS W RescueParty: Attempting rescue level RESET_SETTINGS_UNTRUSTED_CHANGES W RescueParty: Attempting rescue level RESET_SETTINGS_TRUSTED_DEFAULTS W RescueParty: Attempting rescue level FACTORY_RESET I EventReporterService: processTagFlags tag: 100122, msg: FACTORY_RESET,com.android.phone,1001, flags: 1, logTimeMs: 1629794809759
所以处理进入recovery的问题,首先就要判断是不是救援模式被触发了。