android启动流程-SystemServer

整体流程图

forkSystemServer

SystemServer进程主要是用于创建和管理系统服务的,例如AMS、WMS、PMS。上一章我们说到Zygote的进程的创建,在执行java层代码时,Zygote会创建SystemServer进程。

public static void main(String argv[]) {   
        
        ...

            if (startSystemServer) {
                //fork SystemServer进程,AMS由SystemServer启动
                Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer); 
                if (r != null) {
                    // 启动SystemServer
                    r.run();
                    return;
                }
            
            }
            
        ...
        
    }

文件路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java;

执行方法:forkSystemServer

private static Runnable forkSystemServer(String abiList, String socketName, 
ZygoteServer zygoteServer) { 
        try { 
            // 1.创建SystemServer进程,并返回当前进程的pid 
            pid = Zygote.forkSystemServer( 
                    parsedArgs.mUid, parsedArgs.mGid, 
                    parsedArgs.mGids, 
                    parsedArgs.mRuntimeFlags, 
                    null, 
                    parsedArgs.mPermittedCapabilities, 
                    parsedArgs.mEffectiveCapabilities); 
        } catch (IllegalArgumentException ex) { 
            throw new RuntimeException(ex); 
        } 
 
        // 2.如果pid==0则说明Zygote进程创建SystemServer进程成功,当前运行在SystemServer进程中 
        if (pid == 0) { 
            // 3.由于SystemServer进程fork了Zygote进程的地址空间,所以会得到Zygote进程创建Socket, 
            // 而这个Socket对于SystemServer进程是无用的,因此,在此处关闭了该Socket。 
            zygoteServer.closeServerSocket(); 
            // 4.启动SystemServer进程 
            return handleSystemServerProcess(parsedArgs); 
        } 
    } 

在代码1 处可知,Zygote.forkSystemServer()执行的过程中会fork一个进程, 这个进程就是systemServer进程。那么fork完成后,此处的代码会返回两次,一次返回是执行 fork新创建的代码,另外一次是zygote自己的代码。第一次返回值如果是0 ,说明当前运行的是新的创建的进程的代码也就是systemServer进程的代码,第二次返回的值是一个大于0的值,说明当前运行的代码是zygote进程的代码。

然后在代码2处,如果 pid 等于0 ,说明当前进程是运行在systemServer进程中。 systemServer进程是不需要zygoteServer的,所以关闭掉 closeServerSocket。然后,再执行 handleSystemServerProcess,运行systemServer进程。

private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) { 
        if (parsedArgs.mInvokeWith != null) { 
            ... 
        } else { 
            ClassLoader cl = null; 
            if (systemServerClasspath != null) { 
                // 1.使用了systemServerClassPath和targetSdkVersion创建了一个PathClassLoader 
                cl = createPathClassLoader(systemServerClasspath, 
parsedArgs.mTargetSdkVersion); 
            } 
 
            // 2.调用 ZygoteInit.zygoteInit 方法 
            return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion, 
                    parsedArgs.mDisabledCompatChanges, 
                    parsedArgs.mRemainingArgs, cl); 
        } 
    } 

以上代码做了两件事:

  1. 基于sdk版本创建了一个ClassLoader;
  2. 执行zygoteInit方法。
public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges, 
        String[] argv, ClassLoader classLoader) { 
    // 1.进入native方法 
    ZygoteInit.nativeZygoteInit(); 
    // 2.获取封装了SystemServer的main方法的runnable 
    return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, 
        classLoader); 
} 

继续往下看,在zygoteInit方法中,首先是调用nativeZygoteinit方法来初始化进程环境,然后再执行applicationInit方法获取封装了SystemServer的main方法的Runnable。

在上一篇说过,在zygote初始化的时候会注册JNI,其中就将 nativeZygoteInit()方法和native函数com_android_internal_os_ZygoteInit_nativeZygoteInit()建立了映射关系。所以此时调用nativeZygoteInit()会调用到AndroidRuntime的下面的代码。

static AndroidRuntime* gCurRuntime = NULL; 
static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz) 
{ 
    gCurRuntime->onZygoteInit(); 
} 

gCurRuntime是AndroidRuntime的指针,具体指向的是其子类AppRuntime,它在app_main.cpp中定义如下:

// frameworks/base/cmds/app_process/app_main.cpp 
virtual void onZygoteInit() { 
    // 1.创建了一个ProcessState实例 
    sp<ProcessState> proc = ProcessState::self(); 
    // 2.启动了一个Binder线程池 
    proc->startThreadPool(); 
} 

在这个代码中执行的是进程的初始化,首先在代码1处,创建了一个进程ProcessState,其中就会创建一个binder; 然后在代码2处启动了Binder线程池,为Binder线程的运行提供了动力。

现在我们回到 RuntimeInit.applicationInit方法中进行分析。

// frameworks/base/core/java/com/android/internal/os/RuntimeInit.java 
protected static Runnable applicationInit(int targetSdkVersion, long[] 
        disabledCompatChanges, String[] argv, ClassLoader classLoader) { 
    return findStaticMain(args.startClass, args.startArgs, classLoader); 
} 
protected static Runnable findStaticMain(String className, String[] argv, 
            ClassLoader classLoader) { 
        Class<?> cl; 
        try { 
            // 1.通过反射得到了SystemServer类 
            cl = Class.forName(className, true, classLoader); 
        } 
 
        Method m; 
        try { 
            // 2.找到了 SystemServer中的main方法 
            m = cl.getMethod("main", new Class[] { String[].class }); 
        } 
 
        // 3.将main()方法传入MethodAndArgsCaller()方法中 
        return new MethodAndArgsCaller(m, argv); 
    }

通过上面代码可知,findStaticMain执行反射,拿到systemServer的main方法,然后调用MethodAndArgsCaller,将main方法的调用封装到一个Runnable中,方便后期的执行。

static class MethodAndArgsCaller implements Runnable { 
        private final Method mMethod; 
        public MethodAndArgsCaller(Method method, String[] args) { 
            mMethod = method; 
            mArgs = args; 
        } 
 
        public void run() { 
            try { 
                // 执行SystemServer的main()方法 
                mMethod.invoke(null, new Object[] { mArgs }); 
            } 
        } 
    } 

可以看到这里通过反射,执行这个run方法,就是执行SystemServer的main()方法。

这个Runnable的run方法是在ZygoteInit的main()方法中被执行。

SystemServer.main

此时,我们回到最外层,forkSystemServer方法返回了一个Runnable。执行这个Runnable.run(),就相当于执行了SystemServer.main();

​
public static void main(String argv[]) {   
        
        ...

            if (startSystemServer) {
                //fork SystemServer进程,AMS由SystemServer启动
                Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer); 
                if (r != null) {
                    // 启动SystemServer
                    r.run();
                    return;
                }
            
            }
            
        ...
        
    }

​

所以,此时执行SystemServer.main():

文件路径:frameworks/base/services/java/com/android/server/SystemServer.java ;

执行方法:main

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

main方法就一行代码执行SystemServer进程的run方法:

private void run() { 
        try { 
            Looper.prepareMainLooper(); 
 
            // 1.加载动态库libandroid_servers.so 
            System.loadLibrary("android_servers"); 
 
            // 2.创建SystemServerManager 
            mSystemServiceManager = new SystemServiceManager(mSystemContext); 
             
            // 3.初始化系统上下文 
            createSystemContext(); 
 
        } 
 
        try { 
            // 3.使用SystemServiceManager启动引导服务 
            startBootstrapServices(t); 
            // 4.启动核心服务 
            startCoreServices(t); 
            // 5.启动其他服务 
            startOtherServices(t); 
        } 
 
        // Loop forever. 
        Looper.loop(); 
} 

通过上面的代码不难发现,启动过程中,在大流程上SystemServer和app进程的启动很像,初始化了很多资源,也加载了很多资源,还创建了上下文,同时构建了进程的Looper 死循环确保进程不会退出。

SystemServer通过代码3,4,5启动了非常多的服务,大概有90多个服务,这些服务包括AMS,ATMS,WMS, PKMS,BMS等等一系列的服务。另外,在代码2处创建了一个systemServiceManager对象,这个对象是用于在 SystemServer进程中管理90多个服务的启动的。

createSystemContext

private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        // 初始化系统上下文,加载资源
        mSystemContext = activityThread.getSystemContext();
        // 设置主题
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);


        final Context systemUiContext = activityThread.getSystemUiContext();
        // 设置SystemUI主题
        systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
    }

在调用ActivityThread.systemMain方法时,这个过程会创建对象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application等等。

startBootstrapServices

在这个方法中会启动系统的一些关键服务,这些服务是系统运行的基石。比如ATMS,AMS等等。

 private void startBootstrapServices() {
        // 尽早启动看门狗,这样我们在早期启动陷入死锁时就可以使system server崩溃重启。
        final Watchdog watchdog = Watchdog.getInstance();
        watchdog.start();
           
        //启动Installer Service,这个Service 通过binder与installd进程通讯,负责apk安装相关的工作
        Installer installer = mSystemServiceManager.startService(Installer.class);

        //设备标识符策略服务
        mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);

        // 管理uri授权
        mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);

        //启动ActivityTaskManagerService和ActivityManagerService
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        mWindowManagerGlobalLock = atm.getGlobalLock();
        
        //电源管理器需要尽早启动,因为其他服务需要它。
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

        //启动热缓解服务,目的是在手机开始过热时进行有效的热缓解
        mSystemServiceManager.startService(ThermalManagerService.class);

        // Now that the power manager has been started, let the activity manager
        // initialize power management features.
        mActivityManagerService.initPowerManagement();

        //启动系统恢复服务,负责协调设备上与恢复有关的功能。
        mSystemServiceManager.startService(RecoverySystemService.class);
        
        //到这里为止,系统启动的必须服务已经加载完毕
        RescueParty.noteBoot(mSystemContext);

        //管理LED和屏幕背光,我们需要它来显示
        mSystemServiceManager.startService(LightsService.class);

        //管理显示设备
        //在package manager 启动之前,需要启动display manager 提供display metrics
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

     //只有DisplayManagerService会对PHASE_WAIT_FOR_DEFAULT_DISPLAY做处理
     //目的是在初始化包管理器之前,首先需要获取一个默认的显示设备
     mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

        // 启动 package manager.
        if (!mRuntimeRestart) {
            MetricsLogger.histogram(null, "boot_package_manager_init_start",
                    (int) SystemClock.elapsedRealtime());
        }
        try {
            Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
            mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        } finally {
            Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
        }
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
       
        //启动UserManager Service
        mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
     

       //为系统进程设置应用程序实例并启动
        mActivityManagerService.setSystemProcess();

        //使用ActivityManager实例完成看门狗设置并监听是否重启
        watchdog.init(mSystemContext, mActivityManagerService);

        // DisplayManagerService needs to setup android.display scheduling related policies
        // since setSystemProcess() would have overridden policies due to setProcessGroup
        mDisplayManagerService.setupSchedulerPolicies();

        //负责动态资源overlay
        mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));

        mSystemServiceManager.startService(new SensorPrivacyService(mSystemContext));

        if (SystemProperties.getInt("persist.sys.displayinset.top", 0) > 0) {
            // DisplayManager needs the overlay immediately.
            mActivityManagerService.updateSystemUiContext();
            LocalServices.getService(DisplayManagerInternal.class).onOverlayChanged();
        }

          //传感器服务需要访问包管理器服务、app ops服务和权限服务,
         //因此我们在它们之后启动它。
         //在单独的线程中启动传感器服务。在使用它之前应该检查完成情况。
        mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
            TimingsTraceLog traceLog = new TimingsTraceLog(
                    SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
            traceLog.traceBegin(START_SENSOR_SERVICE);
            startSensorService();
            traceLog.traceEnd();
        }, START_SENSOR_SERVICE);
    }

startCoreServices

用来处理系统的核心服务,比如电池服务,webview相关服务等等。

 private void startCoreServices() {
        // 追踪电池充电状态和电量。需要LightService
        mSystemServiceManager.startService(BatteryService.class);

         //跟踪应用程序使用状态
        mSystemServiceManager.startService(UsageStatsService.class);
        mActivityManagerService.setUsageStatsManager(
                LocalServices.getService(UsageStatsManagerInternal.class));

        // 跟踪可更新的WebView是否处于就绪状态,并监视更新安装。
        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
            traceBeginAndSlog("StartWebViewUpdateService");
            mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
            traceEnd();
        }

       //跟踪并缓存设备状态。
        mSystemServiceManager.startService(CachedDeviceStateService.class);

        // 跟踪在Binder调用中花费的cpu时间
        mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);

        // 跟踪handlers中处理messages所花费的时间。
        mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);

        //管理apk回滚
        mSystemServiceManager.startService(RollbackManagerService.class);

        // 用于捕获bugreport,adb bugreport 命令调用的就是这个服务
        mSystemServiceManager.startService(BugreportManagerService.class);

        // 管理Gpu和Gpu驱动的服务
        mSystemServiceManager.startService(GpuService.class);
    }

startOtherServices

这个方法负责启动剩下的服务,共计有70多个。

/**
     * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
     */
    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        t.traceBegin("startOtherServices");

        // 代码省略...

        // We now tell the activity manager it is okay to run third party
        // code.  It will call back into us once it has gotten to the state
        // where third party code can really run (but before it has actually
        // started launching the initial applications), for us to complete our
        // initialization.
        mActivityManagerService.systemReady(() -> {


            //开始启动systemUI
            t.traceBegin("StartSystemUI");
            try {
                startSystemUi(context, windowManagerF);
            } catch (Throwable e) {
                reportWtf("starting System UI", e);
            }
            t.traceEnd();
            
            // 代码省略...
        }, t);

        t.traceEnd(); // startOtherServices
    }

最终通过startOtherServices中的mActivityManagerService.systemReady->RootWindowContainer.startHomeOnDisplay->RootWindowContainer.startHomeOnTaskDisplayArea->ActivityStartController.startHomeActivity(),启动Launcher app。

总结

SystemService进程被创建后,主要的处理如下:

1. 启动Binder线程池,这样就可以与其他进程进行Binder跨进程通信。

2. SystemServer在启动过程中,先初始化一些系统变量,加载类库,创建Context对象。

3. 创建SystemServiceManager,它用来对系统服务进行创建、启动和生命周期管理。

4. 启动各种系统服务:引导服务、核心服务、其他服务,共90多种。应用开发主要关注引导服务 ActivityManagerService、PackageManagerService和其他服务WindowManagerService、 InputManagerService即可。

5. 启动的服务都单独运行在SystemServer的各自线程中,同属于SystemServer进程。

  • 38
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 12 SystemServer启动流程如下: 1. 引导加载:系统启动时,先加载引导程序,进行硬件初始化、内核加载等操作。 2. Zygote 进程启动:ZygoteAndroid 系统中的一个特殊进程,负责孵化其他应用进程。Zygote 进程会预加载一些常用的类和资源,以加快应用的启动速度。 3. SystemServer 进程启动:Zygote 进程会 fork 出 SystemServer 进程,该进程是 Android 系统中的核心服务进程。SystemServer 进程负责启动和管理系统级别的服务,例如 ActivityManagerService、PackageManagerService、WindowManagerService 等。 4. SystemServer 初始化:SystemServer 进程启动后,会进行一系列的初始化操作。首先会创建 Looper 线程,用于接收消息并处理各个服务的初始化工作。然后依次创建各个系统服务,并调用它们的启动方法。 5. 启动系统服务:SystemServer 进程会按照一定顺序启动各个系统服务。每个系统服务都有自己的初始化流程,例如 PackageManagerService 会加载应用程序列表、数据目录等;ActivityManagerService 会初始化进程间通信机制等。 6. 启动应用进程:在系统服务启动完成后,SystemServer 进程会通过 Zygote 孵化出其他应用进程。应用进程会根据 AndroidManifest.xml 中的配置进行初始化,包括创建 Application、加载资源等。 总结来说,Android 12 SystemServer启动流程包括引导加载、Zygote 进程启动、SystemServer 进程启动、SystemServer 初始化、启动系统服务和启动应用进程等步骤。这些步骤都是为了在系统启动时提供必要的服务和资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值