1. 程式人生 > >開機嚮導wifi設定無法跳過

開機嚮導wifi設定無法跳過

目前第一次開機(或者恢復出廠設定後開機)有以下兩個問題:

  • 開機嚮導wifi設定介面skip按鈕置灰,等待一段時間後才可以點選跳過
  • 開機動畫完成後黑屏一段時間才出現開機嚮導第一個介面

以上兩個問題並不會同時出現(即類似互斥關係)

WIFI設定介面無法skip問題,主要因為GmsCore得3個dex檔案做dex2oat時間太長導致:

  1. 由於手機防盜功能,開機嚮導在wifi設定介面需要判斷FRP的狀態來決定是否一定需要網路來登入Google賬戶驗證
  2. FRP狀態需要通過GmsCore的FrpService獲取,而FrpService需要等待GmsCore的3個外掛dex檔案做dex2oat完成後才能啟動
  3. 如果在開機嚮導的wifi設定介面,FrpService還沒有啟動起來,那麼這個時候skip按鈕就是置灰的;需要一直等待FrpService啟動後獲取到正確的FRP狀態後skip按鈕才可以點選

開機嚮導啟動前黑屏問題,關鍵在於從開機動畫完成到開機嚮導的第一個有介面activity啟動花費太長時間,而這個又是因為其它應用在開機階段首次執行時做dex2oat導致cpu loading幾乎100%:出現黑屏問題的時候,由於開機嚮導啟動時間被延後,所以在wifi設定介面時GmsCore的dex2oat已完成,這個時候可以正常通過FrpService獲取到frp狀態,從而可以一次性跳過;而未出現黑屏問題的時候,由於開機嚮導啟動時間早,所以在wifi設定介面時GmsCore的dex2oat還未完成,所以無法正常獲取frp狀態,導致無法skip

總結:

以上兩個問題都是同一個原因造成(App佔用CPU資源做dex2oat),只是對應的現象不一樣

解法主要從以下方面進行優化:

  • 縮短GmsCore外掛做dex2oat時間
  • 延遲開機嚮導啟動時間(加長開機動畫時間)

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 38 39 40 41 42 43 44 45 46 47 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java importjava.lang.Thread; finalintstartActivityLocked(...) { ... if(err == ActivityManager.START_SUCCESS) { finalintuserId = aInfo != null? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; ///M: @{ ComponentName SetupCmpName = intent.getComponent(); String GMSSetupString = "com.google.android.setupwizard/.SetupWizardActivity"; if(userId == 0&& SetupCmpName != null&& GMSSetupString.equals(SetupCmpName.flattenToShortString())) { int sleepTimeMS = 5000;//發現“啟動開機嚮導Activity的Intent”,那就先延時休眠5秒,給時間它做dex2oat