android 7.1的“安卓正在启动...”

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即可。



你可能感兴趣的:(安卓正在启动,直接启动,Dierect,Boot,FallbackHome,坑)