android 7.1中的“安卓正在启动...”
其实是
Settings中的FallbackHome...
这个桌面在 直接启动(Dierect Boot)的阶段中加载,而直接启动则为安卓7.0以后的新特性。
这个问题弄了我两个星期,和主管探讨了很久。
一开始是想把这个快速启动给去掉,最后屈服在谷歌的淫威之下改为将开机动画延时以盖住FallbackHome。
刚开始上网找资料的时候,发现网上大多数资料只是在介绍 直接启动 这个安卓新特性有多牛掰有多安全有多好用。
然而这个新特性对于车机行业来说则显得多余。
当时只找到了一篇文章《Android7.0 DirectBoot阻塞开机分析》再探讨如何去掉直接启动的。
在这篇文章中描述得很详细了,所以我就不再描述多一篇了。有兴趣的话可以去看看。
出于公司的业务需求,需要在开机动画后直接显示桌面,期间不得出现其他画面或长时间的黑屏(其实是老板觉得难看)。
所以必须想办法把“安卓正在启动”这个画面给去掉。
从网上能找到一堆资料可以知道当service.bootanim.exit 当这个属性被设置为 1 时退出开机动画。
大家可以去搜一下自己的源码在哪儿修改了这个属性。
在WindowManagerService的performEnableScreen()中:
...
if (!mBootAnimationStopped) {
// Do this one time.
Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);
try {
IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
if (surfaceFlinger != null) {
//Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
Parcel data = Parcel.obtain();
data.writeInterfaceToken("android.ui.ISurfaceComposer");
surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED
data, null, 0);
data.recycle();
}
} catch (RemoteException ex) {
Slog.e(TAG_WM, "Boot completed: SurfaceFlinger is dead!");
}
mBootAnimationStopped = true;
}
if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {
if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: Waiting for anim complete");
return;
...
这段代码请求退出开机动画,所以也需要注释掉。
最后在我们希望的地方将service.bootanim.exit设置为1即可。