- 5.1_r3版本,按钮置灰一段时间后可以恢复,点击即可跳过
- 6.0_r2版本,按钮置灰不能恢复,则此次开机一直不能跳过
▪Version
▪Rate
30% ~ 50%
▪Analyze
5.1_r3及以上版本:
L1版本升级最新5.1 GMS_r3,目前第一次开机(或者恢复出厂设置后开机)有以下两个问题:
- 开机向导wifi设置界面skip按钮置灰,等待一段时间后才可以点击跳过
- 开机动画完成后黑屏一段时间才出现开机向导第一个界面
以上两个问题并不会同时出现(即类似互斥关系)
WIFI设置界面无法skip问题,主要因为GmsCore得3个dex文件做dex2oat时间太长导致:
- 由于手机防盗功能,开机向导在wifi设置界面需要判断FRP的状态来决定是否一定需要网络来登录Google账户验证
- FRP状态需要通过GmsCore的FrpService获取,而FrpService需要等待GmsCore的3个插件dex文件做dex2oat完成后才能启动
- 如果在开机向导的wifi设置界面,FrpService还没有启动起来,那么这个时候skip按钮就是置灰的;需要一直等待FrpService启动后获取到正确的FRP状态后skip按钮才可以点击
开机向导启动前黑屏问题,关键在于从开机动画完成到开机向导的第一个有界面activity启动花费太长时间,而这个又是因为其它应用在开机阶段首次运行时做dex2oat导致cpu loading几乎100%:
出现黑屏问题的时候,由于开机向导启动时间被延后,所以在wifi设置界面时GmsCore的dex2oat已完成,这个时候可以正常通过FrpService获取到frp状态,从而可以一次性跳过;
而未出现黑屏问题的时候,由于开机向导启动时间早,所以在wifi设置界面时GmsCore的dex2oat还未完成,所以无法正常获取frp状态,导致无法skip
总结:
以上两个问题都是同一个原因造成(App占用CPU资源做dex2oat),只是对应的现象不一样,后面针对当前分析给出workaround解法
解法主要从以下方面进行优化:
- 缩短GmsCore插件做dex2oat时间
- 延迟开机向导启动时间(加长开机动画时间)
6.0_r2及以上版本:
M版本升级最新6.0 GMS_r2,目前第一次开机(或者恢复出厂设置后开机)会概率性出现开机向导wifi设置界面无法跳过,一旦出现,此次开机将一直无法点击跳过按钮
M版本GmsCore第一次运行时并不需要再做dex2oat,可是SetupWizard的机制有所变化,即:
SetupWizard通过asyncTask调用GmsCore获取FRP Status,如果10s未返回结果则cancel掉此asyncTask(通过中断线程执行直接cancel,同时抛出InterruptedException异常),且设置必须要网络连接才可以进行下一步
对于性能不够好的机器,10s有可能线程未能及时finished,则会导致开机向导状态错误
总结:
后面针对当前分析给出workaround解法,解法主要从“取消中断异常”方面进行优化
▪Solution
5.1_r3及以上版本:
1.
首先根据
[FAQ15597]whitelist: 针对个别apk由于的dex2oat原因安装失败/ 安装慢 / lunch慢的处理方法
修改/art/dex2oat/dex2oat.cc,对应白名单为:
在device.mk中加入PRODUCT_PROPERTY_OVERRIDES += ro.mtk.dex2oat_white_list=com.google.android:
(注意 包名后又冒号“:”一定要加,如果有多个应用,每个应用的包名后面都要添加":",且总字符串不能超过91个字符)
2.
FAQ15597中的/art/dex2oat/dex2oat.cc以下部分代码做一下改变:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#ifdef HAVE_ANDROID_OS
if
(shouldUseInterpretonly(zip_location.c_str())){
compiler_filter_string =
"interpret-only"
;
LOG(INFO) <<
" This apk is in whitelist from property so set interpret-only"
;
}
else
if
(shouldUseInterpretonly(dex_filename.c_str())){
compiler_filter_string =
"interpret-only"
;
LOG(INFO) <<
" This jar is in whitelist from property so set interpret-only"
;
|