android系统启动流程
7.2 luancher黑屏问题分析
当launcher具备persistent属性时,系统一开始就会拉起他;但这个并非完全是串行的,拉起进程的动作socket和zygote通讯,并不做任何等待就返回。
紧接着,开始启动调用launcher显示的动作,activity进入栈顶,会 执行将自身apptoken加入到windowmanager的动作,只有这个加进去了,activity的绘图才会被显示出来。
launcher进程起来后,开始attach回调,此时会出现一个时机问题: 1)如果这时形成栈顶activity信息和当前进程attach的进程信息一致,于是attachApplicationLocked调用realStartActivityLocked; 2)而这时如果mWindowManager.addAppToken还没完成的话,
realStartActivityLocked中的mWindowManager.setAppVisibility(r.appToken, true);就会失败。
3)realStartActivityLocked的写法是继续往下走,默认显示成功,调用scheduleLaunchActivity执行activity的create和resume动作,并调用
minimalResumeActivityLocked设置当前acitivity状态为resumed,这是实际只是绘图完成了,而windowmanger. setAppVisibility失败就类似于没有update,所以luancher不会显示。
4)调用launcher显示的流程继续走到ActivityStack .resumeTopActivityLocked.,但是此时activity的状态已经是resumed,于是什么都做不做,直接return,连这条补救的路径都没完成显示,最终导致黑屏。
简单解决该问题的办法就是在这个return之前再调用一次realStartActivityLocked。
如果launcher进程启动够快,则不会触发调用realStartActivityLocked,activity的状态就不会乱;或者launcher进程启动够慢或压根就由正常的流程自己去启动进程,则等于是个串行的流程,虽然慢,但是也不会出现状态乱。
尝试优化加快luancher显示:
是否可以在systemready函数中,直接找到launcherapk,第一个拉起他的进程,然后调用resumetopactivity,这样应该能引导luancher变成单一的流程,迅速显示。
41 / 41