App啟動(dòng)流程

目錄介紹

  • 1.什么是Zygote進(jìn)程
    • 1.1 簡單介紹
    • 1.2 各個(gè)進(jìn)程的先后順序
    • 1.3 進(jìn)程作用說明
  • 2.Zygote進(jìn)程的啟動(dòng)流程
    • 2.1 源碼位置
    • 2.2 ZygoteInit類的main方法
    • 2.3 registerZygoteSocket(socketName)分析
    • 2.4 preLoad()方法分析
    • 2.5 startSystemServer()啟動(dòng)進(jìn)程
  • 3.SystemServer進(jìn)程啟動(dòng)流程
    • 3.1 SystemServer進(jìn)程簡介
    • 3.2 SystemServer的main方法
    • 3.3 查看run方法
    • 3.4 run方法中createSystemContext()解析
    • 3.5 mSystemServiceManager的創(chuàng)建
  • 4.啟動(dòng)服務(wù)
    • 4.1 啟動(dòng)哪些服務(wù)
    • 4.2 啟動(dòng)服務(wù)流程源碼分析
    • 4.3 啟動(dòng)部分服務(wù)

好消息

  • 博客筆記大匯總【16年3月到至今】徐伐,包括Java基礎(chǔ)及深入知識點(diǎn)窍育,Android技術(shù)博客,Python學(xué)習(xí)筆記等等踊餐,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題拴泌,長期更新維護(hù)并且修正瑰抵,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客厚棵,從12年起,積累共計(jì)47篇[近20萬字]蔼紧,轉(zhuǎn)載請注明出處婆硬,謝謝!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好奸例,可以star一下彬犯,謝謝向楼!當(dāng)然也歡迎提出建議,萬事起于忽微谐区,量變引起質(zhì)變湖蜕!

1.什么是Zygote進(jìn)程

1.1 簡單介紹

  • Zygote進(jìn)程是所有的android進(jìn)程的父進(jìn)程,包括SystemServer和各種應(yīng)用進(jìn)程都是通過Zygote進(jìn)程fork出來的宋列。Zygote(孵化)進(jìn)程相當(dāng)于是android系統(tǒng)的根進(jìn)程昭抒,后面所有的進(jìn)程都是通過這個(gè)進(jìn)程fork出來的
  • 雖然Zygote進(jìn)程相當(dāng)于Android系統(tǒng)的根進(jìn)程,但是事實(shí)上它也是由Linux系統(tǒng)的init進(jìn)程啟動(dòng)的炼杖。

1.2 各個(gè)進(jìn)程的先后順序

  • init進(jìn)程 --> Zygote進(jìn)程 --> SystemServer進(jìn)程 -->各種應(yīng)用進(jìn)程

1.3 進(jìn)程作用說明

  • init進(jìn)程:linux的根進(jìn)程灭返,android系統(tǒng)是基于linux系統(tǒng)的,因此可以算作是整個(gè)android操作系統(tǒng)的第一個(gè)進(jìn)程坤邪;
  • Zygote進(jìn)程:android系統(tǒng)的根進(jìn)程熙含,主要作用:可以作用Zygote進(jìn)程fork出SystemServer進(jìn)程和各種應(yīng)用進(jìn)程;
  • SystemService進(jìn)程:主要是在這個(gè)進(jìn)程中啟動(dòng)系統(tǒng)的各項(xiàng)服務(wù)艇纺,比如ActivityManagerService婆芦,PackageManagerService,WindowManagerService服務(wù)等等喂饥;
  • 各種應(yīng)用進(jìn)程:啟動(dòng)自己編寫的客戶端應(yīng)用時(shí),一般都是重新啟動(dòng)一個(gè)應(yīng)用進(jìn)程肠鲫,有自己的虛擬機(jī)與運(yùn)行環(huán)境员帮;

2.Zygote進(jìn)程的啟動(dòng)流程

2.1 源碼位置

  • 位置:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  • Zygote進(jìn)程mian方法主要執(zhí)行邏輯:
    • 初始化DDMS;
    • 注冊Zygote進(jìn)程的socket通訊导饲;
    • 初始化Zygote中的各種類捞高,資源文件,OpenGL渣锦,類庫顽决,Text資源等等丽柿;
    • 初始化完成之后fork出SystemServer進(jìn)程;
    • fork出SystemServer進(jìn)程之后,關(guān)閉socket連接渠牲;

2.2 ZygoteInit類的main方法

  • init進(jìn)程在啟動(dòng)Zygote進(jìn)程時(shí)一般都會調(diào)用ZygoteInit類的main方法,因此這里看一下該方法的具體實(shí)現(xiàn)(基于android23源碼)曲楚;
    • 調(diào)用enableDdms()幢痘,設(shè)置DDMS可用,可以發(fā)現(xiàn)DDMS啟動(dòng)的時(shí)機(jī)還是比較早的皆看,在整個(gè)Zygote進(jìn)程剛剛開始要啟動(dòng)額時(shí)候就設(shè)置可用仓坞。
    • 之后初始化各種參數(shù)
    • 通過調(diào)用registerZygoteSocket方法,注冊為Zygote進(jìn)程注冊Socket
    • 然后調(diào)用preload方法實(shí)現(xiàn)預(yù)加載各種資源
    • 然后通過調(diào)用startSystemServer開啟SystemServer服務(wù)腰吟,這個(gè)是重點(diǎn)
    public static void main(String argv[]) {
        try {
            //設(shè)置ddms可以用
            RuntimeInit.enableDdms();
            SamplingProfilerIntegration.start();
            boolean startSystemServer = false;
            String socketName = "zygote";
            String abiList = null;
            for (int i = 1; i < argv.length; i++) {
                if ("start-system-server".equals(argv[i])) {
                    startSystemServer = 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)) {
                    socketName = argv[i].substring(SOCKET_NAME_ARG.length());
                } else {
                    throw new RuntimeException("Unknown command line argument: " + argv[i]);
                }
            }
    
            if (abiList == null) {
                throw new RuntimeException("No ABI list supplied.");
            }
    
            registerZygoteSocket(socketName);
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
                SystemClock.uptimeMillis());
            preload();
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
                SystemClock.uptimeMillis());
            SamplingProfilerIntegration.writeZygoteSnapshot();
    
            gcAndFinalize();
            Trace.setTracingEnabled(false);
    
            if (startSystemServer) {
                startSystemServer(abiList, socketName);
            }
    
            Log.i(TAG, "Accepting command socket connections");
            runSelectLoop(abiList);
    
            closeServerSocket();
        } catch (MethodAndArgsCaller caller) {
            caller.run();
        } catch (RuntimeException ex) {
            Log.e(TAG, "Zygote died with exception", ex);
            closeServerSocket();
            throw ex;
        }
    }
    

2.3 registerZygoteSocket(socketName)分析

  • 調(diào)用registerZygoteSocket(String socketName)為Zygote進(jìn)程注冊socket
    private static void registerZygoteSocket(String socketName) {
        if (sServerSocket == null) {
            int fileDesc;
            final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName;
            try {
                String env = System.getenv(fullSocketName);
                fileDesc = Integer.parseInt(env);
            } catch (RuntimeException ex) {
                throw new RuntimeException(fullSocketName + " unset or invalid", ex);
            }
    
            try {
                FileDescriptor fd = new FileDescriptor();
                fd.setInt$(fileDesc);
                sServerSocket = new LocalServerSocket(fd);
            } catch (IOException ex) {
                throw new RuntimeException(
                        "Error binding to local socket '" + fileDesc + "'", ex);
            }
        }
    }
    

2.4 preLoad()方法分析

  • 源碼如下所示
    static void preload() {
        Log.d(TAG, "begin preload");
        preloadClasses();
        preloadResources();
        preloadOpenGL();
        preloadSharedLibraries();
        preloadTextResources();
        // Ask the WebViewFactory to do any initialization that must run in the zygote process,
        // for memory sharing purposes.
        WebViewFactory.prepareWebViewInZygote();
        Log.d(TAG, "end preload");
    }
    
  • 大概操作是這樣的:
    • preloadClasses()用于初始化Zygote中需要的class類无埃;
    • preloadResources()用于初始化系統(tǒng)資源;
    • preloadOpenGL()用于初始化OpenGL;
    • preloadSharedLibraries()用于初始化系統(tǒng)libraries嫉称;
    • preloadTextResources()用于初始化文字資源侦镇;
    • prepareWebViewInZygote()用于初始化webview;

2.5 startSystemServer()啟動(dòng)進(jìn)程

  • 這段邏輯的執(zhí)行邏輯就是通過Zygote fork出SystemServer進(jìn)程
    private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
        long capabilities = posixCapabilitiesAsBits(
            OsConstants.CAP_BLOCK_SUSPEND,
            OsConstants.CAP_KILL,
            OsConstants.CAP_NET_ADMIN,
            OsConstants.CAP_NET_BIND_SERVICE,
            OsConstants.CAP_NET_BROADCAST,
            OsConstants.CAP_NET_RAW,
            OsConstants.CAP_SYS_MODULE,
            OsConstants.CAP_SYS_NICE,
            OsConstants.CAP_SYS_RESOURCE,
            OsConstants.CAP_SYS_TIME,
            OsConstants.CAP_SYS_TTY_CONFIG
        );
        /* Hardcoded command line to start the system server */
        String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server",
            "--runtime-args",
            "com.android.server.SystemServer",
        };
        ZygoteConnection.Arguments parsedArgs = null;
    
        int pid;
    
        try {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
    
            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }
    
        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }
    
            handleSystemServerProcess(parsedArgs);
        }
    
        return true;
    }
    

3.SystemServer進(jìn)程啟動(dòng)流程

3.1 SystemServer進(jìn)程簡介

  • SystemServer進(jìn)程主要的作用是在這個(gè)進(jìn)程中啟動(dòng)各種系統(tǒng)服務(wù),比如ActivityManagerService澎埠,PackageManagerService虽缕,WindowManagerService服務(wù),以及各種系統(tǒng)性的服務(wù)其實(shí)都是在SystemServer進(jìn)程中啟動(dòng)的蒲稳,而當(dāng)我們的應(yīng)用需要使用各種系統(tǒng)服務(wù)的時(shí)候其實(shí)也是通過與SystemServer進(jìn)程通訊獲取各種服務(wù)對象的句柄的氮趋。

3.2 SystemServer的main方法

  • 如下所示,比較簡單江耀,只是new出一個(gè)SystemServer對象并執(zhí)行其run方法剩胁,查看SystemServer類的定義我們知道其實(shí)final類型的,所以我們一般不能重寫或者繼承祥国。
  • image

3.3 查看run方法

  • 代碼如下所示
    • 首先判斷系統(tǒng)當(dāng)前時(shí)間昵观,若當(dāng)前時(shí)間小于1970年1月1日,則一些初始化操作可能會處所舌稀,所以當(dāng)系統(tǒng)的當(dāng)前時(shí)間小于1970年1月1日的時(shí)候啊犬,設(shè)置系統(tǒng)當(dāng)前時(shí)間為該時(shí)間點(diǎn)。
    • 然后是設(shè)置系統(tǒng)的語言環(huán)境等
    • 接著設(shè)置虛擬機(jī)運(yùn)行內(nèi)存壁查,加載運(yùn)行庫觉至,設(shè)置SystemServer的異步消息
    private void run() {
        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
            Slog.w(TAG, "System clock is before 1970; setting to 1970.");
            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }
    
        if (!SystemProperties.get("persist.sys.language").isEmpty()) {
            final String languageTag = Locale.getDefault().toLanguageTag();
    
            SystemProperties.set("persist.sys.locale", languageTag);
            SystemProperties.set("persist.sys.language", "");
            SystemProperties.set("persist.sys.country", "");
            SystemProperties.set("persist.sys.localevar", "");
        }
    
        Slog.i(TAG, "Entered the Android system server!");
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());
    
        SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());
    
        if (SamplingProfilerIntegration.isEnabled()) {
            SamplingProfilerIntegration.start();
            mProfilerSnapshotTimer = new Timer();
            mProfilerSnapshotTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    SamplingProfilerIntegration.writeSnapshot("system_server", null);
                }
            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
        }
    
        // Mmmmmm... more memory!
        VMRuntime.getRuntime().clearGrowthLimit();
    
        // The system server has to run all of the time, so it needs to be
        // as efficient as possible with its memory usage.
        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
    
        // Some devices rely on runtime fingerprint generation, so make sure
        // we've defined it before booting further.
        Build.ensureFingerprintProperty();
    
        // Within the system server, it is an error to access Environment paths without
        // explicitly specifying a user.
        Environment.setUserRequired(true);
    
        // Ensure binder calls into the system always run at foreground priority.
        BinderInternal.disableBackgroundScheduling(true);
    
        // Prepare the main looper thread (this thread).
        android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
        android.os.Process.setCanSelfBackground(false);
        Looper.prepareMainLooper();
    
        // Initialize native services.
        System.loadLibrary("android_servers");
    
        // Check whether we failed to shut down last time we tried.
        // This call may not return.
        performPendingShutdown();
    
        // Initialize the system context.
        createSystemContext();
    
        // Create the system service manager.
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    
        // Start services.
        try {
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        }
    
        // For debug builds, log event loop stalls to dropbox for analysis.
        if (StrictMode.conditionallyEnableDebugLogging()) {
            Slog.i(TAG, "Enabled StrictMode for system server main thread.");
        }
    
        // Loop forever.
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }
    
  • 然后下面的代碼是:
    // Initialize the system context.
    createSystemContext();
    
    // Create the system service manager.
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    
    // Start services.
    try {
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
    } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    }
    

3.4 run方法中createSystemContext()解析

  • 調(diào)用createSystemContext()方法:
    • 可以看到在SystemServer進(jìn)程中也存在著Context對象,并且是通過ActivityThread.systemMain方法創(chuàng)建context的睡腿,這一部分的邏輯以后會通過介紹Activity的啟動(dòng)流程來介紹语御,這里就不在擴(kuò)展,只知道在SystemServer進(jìn)程中也需要?jiǎng)?chuàng)建Context對象席怪。
    private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
    }
    

3.5 mSystemServiceManager的創(chuàng)建

  • 看run方法中应闯,通過SystemServiceManager的構(gòu)造方法創(chuàng)建了一個(gè)新的SystemServiceManager對象,我們知道SystemServer進(jìn)程主要是用來構(gòu)建系統(tǒng)各種service服務(wù)的挂捻,而SystemServiceManager就是這些服務(wù)的管理對象碉纺。
  • 然后調(diào)用:
    • 將SystemServiceManager對象保存SystemServer進(jìn)程中的一個(gè)數(shù)據(jù)結(jié)構(gòu)中。
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    
  • 最后開始執(zhí)行:
    // Start services.
    try {
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
    } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    }
    
    • 里面主要涉及了是三個(gè)方法:
      • startBootstrapServices() 主要用于啟動(dòng)系統(tǒng)Boot級服務(wù)
      • startCoreServices() 主要用于啟動(dòng)系統(tǒng)核心的服務(wù)
      • startOtherServices() 主要用于啟動(dòng)一些非緊要或者是非需要及時(shí)啟動(dòng)的服務(wù)

4.啟動(dòng)服務(wù)

4.1 啟動(dòng)哪些服務(wù)

  • 在開始執(zhí)行啟動(dòng)服務(wù)之前總是會先嘗試通過socket方式連接Zygote進(jìn)程刻撒,在成功連接之后才會開始啟動(dòng)其他服務(wù)惜辑。
  • image

4.2 啟動(dòng)服務(wù)流程源碼分析

  • 首先看一下startBootstrapServices方法:
    private void startBootstrapServices() {
        Installer installer = mSystemServiceManager.startService(Installer.class);
    
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
    
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    
        mActivityManagerService.initPowerManagement();
    
        // Manages LEDs and display backlight so we need it to bring up the display.
        mSystemServiceManager.startService(LightsService.class);
    
        // Display manager is needed to provide display metrics before package manager
        // starts up.
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
    
        // We need the default display before we can initialize the package manager.
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
    
        // Only run "core" apps if we're encrypting the device.
        String cryptState = SystemProperties.get("vold.decrypt");
        if (ENCRYPTING_STATE.equals(cryptState)) {
            Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
            mOnlyCore = true;
        } else if (ENCRYPTED_STATE.equals(cryptState)) {
            Slog.w(TAG, "Device encrypted - only parsing core apps");
            mOnlyCore = true;
        }
    
        // Start the package manager.
        Slog.i(TAG, "Package Manager");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
    
        Slog.i(TAG, "User Service");
        ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());
    
        // Initialize attribute cache used to cache resources from packages.
        AttributeCache.init(mSystemContext);
    
        // Set up the Application instance for the system process and get started.
        mActivityManagerService.setSystemProcess();
    
        // The sensor service needs access to package manager service, app ops
        // service, and permissions service, therefore we start it after them.
        startSensorService();
    }
    
  • 先執(zhí)行:
    Installer installer = mSystemServiceManager.startService(Installer.class);
    
  • mSystemServiceManager是系統(tǒng)服務(wù)管理對象,在main方法中已經(jīng)創(chuàng)建完成疫赎,這里我們看一下其startService方法的具體實(shí)現(xiàn):
    • 可以看到通過反射器構(gòu)造方法創(chuàng)建出服務(wù)類盛撑,然后添加到SystemServiceManager的服務(wù)列表數(shù)據(jù)中,最后調(diào)用了service.onStart()方法捧搞,因?yàn)閭鬟f的是Installer.class
    public <T extends SystemService> T startService(Class<T> serviceClass) {
        final String name = serviceClass.getName();
        Slog.i(TAG, "Starting " + name);
    
        // Create the service.
        if (!SystemService.class.isAssignableFrom(serviceClass)) {
            throw new RuntimeException("Failed to create " + name
                    + ": service must extend " + SystemService.class.getName());
        }
        final T service;
        try {
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
        } catch (InstantiationException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service could not be instantiated", ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service must have a public constructor with a Context argument", ex);
        } catch (InvocationTargetException ex) {
            throw new RuntimeException("Failed to create service " + name
                    + ": service constructor threw an exception", ex);
        }
    
        // Register it.
        mServices.add(service);
    
        // Start it.
        try {
            service.onStart();
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + name
                    + ": onStart threw an exception", ex);
        }
        return service;
    }
    
  • 看一下Installer的onStart方法:
    • 很簡單就是執(zhí)行了mInstaller的waitForConnection方法抵卫,這里簡單介紹一下Installer類狮荔,該類是系統(tǒng)安裝apk時(shí)的一個(gè)服務(wù)類,繼承SystemService(系統(tǒng)服務(wù)的一個(gè)抽象接口)介粘,需要在啟動(dòng)完成Installer服務(wù)之后才能啟動(dòng)其他的系統(tǒng)服務(wù)殖氏。
    @Override
    public void onStart() {
        Slog.i(TAG, "Waiting for installd to be ready.");
        mInstaller.waitForConnection();
    }
    
  • 然后查看waitForConnection()方法:
    • 通過追蹤代碼可以發(fā)現(xiàn),其在不斷的通過ping命令連接Zygote進(jìn)程(SystemServer和Zygote進(jìn)程通過socket方式通訊姻采,其他進(jìn)程通過Binder方式通訊)
    public void waitForConnection() {
        for (;;) {
            if (execute("ping") >= 0) {
                return;
            }
            Slog.w(TAG, "installd not ready");
            SystemClock.sleep(1000);
        }
    }
    
  • 繼續(xù)看startBootstrapServices方法:
    • 這段代碼主要是用于啟動(dòng)ActivityManagerService服務(wù)雅采,并為其設(shè)置SysServiceManager和Installer。ActivityManagerService是系統(tǒng)中一個(gè)非常重要的服務(wù)慨亲,Activity婚瓜,service,Broadcast刑棵,contentProvider都需要通過其余系統(tǒng)交互巴刻。
    // Activity manager runs the show.
    mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    
  • 首先看一下Lifecycle類的定義:
    • 可以看到其實(shí)ActivityManagerService的一個(gè)靜態(tài)內(nèi)部類,在其構(gòu)造方法中會創(chuàng)建一個(gè)ActivityManagerService蛉签,通過剛剛對Installer服務(wù)的分析我們知道胡陪,SystemServiceManager的startService方法會調(diào)用服務(wù)的onStart()方法,而在Lifecycle類的定義中我們看到其onStart()方法直接調(diào)用了mService.start()方法碍舍,mService是Lifecycle類中對ActivityManagerService的引用
    public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;
    
        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityManagerService(context);
        }
    
        @Override
        public void onStart() {
            mService.start();
        }
    
        public ActivityManagerService getService() {
            return mService;
        }
    }
    

4.3 啟動(dòng)部分服務(wù)

  • 啟動(dòng)PowerManagerService服務(wù):
    • 啟動(dòng)方式跟上面的ActivityManagerService服務(wù)相似都會調(diào)用其構(gòu)造方法和onStart方法柠座,PowerManagerService主要用于計(jì)算系統(tǒng)中和Power相關(guān)的計(jì)算,然后決策系統(tǒng)應(yīng)該如何反應(yīng)片橡。同時(shí)協(xié)調(diào)Power如何與系統(tǒng)其它模塊的交互妈经,比如沒有用戶活動(dòng)時(shí),屏幕變暗等等锻全。
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    
    • 然后是啟動(dòng)LightsService服務(wù)
      • 主要是手機(jī)中關(guān)于閃光燈,LED等相關(guān)的服務(wù)录煤;也是會調(diào)用LightsService的構(gòu)造方法和onStart方法鳄厌;
      mSystemServiceManager.startService(LightsService.class);
      
    • 然后是啟動(dòng)DisplayManagerService服務(wù)
      • 主要是手機(jī)顯示方面的服務(wù)
      mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
      
  • 然后是啟動(dòng)PackageManagerService,該服務(wù)也是android系統(tǒng)中一個(gè)比較重要的服務(wù)
    • 包括多apk文件的安裝妈踊,解析了嚎,刪除,卸載等等操作廊营。
    • 可以看到PackageManagerService服務(wù)的啟動(dòng)方式與其他服務(wù)的啟動(dòng)方式有一些區(qū)別歪泳,直接調(diào)用了PackageManagerService的靜態(tài)main方法
    Slog.i(TAG, "Package Manager");
    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
            mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    mFirstBoot = mPackageManagerService.isFirstBoot();
    mPackageManager = mSystemContext.getPackageManager();
    
    • 看一下其main方法的具體實(shí)現(xiàn):
      • 可以看到也是直接使用new的方式創(chuàng)建了一個(gè)PackageManagerService對象,并在其構(gòu)造方法中初始化相關(guān)變量露筒,最后調(diào)用了ServiceManager.addService方法呐伞,主要是通過Binder機(jī)制與JNI層交互
    public static PackageManagerService main(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) {
        PackageManagerService m = new PackageManagerService(context, installer,
                factoryTest, onlyCore);
        ServiceManager.addService("package", m);
        return m;
    }
    
  • 然后查看startCoreServices方法:
    • 可以看到這里啟動(dòng)了BatteryService(電池相關(guān)服務(wù)),UsageStatsService慎式,WebViewUpdateService服務(wù)等伶氢。
    private void startCoreServices() {
        // Tracks the battery level.  Requires LightService.
        mSystemServiceManager.startService(BatteryService.class);
    
        // Tracks application usage stats.
        mSystemServiceManager.startService(UsageStatsService.class);
        mActivityManagerService.setUsageStatsManager(
                LocalServices.getService(UsageStatsManagerInternal.class));
        // Update after UsageStatsService is available, needed before performBootDexOpt.
        mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();
    
        // Tracks whether the updatable WebView is in a ready state and watches for update installs.
        mSystemServiceManager.startService(WebViewUpdateService.class);
    }
    

總結(jié):

  • SystemServer進(jìn)程是android中一個(gè)很重要的進(jìn)程由Zygote進(jìn)程啟動(dòng)趟径;
  • SystemServer進(jìn)程主要用于啟動(dòng)系統(tǒng)中的服務(wù);
  • SystemServer進(jìn)程啟動(dòng)服務(wù)的啟動(dòng)函數(shù)為main函數(shù)癣防;
  • SystemServer在執(zhí)行過程中首先會初始化一些系統(tǒng)變量蜗巧,加載類庫,創(chuàng)建Context對象蕾盯,創(chuàng)建SystemServiceManager對象等之后才開始啟動(dòng)系統(tǒng)服務(wù)幕屹;
  • SystemServer進(jìn)程將系統(tǒng)服務(wù)分為三類:boot服務(wù),core服務(wù)和other服務(wù)级遭,并逐步啟動(dòng)
  • SertemServer進(jìn)程在嘗試啟動(dòng)服務(wù)之前會首先嘗試與Zygote建立socket通訊望拖,只有通訊成功之后才會開始嘗試啟動(dòng)服務(wù);
  • 創(chuàng)建的系統(tǒng)服務(wù)過程中主要通過SystemServiceManager對象來管理装畅,通過調(diào)用服務(wù)對象的構(gòu)造方法和onStart方法初始化服務(wù)的相關(guān)變量靠娱;
  • 服務(wù)對象都有自己的異步消息對象,并運(yùn)行在單獨(dú)的線程中掠兄;

參考博客

關(guān)于其他內(nèi)容介紹

01.關(guān)于博客匯總鏈接

02.關(guān)于我的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚂夕,隨后出現(xiàn)的幾起案子迅诬,更是在濱河造成了極大的恐慌,老刑警劉巖婿牍,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侈贷,死亡現(xiàn)場離奇詭異,居然都是意外死亡等脂,警方通過查閱死者的電腦和手機(jī)俏蛮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上遥,“玉大人搏屑,你說我怎么就攤上這事》鄢” “怎么了辣恋?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長模软。 經(jīng)常有香客問我伟骨,道長,這世上最難降的妖魔是什么燃异? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任携狭,我火速辦了婚禮,結(jié)果婚禮上回俐,老公的妹妹穿的比我還像新娘暑中。我一直安慰自己壹瘟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布鳄逾。 她就那樣靜靜地躺著稻轨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雕凹。 梳的紋絲不亂的頭發(fā)上殴俱,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音枚抵,去河邊找鬼线欲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汽摹,可吹牛的內(nèi)容都是我干的李丰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼逼泣,長吁一口氣:“原來是場噩夢啊……” “哼趴泌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拉庶,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗜憔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氏仗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吉捶,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年皆尔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呐舔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慷蠕,死狀恐怖珊拼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砌们,我是刑警寧澤杆麸,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布搁进,位于F島的核電站浪感,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饼问。R本人自食惡果不足惜影兽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莱革。 院中可真熱鬧峻堰,春花似錦讹开、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至镶蹋,卻和暖如春成艘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贺归。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工淆两, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拂酣。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓秋冰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婶熬。 傳聞我的和親對象是個(gè)殘疾皇子剑勾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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