Android 源碼解讀-應(yīng)用是如何啟動(dòng)的

作者:Android帥次

前言

作為多年的 Android 開發(fā),寫了不少應(yīng)用,但是一個(gè)App到底是怎么啟動(dòng)起來的?你要說桌面點(diǎn)一下就啟動(dòng)了,那也對(duì)。但是它的啟動(dòng)過程呢?帶著這樣的疑問,咱們來一步步學(xué)習(xí)。

Android 啟動(dòng)過程

一般在任何平臺(tái)上,都會(huì)逐步加載和執(zhí)行以下組件:

  • Boot loader
  • U-boot (optional)
  • Kernel
  • Android

Android進(jìn)程有以下順序:

  • Init
  • Zygote
  • System Server
  • Service Manager
  • Other Daemons and processes
  • Applications

具體情況如下圖,這兩幅圖結(jié)合起來比較有意思:

  • Boot ROM:當(dāng)電源按下時(shí),引導(dǎo)芯片代碼會(huì)從預(yù)定義的地方(固化在ROM)開始執(zhí)行,加載引導(dǎo)程序BootLoader到RAM,然后執(zhí)行。(這一步由"芯片廠商"負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))

  • Boot loader:Bootloader開始執(zhí)行,首先負(fù)責(zé)完成硬件的初始化,引導(dǎo)操作系統(tǒng)啟動(dòng)。(這一步由"設(shè)備廠商"負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))

  • Kernel:Linux 內(nèi)核是 Android 的核心,負(fù)責(zé)進(jìn)程創(chuàng)建、進(jìn)程間通信、設(shè)備驅(qū)動(dòng)程序、文件系統(tǒng)管理等。 Android 在主流內(nèi)核上應(yīng)用自定義補(bǔ)丁來支持 Android 運(yùn)行所需的某些功能,如喚醒鎖等。內(nèi)核可以作為未壓縮圖像或壓縮圖像加載。在加載時(shí),它掛載根文件系統(tǒng)(通常作為內(nèi)核命令行參數(shù)傳遞)并啟動(dòng)用戶空間中的第一個(gè)應(yīng)用程序。(這一步則是Android內(nèi)核開發(fā)過程中需要涉及的地方)

  • Android:Android系統(tǒng)以及各大Linux的發(fā)行版,他們的Linux內(nèi)核部分啟動(dòng)過程都是差不多的,他們之間最大的區(qū)別就在于init程序的不同,因?yàn)閕nit程序決定了系統(tǒng)在啟動(dòng)過程中,究竟會(huì)啟動(dòng)哪些守護(hù)進(jìn)程和服務(wù),以及呈現(xiàn)出怎樣的一個(gè)用戶UI界面。

因此,init程序是分析Android啟動(dòng)過程中最核心的程序。

  • init 和 init.rc:?jiǎn)?dòng)內(nèi)核時(shí)執(zhí)行的第一個(gè)用戶空間應(yīng)用程序是位于根文件夾中的 init 可執(zhí)行文件。該進(jìn)程解析稱為"init.rc"腳本的啟動(dòng)腳本。這是用一種專為 android 設(shè)計(jì)的語(yǔ)言編寫的,用于啟動(dòng)所有必要的進(jìn)程、守護(hù)程序和服務(wù),以便 android 正常運(yùn)行。它提供了各種類型的執(zhí)行時(shí)間,例如 early-init、on-boot、on-post-fs 等。(用戶空間的鼻祖)

  • Demons and Services:init 進(jìn)程創(chuàng)建了各種守護(hù)進(jìn)程和進(jìn)程,如 rild、vold、mediaserver、adb 等,每個(gè)進(jìn)程負(fù)責(zé)自己的功能。這些進(jìn)程的描述不在本文的范圍內(nèi)。相反,我們將更多地討論"Zygote"進(jìn)程。

  • Service Manager:Service Manager進(jìn)程 管理系統(tǒng)中運(yùn)行的所有Service。創(chuàng)建的每個(gè)服務(wù)都會(huì)在此進(jìn)程中注冊(cè)自己,并且此信息供其他進(jìn)程/應(yīng)用程序?qū)韰⒖肌?/p>

  • Zygote:Zygote 是啟動(dòng)時(shí)創(chuàng)建的第一個(gè) init 進(jìn)程之一。術(shù)語(yǔ)"合子"是基于生物學(xué)"形成的初始細(xì)胞分裂產(chǎn)生后代"。類似地,"zygote in android"初始化 Dalivik VM(ART) 和 fork 以創(chuàng)建多個(gè)實(shí)例來支持每個(gè) android 進(jìn)程。它有助于在 VM 實(shí)例之間使用共享代碼,從而減少內(nèi)存占用和加載時(shí)間,非常適合嵌入式系統(tǒng)。Zygote 除了在服務(wù)器套接字上安裝偵聽器外,還預(yù)加載了稍后在 Android 應(yīng)用程序中使用的類和資源。完成后,系統(tǒng)服務(wù)器啟動(dòng)。

  • System Server:SystemServer 進(jìn)程啟動(dòng) Android 中可用的所有服務(wù)。

本文咱們重點(diǎn)從 init 開始到應(yīng)用啟動(dòng)。

1、Zygote是什么

在Android系統(tǒng)里面,zygote是一個(gè)進(jìn)程的名字。Android是基于Linux System的,當(dāng)你的手機(jī)開機(jī)的時(shí)候,Linux的內(nèi)核加載完成之后就會(huì)啟動(dòng)一個(gè)叫"init"的進(jìn)程。在Linux System里面,所有的進(jìn)程都是由init進(jìn)程fork出來的,我們的zygote進(jìn)程也不例外。

Zygote是一個(gè)虛擬機(jī)進(jìn)程,同時(shí)也是一個(gè)虛擬機(jī)實(shí)例的孵化器,每當(dāng)系統(tǒng)要求執(zhí)行一個(gè)Android應(yīng)用程序,Zygote就會(huì)fork(分裂)出一個(gè)子進(jìn)程來執(zhí)行該應(yīng)用程序。

1.1 app_main.cpp

frameworks/base/cmds/app_process/app_main.cpp

在Zygote啟動(dòng)后就會(huì)執(zhí)行 app_main.cpp。不管是C/c++/java,他們的入口就是 main(),就跟看到 Activity 咱們直接找 onCreate() 方法一樣。

1.1.1 main()

int main(int argc, char* const argv[])
{
    ...
    //注釋1:初始化AppRuntime(AndroidRunTime)
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    ...
    // Parse runtime arguments.  Stop at first unrecognized option.
    bool zygote = false;
    bool startSystemServer = false;
    bool application = false;
    String8 niceName;
    String8 className;

    ++i;  // Skip unused "parent dir" argument.
    while (i < argc) {
        const char* arg = argv[i++];
        //注釋2:設(shè)置zygote模式
        if (strcmp(arg, "--zygote") == 0) {
            zygote = true;
            niceName = ZYGOTE_NICE_NAME;
        } 
        ...
    }
    Vector<String8> args;
    if (!className.isEmpty()) {
        ...
    } else {
        // 我們處于 zygote 模式。
        maybeCreateDalvikCache();

        // 注釋3:在 zygote 模式下,將參數(shù)傳遞給 ZygoteInit.main() 方法。
        if (startSystemServer) {
            args.add(String8("start-system-server"));
        }

        //PROP_VALUE_MAX = 92;
        char prop[PROP_VALUE_MAX];
        ...
        String8 abiFlag("--abi-list=");
        abiFlag.append(prop);
        args.add(abiFlag);

        for (; i < argc; ++i) {
            args.add(String8(argv[i]));
        }
    }    
    if (zygote) {
        //注釋4:調(diào)用 AndroidRuntime.start() 方法
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        ...
    } else {
        ...
    }
}

注釋1:初始化 AppRuntime ,其實(shí)就是 AndroidRuntime(ART)。

注釋2:設(shè)置zygote模式。

注釋3:將參數(shù)傳遞給 ZygoteInit.main() 方法。

注釋4:?jiǎn)?dòng) ZygoteInit 。這里的 ZygoteInit 就是 zygote 進(jìn)程的啟動(dòng)類。這個(gè)下面講到。咱們先看看AndroidRuntime 的 start() 方法。

1.2 AndroidRuntime.cpp

frameworks/base/core/jni/AndroidRuntime.cpp

Android 虛擬機(jī)

1.2.1 start()

/*
 * Start the Android runtime.  This involves starting the virtual machine and calling the "static void main(String[] args)" method in the class named by "className".
 *
 * Passes the main function two arguments, the class name and the specified
 * options string.
 */
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    ...
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    //注釋1:啟動(dòng)虛擬機(jī)
    if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) {
        return;
    }
    onVmCreated(env);

    //注釋2:注冊(cè)安卓功能(JNI)
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }
    ...
    strArray = env->NewObjectArray(options.size() + 1, stringClass, NULL);
    ...
    /*
     * 啟動(dòng)虛擬機(jī)。 該線程成為VM的主線程,直到VM退出才會(huì)返回。
     */
    char* slashClassName = toSlashClassName(className != NULL ? className : "");
    jclass startClass = env->FindClass(slashClassName);
    if (startClass == NULL) {
        ...
    } else {
        ...
        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
            "([Ljava/lang/String;)V");
        if (startMeth == NULL) {
            ...
        } else {
            //注釋3
            env->CallStaticVoidMethod(startClass, startMeth, strArray);
            if (env->ExceptionCheck())
                threadExitUncaughtException(env);
        }
    }
    ...
}

注釋1:?jiǎn)?dòng)VM(虛擬機(jī))

注釋2:注冊(cè)安卓功能(JNI)

注釋3:便用JNI調(diào)用 Zygotelnit 的 main() 方法。這里的 Zygotelnit 是class文件,也就是說從這里開始就進(jìn)入java領(lǐng)域嘍。

JNI:連接 native(C/C++) 層 和 java 層的橋梁。

1.3 ZygoteInit.java

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

/**
 * zygote 進(jìn)程的啟動(dòng)類。
 */
public class ZygoteInit {
    ...
}

這是 Zygote 進(jìn)程的入口點(diǎn)。 它創(chuàng)建 Zygote 服務(wù),加載資源,并處理與準(zhǔn)備分叉到應(yīng)用程序的過程相關(guān)的其他任務(wù)。

1.3.1 main()

    @UnsupportedAppUsage
    public static void main(String[] argv) {
        ZygoteServer zygoteServer = null;

        try {
            ...
            boolean startSystemServer = false;
            //argv:用于指定 Zygote 配置的命令行參數(shù)。
            ...
            if (!enableLazyPreload) {
                //注釋1:預(yù)加載資源。
                preload(bootTimingsTraceLog);
                EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
                        SystemClock.uptimeMillis());
                bootTimingsTraceLog.traceEnd(); // ZygotePreload
            }
            ...
            //注釋2:創(chuàng)建Zygote 的 LocalServerSocket 。
            zygoteServer = new ZygoteServer(isPrimaryZygote);

            if (startSystemServer) {
                //注釋3:開始fork我們的SystemServer進(jìn)程。
                Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
                ...
            }
            ...
            // 注釋4:zygote 永久循環(huán)。
            caller = zygoteServer.runSelectLoop(abiList);            
        } catch (Throwable ex) {
            ...
        } finally {
            if (zygoteServer != null) {
                zygoteServer.closeServerSocket();
            }
        }
        ...
    }

注釋1:預(yù)加載資源。

注釋2:創(chuàng)建Zygote 的 LocalServerSocket 。

注釋3:開始 fork 我們的 SystemServer 進(jìn)程。

注釋4:zygote 永久循環(huán)。

這里咱們看看 forkSystemServer() ;

1.3.2 forkSystemServer()

    /**
     * Prepare the arguments and forks for the system server process.
     *
     * @return A {@code Runnable} that provides an entrypoint into system_server code in the child
     * process; {@code null} in the parent.
     */
    private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {
        ...
        //命令行來啟動(dòng)SystemServer
        //ZygoteInit.main(String argv[])里面的argv 跟這個(gè)類似
        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",
        };
        //處理與 zygote spawner 相關(guān)的 args 的參數(shù)解析。
        ZygoteArguments parsedArgs;
        int pid;
        try {
            ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args);
            try {
                parsedArgs = ZygoteArguments.getInstance(commandBuffer);
            } catch (EOFException e) {
                throw new AssertionError("Unexpected argument error for forking system server", e);
            }
            commandBuffer.close();
            ...

            //請(qǐng)求 fork 系統(tǒng)服務(wù)器進(jìn)程
            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.mUid, parsedArgs.mGid,
                    parsedArgs.mGids,
                    parsedArgs.mRuntimeFlags,
                    null,
                    parsedArgs.mPermittedCapabilities,
                    parsedArgs.mEffectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

這里啟動(dòng)了一個(gè) system server 。下面咱們就看看他。

2、SystemServer

system server 也就是 SystemServer。SystemServer也是一個(gè)進(jìn)程,包括ActivityTaskManagerService、ActivityManagerService、PackageManagerService、WindowManagerService等92種服務(wù)。

Android Framework里面兩大非常重要的進(jìn)程:

  • SystemServer進(jìn)程。

  • Zygote進(jìn)程。

2.1 SystemServer.java

frameworks/base/services/java/com/android/server/SystemServer.java

public final class SystemServer {
    ...
}

2.1.1 main()

    /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }
    public SystemServer() {
        // Check for factory test mode.
        mFactoryTestMode = FactoryTest.getMode();
        ...
    }    

下面 咱們看看 run () 里面都用什么?

2.1.2 run()

    private void run() {
        try {
            ...
            // 注釋1:加載動(dòng)態(tài)庫(kù)libandroid_service.so。
            System.loadLibrary("android_servers");

            // 注釋2:創(chuàng)建系統(tǒng)上下文。
            createSystemContext();

            // 調(diào)用每個(gè)進(jìn)程的主線模塊初始化。
            ActivityThread.initializeMainlineModules();

            // 注釋3:創(chuàng)建 SystemServiceManager。
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // 為可并行化的 init 任務(wù)準(zhǔn)備線程池
            SystemServerInitThreadPool.start();
            ...
        } finally {

        }
        // 注釋4:Start services。
        try {
            //下面咱們看看這個(gè)三個(gè)方法啟動(dòng)什么服務(wù)
            startBootstrapServices(t);
            startCoreServices(t);
            startOtherServices(t);
        } catch (Throwable ex) {
            ...
        } finally {
            t.traceEnd(); // StartServices
        }

        ...
        // 注釋5:Loop 永久循環(huán)。
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

注釋1:加載動(dòng)態(tài)庫(kù)libandroid_service.so。

注釋2:創(chuàng)建系統(tǒng)上下文。

注釋3:創(chuàng)建 SystemServiceManager。

注釋4:?jiǎn)?dòng)服務(wù)(startBootstrapServices、startCoreServices、startOtherServices)

注釋5:Loop 永久循環(huán)。

2.1.3 createSystemContext()

    private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

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

初始化系統(tǒng)上下文對(duì)象mSystemContext,并設(shè)置默認(rèn)的主題,mSystemContext實(shí)際上是一個(gè)Context(ContextImpl)對(duì)象。

調(diào)用ActivityThread.systemMain()的時(shí)候,會(huì)調(diào)用ActivityThread.attach(true),而在attach()里面,則創(chuàng)建了Application對(duì)象,并調(diào)用了Application.onCreate()。

2.1.4 startBootstrapServices()

    /**
     * 啟動(dòng)系統(tǒng)引導(dǎo)服務(wù),因?yàn)檫@些服務(wù)之間有復(fù)雜的相互依賴關(guān)系,所以都放在了這個(gè)方法里面。
     */
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
        ...
        final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig";
        SystemServerInitThreadPool.submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);

        // PlatformCompat Service 由 ActivityManagerService, PackageManagerService 和 其他服務(wù)做使用
        PlatformCompat platformCompat = new PlatformCompat(mSystemContext);
        ServiceManager.addService(Context.PLATFORM_COMPAT_SERVICE, platformCompat);
        ServiceManager.addService(Context.PLATFORM_COMPAT_NATIVE_SERVICE,
                new PlatformCompatNative(platformCompat));
        AppCompatCallbacks.install(new long[0]);

        mSystemServiceManager.startService(FileIntegrityService.class);
        Installer installer = mSystemServiceManager.startService(Installer.class);
        mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
        mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
        startMemtrackProxyService();

        // StartActivityManager
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
        //初始化 ActivityManagerService
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        mWindowManagerGlobalLock = atm.getGlobalLock();

        mDataLoaderManagerService = mSystemServiceManager.startService(
                DataLoaderManagerService.class);

        mIncrementalServiceHandle = startIncrementalService();
        t.traceEnd();

        //初始化PowerManagerService(電源服務(wù)),需要提前啟動(dòng),因?yàn)槠渌?wù)需要它。
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        mSystemServiceManager.startService(ThermalManagerService.class);

        // 電源管理已經(jīng)開啟,ActivityManagerService負(fù)責(zé)電源管理功能
        mActivityManagerService.initPowerManagement();

        mSystemServiceManager.startService(RecoverySystemService.Lifecycle.class);
        ...

        mSystemServiceManager.startService(LightsService.class);

        // Package manager isn't started yet; need to use SysProp not hardware feature
        if (SystemProperties.getBoolean("config.enable_sidekick_graphics", false)) {
            mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
        }

        // 初始化DisplayManagerService(顯示管理器)
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

        mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

        // Start the package manager.
        try {
            mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        } finally {

        }

        // 現(xiàn)在PackageManagerService已經(jīng)啟動(dòng),注冊(cè) dex 加載報(bào)告器來捕獲系統(tǒng)服務(wù)加載的任何 dex 文件。
        // 這些 dex 文件將由 BackgroundDexOptService 優(yōu)化。
        SystemServerDexLoadReporter.configureSystemServerDexReporter(mPackageManagerService);

        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
        ...
        //將AMS等添加到ServiceManager中
        mActivityManagerService.setSystemProcess();
        if (!mOnlyCore) {
            boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",
                    false);
            if (!disableOtaDexopt) {
                try {
                    OtaDexoptService.main(mSystemContext, mPackageManagerService);
                } catch (Throwable e) {

                } finally {
                }
            }
        }

        ...
        mSensorServiceStart = SystemServerInitThreadPool.submit(() -> {
            TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
            startSensorService();
        }, START_SENSOR_SERVICE);

        // startBootstrapServices
    }

改動(dòng)比較大的地方:

  • ActivityTaskManagerService(ATMS):負(fù)責(zé)管理除Activity和進(jìn)程,包括生命周期和狀態(tài)切換。

  • ActivityManagerService(AMS):AMN的子類,負(fù)責(zé)管理三大組件(除Activity)和進(jìn)程,包括生命周期和狀態(tài)切換。AMS因?yàn)橐蛈i交互,所以極其復(fù)雜,涉及window。

ActivityTaskManagerService:把 Activity 相關(guān)的內(nèi)容從 ActivityManagerService 剝離出來而產(chǎn)生的。

PowerManagerService(PMS):電源管理服務(wù)。

PackageManagerService(PKMS):包管理服務(wù),不叫PMS是為了和電源管理服務(wù)區(qū)分開。

2.1.5 startCoreServices()

    /**
     * 啟動(dòng)核心服務(wù)。
     */
    private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
        // Service for system config
        mSystemServiceManager.startService(SystemConfigService.class);
        // Tracks the battery level.  Requires LightService.
        mSystemServiceManager.startService(BatteryService.class);
        ...
        mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);

        mSystemServiceManager.startService(ROLLBACK_MANAGER_SERVICE_CLASS);

        mSystemServiceManager.startService(NativeTombstoneManagerService.class);

        mSystemServiceManager.startService(BugreportManagerService.class);

        mSystemServiceManager.startService(GpuService.class);

        // startCoreServices
    }

2.1.6 startOtherServices()

    /**
     * 啟動(dòng)其他服務(wù)。
     */
    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {

        final Context context = mSystemContext;
        VibratorService vibrator = null;
        DynamicSystemService dynamicSystem = null;
        IStorageManager storageManager = null;
        NetworkManagementService networkManagement = null;
        IpSecService ipSecService = null;
        VpnManagerService vpnManager = null;
        VcnManagementService vcnManagement = null;
        NetworkStatsService networkStats = null;
        NetworkPolicyManagerService networkPolicy = null;
        NsdService serviceDiscovery = null;
        WindowManagerService wm = null;
        SerialService serial = null;
        NetworkTimeUpdateService networkTimeUpdater = null;
        InputManagerService inputManager = null;
        TelephonyRegistry telephonyRegistry = null;
        ConsumerIrService consumerIr = null;
        MmsServiceBroker mmsService = null;
        HardwarePropertiesManagerService hardwarePropertiesService = null;
        PacProxyService pacProxyService = null;
        ...
        // 現(xiàn)在便可以開始啟動(dòng)三方APP應(yīng)用(如Launcher啟動(dòng)桌面)
        mActivityManagerService.systemReady(() -> {
        ...
         }, t);       
        // startOtherServices
    }

經(jīng)過上面這些步驟,我們調(diào)用調(diào)用createSystemContext()創(chuàng)建系統(tǒng)上下文的時(shí)候,也已經(jīng)完成了mSystemContext和ActivityThread的創(chuàng)建。

ATMS、AMS、WMS、PKMS等對(duì)象已經(jīng)創(chuàng)建好了,并且完成了成員變量初始化。

注意:這是系統(tǒng)進(jìn)程開啟時(shí)的流程,在這之后,會(huì)開啟系統(tǒng)的 Launcher程序,完成系統(tǒng)界面的加載與顯示。

在Android的框架設(shè)計(jì)中,服務(wù)器端指的就是所有App共用的系統(tǒng)服務(wù),比如我們這里提到的ATMS、AMS、WMS、PKMS等等,這些基礎(chǔ)的系統(tǒng)服務(wù)是被所有的App公用的。

3、Launcher是什么

在Android系統(tǒng)中,應(yīng)用程序是由Launcher啟動(dòng)起來的,其實(shí),Launcher本身也是一個(gè)應(yīng)用程序,其它的應(yīng)用程序安裝后,就會(huì)Launcher的界面上出現(xiàn)一個(gè)相應(yīng)的圖標(biāo),點(diǎn)擊這個(gè)圖標(biāo)時(shí),Launcher就會(huì)對(duì)應(yīng)的應(yīng)用程序啟動(dòng)起來。

當(dāng)然也可以在 其他應(yīng)用 啟動(dòng)應(yīng)用。但是本質(zhì)上都是調(diào)用startActivity()。

3.1 LauncherActivity.java

frameworks/base/core/java/android/app/LauncherActivity.java

/**
 * Displays a list of all activities which can be performed
 * for a given intent. Launches when clicked.
 *
 * @deprecated Applications can implement this UI themselves using
 *   {@link androidx.recyclerview.widget.RecyclerView} and
 *   {@link android.content.pm.PackageManager#queryIntentActivities(Intent, int)}
 */
@Deprecated
public abstract class LauncherActivity extends ListActivity {
    ...
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Intent intent = intentForPosition(position);
        startActivity(intent);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容