软件版本: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!迎刃而解~~~~