軟件版本:Android8.1
硬件版本:展訊平臺
這兩天解了一個bug,從某種意義上不算bug,而是優化,超有成就感,心路歷程記錄如下:
問題由來:屏廠上了一批次屏,而系統開機從動畫停止到Launcher顯示要黑2s左右,這個時間段會出現漏光的現象,甚爲尷尬!
最開始查看了啓動階段的日誌,做如下分析:
開始懷疑係統有延遲的操作甚至後臺崩潰之類的錯誤,導致Launcher啓動延時。
經過這兩天分析啓動日誌,發現跟IflyrecSmartRecorder app關係不是很大,app應該有優化的空間,但跟這個問題相關性不大。
調試過程:
刷機啓動後,刪除IflyrecSmartRecorder.app,此時啓動還是存在黑屏,排除IflyrecSmartRecorder的嫌疑(但app是可以做優化的)。
從啓動日誌看:
01-01 08:16:09.492 730 771 I WindowManager: ******* TELLING SURFACE FLINGER WE ARE BOOTED!
01-01 08:16:09.492 299 431 I SurfaceFlinger: Boot is finished (13413 ms)
這個時間節點開機動畫完成,系統下一步要啓動launcher
01-01 08:16:09.765 730 771 I WindowManager: All windows ready for display!
Windowmanager 可顯示回調被調用。
01-01 08:16:10.067 730 1111 I ActivityManager: START u0
{act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.xf.setupwidzard/.WizardActivity}
from uid 0, pid 0
AM啓動開機引導。
01-01 08:16:10.709 730 1111 I ActivityManager: START u0
{cmp=com.xf.setupwidzard/.WelcomeActivity}
from uid 1000, pid 1358
0.7s後啓動activity
01-01 08:16:10.846 730 1016 D WindowManager: Input focus has changed to Window
{6953daf u0 com.xf.setupwidzard/com.xf.setupwidzard.WelcomeActivity}
主Activity獲取焦點
01-01 08:16:10.983 730 771 I ActivityManager: Displayed com.xf.setupwidzard/.WelcomeActivity: +237ms (total +274ms)
主activity顯示。
從開機動畫完結到主界面顯示,大概1.5s,在此過程中未見系統崩潰及其異常日誌。
因此將該現象定性爲系統正常啓動的流程。
既然正常,那就尷尬了,該如何解決優化呢。。。
內行應該瞭解過,android7.0之後,引入了directboot模式,系統啓動後,開機動畫走完,是先走到了Settings下一個FallbackHome.java 的activity,這個裏邊再去引出真正的Launcher,而這個activity是沒有任何佈局文件的,所以該過程就黑了,怎麼體現銜接性呢,由於我們的設備開機動畫是靜態的一張圖片,因此想到了在進入這個activity之後,將背景設置爲開機動畫圖片,從而實現了動畫到launcher的無縫連接!!!
具體改動如下:
diff --git a/src/com/android/settings/FallbackHome.java b/src/com/android/settings/FallbackHome.java
index 5f7b639..0686ffa 100644
--- a/src/com/android/settings/FallbackHome.java
+++ b/src/com/android/settings/FallbackHome.java
@@ -64,6 +64,9 @@ public class FallbackHome extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ //getWindow().getDecorView().setBackgroundColor(Color.WHITE);
+ Log.e(TAG, "========= FallbackHome start display picture ==========");
+ getWindow().setBackgroundDrawableResource(R.drawable.start);
// Set ourselves totally black before the device is provisioned so that
// we don't flash the wallpaper before SUW
mProvisioned = Settings.Global.getInt(getContentResolver(),
@@ -125,6 +128,8 @@ public class FallbackHome extends Activity {
Log.d(TAG, "User unlocked and real home found; let's go!");
getSystemService(PowerManager.class).userActivity(
SystemClock.uptimeMillis(), false);
+ //this.getWindow().getDecorView().setBackgroundColor(Color.WHITE);
+ Log.e(TAG, "========= FallbackHome stop display picture ==========");
finish();
}
}
另外把start.png(開機圖片)放至drawable目錄。
So easy!迎刃而解~~~~