android8.1启动过程(九) SystemServer启动FallbackHome

本文围绕Android系统启动Launcher的流程展开。SystemServer进程启动PackageManagerService完成应用安装,AMS启动Launcher。文中详细介绍了启动过程涉及的多个方法,如systemReady、startHomeActivityLocked等,还提及了日志查看、工厂模式等相关知识,以及系统未解锁前先启动FallbackHome作为过渡。

SystemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService启动后会将系统中的应用程序安装完成。在此前已经启动的AMS会将Launcher启动起来。

Launcher的入口为AMSsystemReady方法


1

ActivityManagerDebugConfig    frameworks/base/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java

这里首先分享一个技巧  可以把这个类里面的这个属性设置为true这样就可以把ActivityManager相关的log打开了

// Enable all debug log categories.
// static final boolean DEBUG_ALL = false;
static final boolean DEBUG_ALL = true;

2

startOtherServices()    frameworks/base/services/java/com/android/server/SystemServer.java

  此处是一个Lambda表达式省略的部分是一个回调方法

mActivityManagerService.systemReady(
                                     ...
                                    )

3

systemReady()    frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

  这里关于EventLog分享一个查看log的链接https://www.jianshu.com/p/1c9106dd8284

  android日志主要分为  kernel、radio、event、main

  adb logcat -b  xxx

130|generic_x86_64:/ # logcat -b events | grep "3040"                          
06-02 00:18:02.017  1541  1556 I am_pss  : [2069,10015,com.android.launcher,31063040,17305600,0]
06-02 00:22:02.033  1541  1556 I am_pss  : [2069,10015,com.android.launcher,31063040,17305600,0]
06-02 04:48:12.311  1541  1556 I am_pss  : [2069,10015,com.android.launcher,32285696,18903040,0]
06-02 09:19:17.510  1541  1556 I am_pss  : [2069,10015,com.android.launcher,33040384,19652608,0]
06-02 17:51:00.018  1541  1556 I am_pss  : [1710,1001,com.android.phone,31703040,20111360,0]
06-02 19:26:00.039  1541  1556 I am_pss  : [2069,10015,com.android.launcher,34850816,21463040,0]
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
        traceLog.traceBegin("PhaseActivityManagerReady");
        ...

        Slog.i(TAG, "System now ready");
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,
            SystemClock.uptimeMillis());
        ...
}

关于工厂模式FactoryTest可参考这篇文章  https://blog.csdn.net/thl789/article/details/8053574 这里是正常模式

...
//判断工厂模式
synchronized(this) {
    // Make sure we have no pre-ready processes sitting around.

    if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL)
...

 startPersistentApps    只启动加密感知的持久应用程序;一旦用户被解锁,我们将返回并启动不知情的应用程序可参考这篇文章    

https://blog.csdn.net/yaobao888/article/details/77824950

https://www.jianshu.com/p/c9e43905e6b6

https://www.jianshu.com/p/3db7809f231e

...
synchronized (this) {
            // Only start up encryption-aware persistent apps; once user is
            // unlocked we'll come back around and start unaware apps
            startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
...

启动Launcher 

startHomeActivityLocked(currentUserId, "systemReady");

4

startHomeActivityLocked()    frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

这里介绍来自这篇  https://blog.csdn.net/learnframework?spm=1001.2014.3001.5509

    这里看到了startHomeActivityLocked(currentUserId, “systemReady”);被调用,从名字既可以看得出他是要启动Home类型的Activtiy,常见的Launcher就是一种Home类型的Activity,但这里其实并不是Launcher,而是设置中的FallbackHome类型的,它也是一个Home类型的Activity,这里FallbackHome是google新加入的,主要就是因为涉及整个android系统的加密等原因,系统在还没有完全解锁前,不可以启动Launcher,因为Launcher中明显和各个第三方应用耦合较多(比如桌面可能显示着一堆的各个应用的Widget),如果直接Launcher作为FallbackHome启动,相对就会要求Launcher依赖的应用也是支持直接解密类型,那就肯定不现实。所以就先启动了FallbackHome一个什么也不显示的界面来作为启动真正Launcher的一个过度

boolean startHomeActivityLocked(int userId, String reason) {
        if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
                && mTopAction == null) {
            // We are running in factory test mode, but unable to find
            // the factory test app, so just sit around displaying the
            // error message and don't try to start anything.
            return false;
        }
        Intent intent = getHomeIntent();
        ...
}

5

getHomeIntent()  frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

在这个方法中创建了Intent  并将mTopActionmTopData传入,

String mTopAction = Intent.ACTION_MAIN;

和若是系统运行模式不是低级工厂模式则将Intent的Category设置为Intent.CATEGORY_HOME后返回。


                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值