美文网首页
关于Android9.0开机黑屏一段时间才加载launcher界

关于Android9.0开机黑屏一段时间才加载launcher界

作者: ncd | 来源:发表于2020-12-08 17:47 被阅读0次

    原文路径:关于Android9.0开机黑屏一段时间才加载launcher界面的解决方法

    前言

    最近做9.0项目,发现开机的时候,会先显示壁纸一段时间,再去加载launcher,如果壁纸是黑色的,则会导致开机动画结束后,显示黑屏一段时间,再看到launcher。

    调试抓log

    遇到问题,当然就是看开机日志了。一番折腾,找到比较有用的log如下:

    20:10:50.453   769  1910 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.example.user.myapplication/.FallbackHome} from uid 0 on display 0
    
    20:10:54.376  2029  2029 D FallbackHome: User unlocked and real home found; let's go!
     
    20:10:54.466   769  2207 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.setupwizard/.SetupWizardActivity} from uid 0 on display 0
    

    原来在启动launcher前,系统先启动了一个FallbackHome的界面,接着再启动launcher,这中间差了4秒,这跟现象对上了,即先显示一段时间的壁纸,再启动launcher。

    FallbackHome

    那FallbackHome是什么呢?
    FallbackHome是原生setting的一个activity,且配置了DirectBoot mode。launcher启动的时候会先启动到这个界面,用户解锁后,才会调用finish,结束该界面,从而进入到真正的launcher界面。
    若未解锁就等待ACTION_USER_UNLOCKED广播后再去启动Launcher。非DirectBoot模式下的launcher耗时4s就是在等待finishBooting后的系统广播ACTION_USER_UNLOCKED。
    FallbackHome就是应DirectBoot功能而新增的一个页面,具体DirectBoot功能不在这里赘述,大家可自行了解。

    如何解决黑屏

    那如何解决掉处于DirectBoot模式下的黑屏呢?
    尝试了多种方案,最终比较完美的方案如下:
    通过延长开机动画,等进入到非DirectBoot模式,再结束开机动画。
    但屏蔽掉关闭开机动画以及开机动画服务结束检测相关代码:

    frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java 
    private void performEnableScreen()方法:
    .....
        /* 这里屏蔽掉一些代码
            if (!mBootAnimationStopped) {
                Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);
                // stop boot animation
                // formerly we would just kill the process, but we now ask it to exit so it
                // can choose where to stop the animation.
                SystemProperties.set("service.bootanim.exit", "1");
                mBootAnimationStopped = true;
            }
    
            if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {
                if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: Waiting for anim complete");
                return;
            }
    
            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!");
            }
        */
        ....
    }
    

    这里屏蔽了系统结束开机动画的代码,那么得找一个地方去结束开机动画,从而启动launcher。
    FallbackHome具备home属性,launcher也必带home属性。那么我们可以通过判断系统所启动的应用为Home应用但又不是FallbackHome时,就可以结束开机动画了。
    在如下地方去结束开机动画:

    frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java 
    private void reportLaunchTimeLocked(final long curTime) {
        ....
        //mnq, 20190819, @ {
        //Log.d(TAG, "reportLaunchTimeLocked......" + shortComponentName + " intent" + intent);
        if (isHomeIntent(intent) && shortComponentName != null && !shortComponentName.contains("FallbackHome")) {
            SystemProperties.set("service.bootanim.exit", "1");
            Log.d(TAG, "reportLaunchTimeLocked:real home....." + shortComponentName);
        }
        //mnq, 20190819, @}
    }
    

    如此更改后,开机后,发现系统不会有黑屏的现象,且开机动画结束后就进入到了launcher界面了。
    MTK平台上,也会有此问题,不够它会在界面上有一个友好的提示:

    Phone is starting....
    

    告知用户,此时机器正在启动中。
    这个其实一样,也可以用这个办法去处理。

    相关文章

      网友评论

          本文标题:关于Android9.0开机黑屏一段时间才加载launcher界

          本文链接:https://www.haomeiwen.com/subject/fqdqgktx.html