Android系統(tǒng)啟動(dòng)過(guò)程全解析(基于android11)

先說(shuō)總結(jié):
當(dāng)手機(jī)電源按下,引導(dǎo)芯片代碼會(huì)從Boot Rom開始執(zhí)行,加載引導(dǎo)程序BootLoader到RAM,然后執(zhí)行。
BootLoader會(huì)啟動(dòng)idle進(jìn)程(pid=0)。idle進(jìn)程主要是初始化進(jìn)程管理、內(nèi)存管理等。
然后idle進(jìn)程會(huì)啟動(dòng)init進(jìn)程(pid=1)和kthread進(jìn)程(pid=2)。init進(jìn)程作為用戶空間的鼻祖。
Init進(jìn)程先是解析init.rc文件,然后又會(huì)通過(guò)fork,去加載zygote進(jìn)程。zygote進(jìn)程是java進(jìn)程的鼻祖。
Zygote進(jìn)程首先會(huì)初始化我們的運(yùn)行時(shí)環(huán)境,也就是android runtime。因?yàn)樵趜ygote之前都是c、c++的運(yùn)行環(huán)境,沒(méi)有java的運(yùn)行時(shí)環(huán)境。
啟動(dòng)運(yùn)行時(shí)環(huán)境后,就進(jìn)入java了。然后zygote進(jìn)程又會(huì)通過(guò)fork,加載systemServer進(jìn)程。android用到的系統(tǒng)服務(wù)都是在SystemServer進(jìn)程中,有90多個(gè)服務(wù)。像AMS、PMS。

SystemServer啟動(dòng)后,就會(huì)啟動(dòng)我們的launcher app。啟動(dòng)launcher app時(shí),會(huì)發(fā)消息給zygote進(jìn)程,讓zygote進(jìn)程去啟動(dòng)一個(gè)進(jìn)程,啟動(dòng)進(jìn)程后,我們的app就會(huì)啟動(dòng)自己。

activity是如何啟動(dòng)的?
調(diào)用startActivity,通過(guò)一系列方法的調(diào)用,通過(guò)binder通信,進(jìn)入到systemServer進(jìn)程。binder拿的systemServer進(jìn)程中的AMS(10之前)/ATMS(10之后)服務(wù)。拿到服務(wù)的代理對(duì)象后,就會(huì)調(diào)用服務(wù)的startActivity,通過(guò)binder通信,進(jìn)入到systemServer進(jìn)程中。systemServer進(jìn)程,先判斷要啟動(dòng)的activity所需的進(jìn)程是否存在,如果不存在,就通過(guò)socket通信,通知給zygote進(jìn)程,創(chuàng)建一個(gè)新的進(jìn)程,然后在新進(jìn)程中通過(guò)反射啟動(dòng)ActivityThread.main()。執(zhí)行這個(gè)方法后,由于新的進(jìn)程需要被AMS/ATMS管理,所以新的進(jìn)程會(huì)把它的binder對(duì)象給到AMS/ATMS中去,AMS/ATMS就會(huì)持有新的進(jìn)程的binder對(duì)象,就可以去管理新的進(jìn)程,從而去管理它的生命周期。如果要啟動(dòng)的activity所需的進(jìn)程存在,那就不需要通知zygote,而是直接通過(guò)進(jìn)程的binder對(duì)象去啟動(dòng)activity。


我們的android系統(tǒng)是基于linux系統(tǒng)的,而在linux中,所有的進(jìn)程都是由init進(jìn)程直接或間接fork出來(lái)的。zygote也不例外。
在android系統(tǒng)中,zygote是一個(gè)進(jìn)程的名字。當(dāng)手機(jī)開機(jī)時(shí),linux系統(tǒng)內(nèi)核加載完成之后,就會(huì)啟動(dòng)init進(jìn)程。init進(jìn)程fork出zygote進(jìn)程。
SystemServer進(jìn)程也是由zygote進(jìn)程fork而來(lái)。

我們知道,每一個(gè)app都是一個(gè)單獨(dú)的dalvik虛擬機(jī),一個(gè)獨(dú)立的進(jìn)程。所以當(dāng)系統(tǒng)的第一個(gè)zygote進(jìn)程運(yùn)行之后,在這之后啟動(dòng)app,相當(dāng)于開啟了一個(gè)新的進(jìn)程。而為了實(shí)現(xiàn)資源的共享和更快的啟動(dòng)速度,android系統(tǒng)開啟新進(jìn)程的方式,是通過(guò)fork第一個(gè)zygote進(jìn)程實(shí)現(xiàn)的。所以說(shuō),除了第一個(gè)zygote進(jìn)程,其他應(yīng)用所有的進(jìn)程都是由zygote進(jìn)程的子進(jìn)程。

AndroidFramework里有兩大進(jìn)程:一個(gè)就是zygote進(jìn)程,另一個(gè)就是SystemServer進(jìn)程。

一、zygote進(jìn)程

init進(jìn)程啟動(dòng)zygote進(jìn)程,fork SystemServer進(jìn)程。

ZygoteInit 是 zygote 進(jìn)程的啟動(dòng)類。在zygote開啟的時(shí)候,會(huì)調(diào)用ZygoteInit.main()進(jìn)行初始化。并fork中SystemServer進(jìn)程。

public static void main(String[] argv) {
    ......
    try {
        ......
        // 在加載首個(gè)zygote的時(shí)候,會(huì)傳入初始化參數(shù),使得 startSystemServer = true
        boolean startSystemServer = false;
        String zygoteSocketName = "zygote";
        String abiList = null;
        boolean enableLazyPreload = false;
        for (int i = 1; i < argv.length; i++) {
            if ("start-system-server".equals(argv[i])) {
                // 首次加載,置為true
                startSystemServer = true;
            } else if ("--enable-lazy-preload".equals(argv[i])) {
                enableLazyPreload = true
            } else if (argv[i].startsWith(ABI_LIST_ARG)) {
                abiList = argv[i].substring(ABI_LIST_ARG.length());
            } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
                zygoteSocketName = argv[i].substring(SOCKET_NAME_ARG.length());
            } else {
                throw new RuntimeException("Unknown command line argument: " + argv[i]);
            }
        }
        ......
        // 開始fork我們的SystemServer進(jìn)程
        if (startSystemServer) {
            // forkSystemServer方法的返回值是要么是一個(gè)MethodAndArgsCaller對(duì)象,要是是null
            // 準(zhǔn)備參數(shù),fork出ystemServer
            Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
                
            --> ......
                // 請(qǐng)求fork SystemServer 進(jìn)程
                pid = Zygote.forkSystemServer(
                parsedArgs.mUid, parsedArgs.mGid,
                parsedArgs.mGids,
                parsedArgs.mRuntimeFlags, null, parsedArgs.mPermittedCapabilities,
                    parsedArgs.mEffectiveCapabilities);
                --> ......
                    // SystemServer的命令行參數(shù),這個(gè)就是SystemServer.main()的args參數(shù)。后面會(huì)通過(guò)反射調(diào)用SystemServer.main()
                    String[] args = {
                              "--setuid=1000",
                              "--setgid=1000",
                              "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                                          + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",
                              "--capabilities=" + capabilities + "," + capabilities,
                              "--nice-name=system_server",
                              "--runtime-args",
                              "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                              "com.android.server.SystemServer",
                      };
                    // 在native層fork SystemServer
                    int pid = nativeForkSystemServer(
                            uid, gid, gids, runtimeFlags, rlimits,
                            permittedCapabilities, effectiveCapabilities);
                    // 如果這是孩子,則為 0,如果這是父母,則為孩子的 pid,或者錯(cuò)誤時(shí)為 -1。
                    return pid;
                ......
                return handleSystemServerProcess(parsedArgs);
                --> return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion, parsedArgs.mDisabledCompatChanges, parsedArgs.mRemainingArgs, cl);
                        // 在applicationInit中會(huì)對(duì)args數(shù)組進(jìn)行解析,轉(zhuǎn)換成有用的Arguments對(duì)象
                    --> return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader);
                            // args.startClass = com.android.server.SystemServer
                        --> return findStaticMain(args.startClass, args.startArgs, classLoader);
                            --> ......
                                Method m;
                                try {
                                // 找到SystemServer.main(argv[]) 方法
                                m = cl.getMethod("main", new Class[] { String[].class });
                                ......
                                return new MethodAndArgsCaller(m, argv);
}

            // r == null,說(shuō)明在父(zygote)進(jìn)程中,r != null說(shuō)明在子(system_server)進(jìn)程中。
            if (r != null) {
                // 執(zhí)行的是MethodAndArgsCaller.run(),run方法內(nèi)部其實(shí)就是通過(guò)反射執(zhí)行SystemServer.main(argv[])
                r.run();
                return;
            }
            
            // 這里面是個(gè)while循環(huán),用來(lái)接收socket消息。后面介紹啟動(dòng)進(jìn)程會(huì)講到。
            caller = zygoteServer.runSelectLoop(abiList);
        }
       ......
       }
   ......
}

二、SystemServer進(jìn)程

1、啟動(dòng)SystemServer進(jìn)程,完成mSystemContext和ActivityThread的創(chuàng)建,初始化SystemServiceManager對(duì)象。

SystemServer.main():

public static void main(String[] args) {
    new SystemServer().run();
}

private void run() {
    ......
        // 加載本地系統(tǒng)服務(wù)庫(kù),并進(jìn)行初始化
        System.loadLibrary("android_servers");
        ......

        // 創(chuàng)建系統(tǒng)上下文
        createSystemContext();
            // 詳細(xì)看一下createSystemContext()
            // 初始化系統(tǒng)上下文對(duì)象mSystemContext,并設(shè)置默認(rèn)的主題。
            // mSystemContext實(shí)際上是一個(gè)ContextImpl對(duì)象。
        --> private void createSystemContext() {
              ActivityThread activityThread = ActivityThread.systemMain();
                  // 
              --> ActivityThread thread = new ActivityThread();
                  thread.attach(true, 0);
                  --> ContextImpl context = ContextImpl.createAppContext(this, getSystemContext().mPackageInfo);
                      // 創(chuàng)建了 Application對(duì)象,并調(diào)用了Application.onCreate()
                      mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                      mInitialApplication.onCreate();
                  return thread;
              mSystemContext = activityThread.getSystemContext();
              mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

              final Context systemUiContext = activityThread.getSystemUiContext();
              systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
            }

        // Call per-process mainline module initialization.
        ActivityThread.initializeMainlineModules();

        // 初始化SystemServiceManager對(duì)象,下面的系統(tǒng)服務(wù)開啟都需要調(diào)用SystemServiceManager.startService(Class<T>),這個(gè)方法通過(guò)反射來(lái)啟動(dòng)對(duì)應(yīng)的服務(wù)
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        ......
    // 啟動(dòng)服務(wù)。接下來(lái)我們?cè)敿?xì)看一下啟動(dòng)的服務(wù)。
    try {
        t.traceBegin("StartServices");
        startBootstrapServices(t); // 引導(dǎo)服務(wù):ATMS、AMS等
        startCoreServices(t); // 系統(tǒng)所需的核心服務(wù)
        startOtherServices(t); // 其他服務(wù):WMS等
    } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    } finally {
        t.traceEnd(); // StartServices
    }
    
  ......
}

2、啟動(dòng)系統(tǒng)服務(wù),ActivityManagerService、PackageManagerService、 WindowManagerService等。

系統(tǒng)里面重要的服務(wù)都是在這個(gè)進(jìn)程里面開啟的,比如 ActivityManagerService、PackageManagerService、 WindowManagerService等等。在SystemServer 進(jìn)程開啟的時(shí)候,會(huì)調(diào)用SystemServer.main(),初始化ActivityManagerService。

// 在這里開啟了幾個(gè)核心的服務(wù),因?yàn)檫@些服務(wù)之間相互依賴,所以都放 在了這個(gè)方法里面
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    ......
    // android10之后,增減了ATMS。用來(lái)單獨(dú)管理activity
    // 初始化ATMS
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();
    // 初始化AMS
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    mWindowManagerGlobalLock = atm.getGlobalLock();
    t.traceEnd();
    ......
    // 電源管理器需要盡早啟動(dòng),因?yàn)槠渌?wù)需要它。
    t.traceBegin("StartPowerManager");
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    t.traceEnd();
    ......
    // 現(xiàn)在電源管理已經(jīng)開啟,ActivityManagerService負(fù)責(zé)電源管理功能
    t.traceBegin("InitPowerManagement");
    mActivityManagerService.initPowerManagement();
    t.traceEnd();
    ......
    // 初始化DisplayManagerService
    t.traceBegin("StartDisplayManager");
    mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
    t.traceEnd();
    ......
    // 初始化PackageManagerService
    t.traceBegin("StartPackageManagerService");
    try {
        Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
              domainVerificationService, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    } finally {
        Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
    }
    ......
}
2.1 ATMS的創(chuàng)建:

mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService().

先看mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class):

mSystemServiceManager.startService() @SystemServer
    // 通過(guò)反射獲取服務(wù)
--> final String name = serviceClass.getName(); @SystemServiceManager
    final T service;
    Constructor<T> constructor = serviceClass.getConstructor(Context.class);
    service = constructor.newInstance(mContext);
    startService(service);
    // 返回的service是T泛型,繼承自SystemService
    return service;
    --> mServices.add(service);
        // 啟動(dòng)服務(wù)
        service.onStart();

根據(jù)上面分析,ActivityTaskManagerService.Lifecycle繼承自SystemService,mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class)最后是調(diào)用了ActivityTaskManagerService.Lifecycle.onStart()。

那再來(lái)看ActivityTaskManagerService.Lifecycle:

public Lifecycle(Context context) {
    super(context);
    // ActivityTaskManagerService.Lifecycle構(gòu)造中初始化了mService。就是ATMS
    mService = new ActivityTaskManagerService(context);
}

public void onStart() {
    // 將 ATMS 加入到ServiceManager中
    publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
        // 注冊(cè) Binder 服務(wù)。
    --> ServiceManager.addService(name, service, allowIsolated, dumpPriority); @SystemService
        --> getIServiceManager().addService(name, service, allowIsolated, dumpPriority); @ServiceManager
    // 調(diào)用 ATMS 的start()方法。
    mService.start();
}

public ActivityTaskManagerService getService() {
    // 將 ATMS 對(duì)象返回
    return mService;
}

接下來(lái)我們看下ActivityTaskManagerService構(gòu)造方法中做了什么:

public ActivityTaskManagerService(Context context) {
        mContext = context;
        mFactoryTest = FactoryTest.getMode();
        mSystemThread = ActivityThread.currentActivityThread();
        mUiContext = mSystemThread.getSystemUiContext();
        mLifecycleManager = new ClientLifecycleManager(); // 管理生命周期
        mInternal = new LocalService();
        GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
        mWindowOrganizerController = new WindowOrganizerController(this);
        mTaskOrganizerController = mWindowOrganizerController.mTaskOrganizerController;
    }

ActivityServer進(jìn)程創(chuàng)建了SystemServiceManager,然后SystemServiceManager來(lái)啟動(dòng)各種服務(wù),并將對(duì)應(yīng)的服務(wù)添加到SystemService中。

2.2 AMS的創(chuàng)建:

mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);

ActivityManagerService中同樣有一個(gè)Lifecycle

public Lifecycle(Context context) {
    super(context);
    // ActivityManagerService.Lifecycle構(gòu)造中初始化了mService。就是AMS
    mService = new ActivityManagerService(context, sAtm);
}
        
public static ActivityManagerService startService(
    SystemServiceManager ssm, ActivityTaskManagerService atm) {
    sAtm = atm; // atm就是 ATMS 
    // 還是由SystemServiceManager啟動(dòng)服務(wù)
    return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
}

public ActivityManagerService getService() {
    return mService;
}

接下來(lái)我們看下ActivityManagerService構(gòu)造方法中做了什么:

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
        ······
        // 廣播的管理
        final BroadcastConstants foreConstants = new BroadcastConstants(
                Settings.Global.BROADCAST_FG_CONSTANTS);
        foreConstants.TIMEOUT = BROADCAST_FG_TIMEOUT;

        final BroadcastConstants backConstants = new BroadcastConstants(
                Settings.Global.BROADCAST_BG_CONSTANTS);
        backConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;

        final BroadcastConstants offloadConstants = new BroadcastConstants(
                Settings.Global.BROADCAST_OFFLOAD_CONSTANTS);
        offloadConstants.TIMEOUT = BROADCAST_BG_TIMEOUT;
        // by default, no "slow" policy in this queue
        offloadConstants.SLOW_TIME = Integer.MAX_VALUE;

        mEnableOffloadQueue = SystemProperties.getBoolean(
                "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);

        mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "foreground", foreConstants, false);
        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "background", backConstants, true);
        mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler,
                "offload", offloadConstants, true);
        // 三種廣播形式
        mBroadcastQueues[0] = mFgBroadcastQueue;
        mBroadcastQueues[1] = mBgBroadcastQueue;
        mBroadcastQueues[2] = mOffloadBroadcastQueue;

        // Services的管理
        mServices = new ActiveServices(this);
        ......
        // 電量狀態(tài)的管理
        // TODO: Move creation of battery stats service outside of activity manager service.
        mBatteryStatsService = new BatteryStatsService(systemContext, systemDir,
                BackgroundThread.get().getHandler());
        mBatteryStatsService.getActiveStatistics().readLocked();
        mBatteryStatsService.scheduleWriteToDisk();
        mOnBattery = DEBUG_POWER ? true
                : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
        mBatteryStatsService.getActiveStatistics().setCallback(this);
        mOomAdjProfiler.batteryPowerChanged(mOnBattery);
        
        // 進(jìn)程狀態(tài)的管理
        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
        mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);

        mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
        mUserController = new UserController(this);
        mPendingIntentController = new PendingIntentController(
                mHandlerThread.getLooper(), mUserController, mConstants);

        if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
            mUseFifoUiScheduling = true;
        }

        mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
        mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);

        // mActivityTaskManager就是 ATMS
        mActivityTaskManager = atm;
        // ATMS進(jìn)行初始化,下面我們看下ATMS初始化中干了什么
        mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController,
                DisplayThread.get().getLooper());
        // 獲取ATMInternal,后面會(huì)講到。先有個(gè)印象
        mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);

        ......
        mInternal = new LocalService();
        mPendingStartActivityUids = new PendingStartActivityUids(mContext);
    }

mActivityTaskManager.initialize():

public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
            Looper looper) {
        mH = new H(looper);
        mUiHandler = new UiHandler();
        mIntentFirewall = intentFirewall;
        final File systemDir = SystemServiceManager.ensureSystemDir();
        mAppWarnings = createAppWarnings(mUiContext, mH, mUiHandler, systemDir);
        mCompatModePackages = new CompatModePackages(this, systemDir, mH);
        mPendingIntentController = intentController;
        // 創(chuàng)建ActivityStackSupervisor
        mStackSupervisor = createStackSupervisor();

        mTaskChangeNotificationController =
                new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
        mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
        // 控制activity的啟動(dòng),這個(gè)后面還會(huì)講到
        mActivityStartController = new ActivityStartController(this);
        // 最近使用的app
        setRecentTasks(new RecentTasks(this, mStackSupervisor));
        mVrController = new VrController(mGlobalLock);
        mKeyguardController = mStackSupervisor.getKeyguardController();
    }

經(jīng)過(guò)上面這些步驟,我們的ActivityManagerService對(duì)象已經(jīng)創(chuàng)建好了,并且完成了成員變量的初始化。而且在這之前,調(diào)用createSystemContext()創(chuàng)建上下文的時(shí)候,也已經(jīng)完成了mSystemContext和ActivityThread的創(chuàng)建。注意,這是系統(tǒng)進(jìn)程開啟時(shí)的流程。在這之后,會(huì)開啟系統(tǒng)的Launcher程序,完成系統(tǒng)界面的加載與顯示。

2.3 WMS的創(chuàng)建和綁定
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    t.traceBegin("startOtherServices");
    ......
    WindowManagerService wm = null;
    ......
    t.traceBegin("StartWindowManagerService");
    
    // WMS 需要準(zhǔn)備好傳感器服務(wù)
    ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart, START_SENSOR_SERVICE);
    mSensorServiceStart = null;
    wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
            new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
    ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
            DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
            /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
    t.traceEnd();

    t.traceBegin("SetWindowManagerService");
    // AMS 綁定 WMS
    mActivityManagerService.setWindowManager(wm);
    t.traceEnd();

    t.traceBegin("WindowManagerServiceOnInitReady");
    wm.onInitReady();
    t.traceEnd();  
    ......
    
    // 啟動(dòng) Launcher
    mActivityManagerService.systemReady(() -> {
          ······
          // 啟動(dòng) SystemUi
          startSystemUi(context, windowManagerF);
          ......
        }, t);
}

WindowManagerService.main():

public static WindowManagerService main(final Context context, final InputManagerService im,
            final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
            ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,
            Supplier<Surface> surfaceFactory,
            Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
     DisplayThread.getHandler().runWithScissors(() ->
            // 創(chuàng)建WindowManagerService對(duì)象
            sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy,
                  atm, transactionFactory, surfaceFactory, surfaceControlFactory), 0);
     return sInstance;
}

3、Launcher進(jìn)程的啟動(dòng)

mActivityManagerService.systemReady()
    // mAtmInternal還記得是什么嗎?在AMS的構(gòu)造方法中獲取的。就是ActivityTaskManagerInternal。   
    // ActivityTaskManagerInternal是個(gè)抽象類,ATMS實(shí)現(xiàn)了它。
    // 所以我們進(jìn)入到ATMS中看resumeTopActivities()方法
--> mAtmInternal.resumeTopActivities(false /* scheduleIdle */); @ActivityManagerService
    --> mRootWindowContainer.resumeFocusedStacksTopActivities(); @ActivityTaskServiceManager
            // 這邊分成兩步走,但最后都是調(diào)用的 resumeHomeActivity()
        --> if (focusedStack != null) { @RootWindowContainer
              // 會(huì)執(zhí)行這個(gè)...
              result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
                  // 關(guān)鍵方法:resumeTopActivityInnerLocked()
              --> result = resumeTopActivityInnerLocked(prev, options); @ActivityStack
                  --> return resumeNextFocusableActivityWhenStackIsEmpty(prev, options);
                      --> return mRootWindowContainer.resumeHomeActivity(prev, reason, getDisplayArea());
            } else if (targetStack == null) {
              result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
                            display.getDefaultTaskDisplayArea());
            }

接下來(lái)重點(diǎn)看下RootWindowContainer.resumeHomeActivity(prev, reason, getDisplayArea());

RootWindowContainer.resumeHomeActivity(prev, reason, getDisplayArea());
--> return startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea,
                false /* allowInstrumenting */, false /* fromHomeKey */);
        // mService就是 ATMS。在創(chuàng)建AMS的時(shí)候,初始化ATMS的方法中,new出來(lái)一個(gè)ActivityStartController,用來(lái)控制activity的啟動(dòng)。
        // 這里獲取到ActivityStartController,去啟動(dòng)HomeActivity。這個(gè)方法很重要。。。。
    --> mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
                taskDisplayArea);
             // obtainStarter返回的是ActivityStarter對(duì)象,經(jīng)過(guò)一系列設(shè)置,最后執(zhí)行的是ActivityStarter.execute()
             // ActivityStarter.execute()非常關(guān)鍵?。。≈攸c(diǎn)?。。「鷹5墓芾硐嚓P(guān)
        -->  mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason)
                .setOutActivity(tmpOutRecord)
                .setCallingUid(0)
                .setActivityInfo(aInfo)
                .setActivityOptions(options.toBundle())
                .execute(); @ActivityStartController
                

上面執(zhí)行到 ActivityStarter.execute(),這個(gè)方法很關(guān)鍵。我們接下來(lái)看這個(gè)方法。

ActivityStarter.execute()
--> res = executeRequest(mRequest);
    --> ActivityRecord sourceRecord = null; // 啟動(dòng)方
        ActivityRecord resultRecord = null; // 將要啟動(dòng)的
        ......
        mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
                request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
                restrictedBgActivity, intentGrants);
        --> result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
            --> mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, mStartActivity, mOptions);
                --> result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);@RootWindowContainer
                        // 這個(gè)方法就非常關(guān)鍵了。。。
                    --> result = resumeTopActivityInnerLocked(prev, options);@ActivityStack
                            // 這個(gè)相當(dāng)重要。。。下面著重看。。。
                        --> mStackSupervisor.startSpecificActivity(next, true, true);

ActivityStackSupervisor.startSpecificActivity()。這個(gè)方法非常非常重要?。?!要記住?。?!

    void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
        // 判斷要啟動(dòng)的activity的application是否已經(jīng)在運(yùn)行中?
        // Is this activity's application already running?
        final WindowProcessController wpc =
                mService.getProcessController(r.processName, r.info.applicationInfo.uid);

        boolean knownToBeDead = false;
        // 進(jìn)程已經(jīng)存在
        if (wpc != null && wpc.hasThread()) {
            try {
                // 真正的去啟動(dòng)Activity
                realStartActivityLocked(r, wpc, andResume, checkConfig);
                return;
            } catch (RemoteException e) {
                Slog.w(TAG, "Exception when starting activity "
                        + r.intent.getComponent().flattenToShortString(), e);
            }

            // If a dead object exception was thrown -- fall through to
            // restart the application.
            knownToBeDead = true;
        }

        r.notifyUnknownVisibilityLaunchedForKeyguardTransition();

        final boolean isTop = andResume && r.isTopRunningActivity();
        // 如果進(jìn)程還不存在,就在這里去啟動(dòng)app的進(jìn)程。。。mService是ATMS.
        mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
    }
3.1 AMS創(chuàng)建socket去通知zygote,創(chuàng)建Launcher進(jìn)程
ActivityTaskManagerService.startProcessAsync();
    // ActivityManagerInternal::startProcess,代表調(diào)用的是ActivityManagerService.startProcess()。
--> final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
                    mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
                    isTop, hostingType, activity.intent.getComponent()); @ActivityTaskManagerService
    --> ActivityManagerService.startProcess()
            // 只關(guān)注方法的調(diào)用,參數(shù)太多,可以不看。下面的參數(shù)都省略
        --> startProcessLocked();
             --> return mProcessList.startProcessLocked();
                --> final Process.ProcessStartResult startResult = startProcess();@ProcessList
                    --> startResult = Process.start();
                        --> return ZYGOTE_PROCESS.start();
                            --> return startViaZygote();@ZygoteProcess
                                --> ......
                                    // args配置的參數(shù)
                                    argsForZygote.add("--runtime-args");
                                    argsForZygote.add("--setuid=" + uid);
                                    argsForZygote.add("--setgid=" + gid);
                                    ......
                                    // openZygoteSocketIfNeeded(),打開Zygote的Socket
                                    return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
                                              zygotePolicyFlags,
                                              argsForZygote);     

創(chuàng)建socket與zygote的socke連接

ZygoteProcess.openZygoteSocketIfNeeded(String abi) 
    // 與zygote的socke創(chuàng)建連接
--> attemptConnectionToPrimaryZygote();
    --> primaryZygoteState = ZygoteState.connect(mZygoteSocketAddress, mUsapPoolSocketAddress);

socket通知zygote

ZygoteProcess.zygoteSendArgsAndGetResult()
--> return attemptZygoteSendArgsAndGetResult(zygoteState, msgStr);
        // socket 操作
    --> final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
        final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;

        zygoteWriter.write(msgStr);
        zygoteWriter.flush();
3.2 zygote收到socket通知后,創(chuàng)建Launcher進(jìn)程

還記得上面有提過(guò)在zygote進(jìn)程中有個(gè)死循環(huán),用來(lái)接收socket消息的么?

ZygoteInit.main()
--> caller = zygoteServer.runSelectLoop(abiList);
    --> ......
        while (true) {
            ......
            // 進(jìn)行等待
            pollReturnValue = Os.poll(pollFDs, pollTimeoutMs);
            ......
            // 有socket消息時(shí),進(jìn)行處理
            ZygoteConnection connection = peers.get(pollIndex);
            final Runnable command = connection.processOneCommand(this);
                // 創(chuàng)建pid。關(guān)注方法,參數(shù)不重要,省略
            --> pid = Zygote.forkAndSpecialize();
                // 反射調(diào)用ActivityThread.main()
            --> return handleChildProc(parsedArgs, childPipeFd, parsedArgs.mStartChildZygote);

反射調(diào)用了ActivityThread.main()

ActivityThread.main()
--> ActivityThread thread = new ActivityThread();
    thread.attach(false, startSeq);
    // 把應(yīng)用的句柄發(fā)給AMS,讓AMS進(jìn)行統(tǒng)一管理。句柄就是ApplicationThread,
    --> mgr.attachApplication(mAppThread, startSeq);
        --> attachApplicationLocked(thread, callingPid, callingUid, startSeq);@ActivityManagerService
                // 關(guān)注方法,參數(shù)不重要,省略
            --> thread.bindApplication();
                ......
                didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
                --> return mRootWindowContainer.attachApplication(wpc);
                        // RootWindowContainer::startActivityForAttachedApplicationIfNeeded
                    --> final PooledFunction c = PooledLambda.obtainFunction(
                    RootWindowContainer::startActivityForAttachedApplicationIfNeeded, this,
                    PooledLambda.__(ActivityRecord.class), app, stack.topRunningActivity());
                            // 還記得前面有區(qū)分進(jìn)程是否存在的地方嗎?不管進(jìn)程存不存在,最后啟動(dòng)activity都是調(diào)用的是StackSupervisor.realStartActivityLocked()
                        --> mStackSupervisor.realStartActivityLocked(r, app, top == r /*andResume*/, true /*checkConfig*/)
3.3 zygote進(jìn)程啟動(dòng)launcher進(jìn)程
ActivityStackSupervisor.realStartActivityLocked()
    // 添加callBack。關(guān)注方法,參數(shù)省略。后面會(huì)用到。。。
--> clientTransaction.addCallback(LaunchActivityItem.obtain(......);
    ......
    // ActivityTaskManagerService.getLifecycleManager() = ClientLifecycleManager
    mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    --> transaction.schedule();
            // mClient是IApplicationThread的實(shí)例,也就是ActivityThread對(duì)象。
        --> mClient.scheduleTransaction(this);
                // 調(diào)用ActivityThread父類ClientTransactionHandler的scheduleTransaction()方法。
            --> ActivityThread.this.scheduleTransaction(transaction);@ActivityThread
                    // 又調(diào)用ActivityThread的sendMessage()方法,發(fā)送EXECUTE_TRANSACTION消息
                --> sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
                    --> mH.sendMessage(msg);

接收EXECUTE_TRANSACTION消息

case EXECUTE_TRANSACTION:
     final ClientTransaction transaction = (ClientTransaction) msg.obj;
     mTransactionExecutor.execute(transaction);
     --> executeCallbacks(transaction);@TransactionExecutor
             // 
          --> for (int i = 0; i < size; ++i) {
                 final ClientTransactionItem item = callbacks.get(i);
                 ......
                 // 這里的item就是上面添加的LaunchActivityItem。
                 item.execute(mTransactionHandler, token, mPendingActions);
                 --> ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, mPendingResults, mPendingNewIntents, mIsForward, mProfilerInfo, client, mAssistToken, mFixedRotationAdjustments);
                     // ActivityThread.handleLaunchActivity()
                     client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
                     --> final Activity a = performLaunchActivity(r, customIntent);@ActivityThread
                         --> java.lang.ClassLoader cl = appContext.getClassLoader();
                             // 反射創(chuàng)建activity
                             activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
                             ......
                             // 調(diào)用activity的oncreate方法
                             if (r.isPersistable()) {
                                 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                             } else {
                                 mInstrumentation.callActivityOnCreate(activity, r.state);
                             }
                 ......
              }
        
     ...... 
 break;

經(jīng)過(guò)上面一系列調(diào)用,最終調(diào)用了mInstrumentation.callActivityOnCreate(activity, r.state)。后面的流程就和app的啟動(dòng)流程一樣了,后面一起分析。

為什么說(shuō)AMS是服務(wù)端對(duì)象呢?那就要說(shuō)到android系統(tǒng)里的服務(wù)器和客戶端的概念。
其實(shí)服務(wù)器客戶端的概念不僅僅存在于web開發(fā)中,在android的框架設(shè)計(jì)中,使用的也是這一種模式。服務(wù)器端指的就是所有app共用的系統(tǒng)服務(wù),比如我們這里提到的ActivityManagerService,和前面提到的PackageManagerService、WindowManagerService等等,這些基礎(chǔ)的系統(tǒng)服務(wù)是被所有app共用的,當(dāng)某個(gè)app想實(shí)現(xiàn)某個(gè)操作的時(shí)候,要告訴這些系統(tǒng)服務(wù),比如你想要打開一個(gè)app,那么我們知道了包名和MainActivity類名之后就可以打開。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);

但是,我們的app通過(guò)調(diào)用startActivity()并不能直接打開另一個(gè)app,這個(gè)方法會(huì)通過(guò)一系列的調(diào)用,最后還是告訴AMS說(shuō):我要打開這個(gè)app,我知道它的地址和名字,你幫我打開吧!所以是AMS來(lái)通知zygote進(jìn)程來(lái)fork一個(gè)新進(jìn)程,來(lái)開啟我們的目標(biāo)app的。這就像是瀏覽器想要打開一個(gè)超鏈接,瀏覽器把網(wǎng)址發(fā)送給服務(wù)器,然后由服務(wù)器把需要的資源文件發(fā)送給客戶端。

知道了Android Framework的客戶端服務(wù)器架構(gòu)后,我們還需要了解一件事,就是我們的app和AMS(SystemServer進(jìn)程),還有zygote進(jìn)程分屬于三個(gè)獨(dú)立的進(jìn)程,那它們之間是怎么通信的呢?
app和AMS(SystemServer進(jìn)程)通過(guò) Binder 進(jìn)行IPC通信,AMS和zygote通過(guò) Socket 進(jìn)行IPC通信。

那么AMS有什么用呢?在前面我們知道了,如果想要打開一個(gè)app的話,需要AMS去通知zygote進(jìn)程,除此之外,其實(shí)所有的Activity的開啟、暫停、關(guān)閉都需要AMS來(lái)控制。所以我們說(shuō)AMS控制系統(tǒng)中所有Activity的生命周期。

在andorid系統(tǒng)中,任何一個(gè)activity的啟動(dòng)都是由AMS和應(yīng)用程序進(jìn)程(只要是ActivityThread)相互配合來(lái)完成的。AMS服務(wù)統(tǒng)一調(diào)度系統(tǒng)中所有進(jìn)程的Activity啟動(dòng),而每個(gè)Activity的啟動(dòng)過(guò)程則由其所屬的進(jìn)程具體來(lái)完成。

后面專門介紹下AMS與ActivityThread是如何通力合作一起控制Activiy的生命周期。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容