Android Framework实战视频--SystemServer启动篇

在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论
转自于:https://blog.csdn.net/learnframework/article/details/116310690

课程答疑和新课信息:QQ交流群:422901085进行课程讨论
FrameWork入门课视频链接:https://edu.csdn.net/course/detail/30298
FrameWork实战课1视频链接:https://edu.csdn.net/course/detail/30275
专题博客系列:
Android 8.1 zygote 启动过程源码
Android Framework实战视频--Zygote的fork进程篇
Android Framework实战视频--SystemServer启动篇
Android Framework实战视频--SystemServer启动FallbackHome篇
Android Framework实战视频--FallbackHome进程启动及Activity启动篇
Android Framework实战视频--FallbackHome结束启动Launcher篇

SystemServer启动篇

上一讲已经讲了systemserver进程被fork出来了
代码在ZygoteInit的main方法中的:

Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

进入forkSystemServer方法后已经分析到:

   pid = Zygote.forkSystemServer

即在Zygote中又调用了forkSystemServer方法一直到native层才调用了真正的linux的 fork()
在Zygote.forkSystemServer返回后看代码如下:

 if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

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

由于SystemServer是复制Zygote的进程,因此也会包含Zygote的zygoteServer,对于SystemServer没有其他作用,需要先将其关闭;通过调用handleSystemServerProcess:

 private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {
     //省略。。
        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
        //省略。。

        if (parsedArgs.invokeWith != null) {
         //省略。。
        } else {
            ClassLoader cl = null;
            if (systemServerClasspath != null) {
             //创建PathClassLoader
                cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);

                Thread.currentThread().setContextClassLoader(cl);
            }

            /*
             * Pass the remaining arguments to SystemServer.
             */
            return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
        }

        /* should never reach here */
    }

这里创建PathClassLoader然后又调用ZygoteInit.zygoteInit

 public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
//省略
        RuntimeInit.commonInit();
        //启动一下binder线程池
        ZygoteInit.nativeZygoteInit();
        return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
    }

这里先调用ZygoteInit.nativeZygoteInit(),是一个native方法,实现在AndroidRuntime里面,最后调到app_main.cpp的onZygoteInit,来启动binder线程池:

 virtual void onZygoteInit()
    {
        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\n");
        proc->startThreadPool();
    }

接下来调用RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);

 protected static Runnable applicationInit(int targetSdkVersion, String[] argv,
            ClassLoader classLoader) {
       //省略
        return findStaticMain(args.startClass, args.startArgs, classLoader);
    }

applicationInit主要就是实现寻找startClass中的main方法,然后构造一个Runable,对应的run方法就是调用main方法:

private static Runnable findStaticMain(String className, String[] argv,
            ClassLoader classLoader) {
      //省略
            cl = Class.forName(className, true, classLoader);
        //省略
            m = cl.getMethod("main", new Class[] { String[].class });
         //省略
        return new MethodAndArgsCaller(m, argv);
    }

其中MethodAndArgsCaller:

 static class MethodAndArgsCaller implements Runnable {
       //省略
        public void run() {
           //省略
                mMethod.invoke(null, new Object[] { mArgs });
            //省略
        }
    }

所以这里就是关键确定startClass是谁
这里又得回到开始ZygoteInit类的forkSystemServer:
有如下参数:

  String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server",
            "--runtime-args",
            "com.android.server.SystemServer",
        };

其实这里的statClass就是最后一个参数: "com.android.server.SystemServer"

以上过程完成了从Zygote经过RuntimeInit最后完成SystemServer的main方法的运行。下面重点分析SystemServer的main方法:

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

直接调用run方法:

private void run() {
            //创建Looper对象
            Looper.prepareMainLooper();
            // 加载系统android_servers的库
            System.loadLibrary("android_servers");
            //创建系统的Context
            createSystemContext()
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            //省略。。
            //启动引导服务
            startBootstrapServices();
            //启动核心服务
            startCoreServices();
            //启动其他服务
            startOtherServices();
           //省略。。
           Looper.loop();     
}

run方法中内容也比较多,这里分析几个重要部分既可以:
Looper.prepareMainLooper();主要目的就是创建好Looper对象,因为system server的主线程和普通app主线程一样是一个Loop管理的消息循环

createSystemContext()表示创建一个systemContext,Context不仅仅在普通app中非常重要,在system server中也一样,需要通过Context这个纽带来,获取一些进程的信息环境。

mSystemServiceManager = new SystemServiceManager(mSystemContext);这里创建了一个SystemServiceManager的类对象,而且放入了LocalServices中,其实这里的SystemServiceManager和常见binder中的ServiceManager还是不一样的,SystemServiceManager只是System Server中一个普通的类,他负责保存了各个SystemService的全局变量角色,本身不涉及跨进程,而ServiceManager可以与binder跨进除等是强关联

再接下来就是重点中重点:
//启动引导服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();

system server把系统的所有服务分了3类进行启动
第一个:startBootstrapServices();
这一部分看注释可以大概得出,系统服务之间存在着非常复杂的依赖关系,所以需要把一些重要的系统服务进行第一位启动

 /**
     * Starts the small tangle of critical services that are needed to get
     * the system off the ground.  These services have complex mutual dependencies
     * which is why we initialize them all in one place here.  Unless your service
     * is also entwined in these dependencies, it should be initialized in one of
     * the other functions.
     */
    private void startBootstrapServices() {
      //省略。。
        Installer installer = mSystemServiceManager.startService(Installer.class);
        //省略。。
        mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
        //省略。。
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        //省略。。
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        //省略。。
        mActivityManagerService.initPowerManagement();
        //省略。。
        if (!SystemProperties.getBoolean("config.disable_noncore", false)) {
            traceBeginAndSlog("StartRecoverySystemService");
            mSystemServiceManager.startService(RecoverySystemService.class);
            traceEnd();
        }

       //省略。。
        mSystemServiceManager.startService(LightsService.class);
        //省略。。
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
       //省略。。
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
       //省略。。
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
        //省略。。
           OtaDexoptService.main(mSystemContext, mPackageManagerService);
         //省略。。
        mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
      //省略。。
        mActivityManagerService.setSystemProcess();
       //省略。。
        mDisplayManagerService.setupSchedulerPolicies();

      //省略。。
        mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
         //省略。。
            startSensorService();
         //省略。。
        }, START_SENSOR_SERVICE);
    }

这个里面代码主要就是启动一些服务,这些服务需要放在第一位进行启动,因为很可能后面服务对这些都是有依赖关系。
这里只对ActivityManagerService的启动进行一个例子分析,其他的服务就大概思路一样,不再单独分析:

 mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();

接下来分析 mSystemServiceManager.startService方法:

 public <T extends SystemService> T startService(Class<T> serviceClass) {
         //省略
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
         //省略
            startService(service);//调用自己的startService
            return service;
    //省略
    }
    
    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
      //省略
            service.onStart();
        //省略
    }

最后分析其实师调用了serviceClass的onStart方法,这里的serviceClass是 ActivityManagerService.Lifecycle.class

 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();
        }

        @Override
        public void onCleanupUser(int userId) {
            mService.mBatteryStatsService.onCleanupUser(userId);
        }

        public ActivityManagerService getService() {
            return mService;
        }
    }

这里看到构造时候 mService = new ActivityManagerService(context);把ActivityManagerService构造了,getService()也是直接返回的ActivityManagerService对象,onStart也是调用了ActivityManagerService的start方法

其他的另外两个也是和第一个类是启动服务,只是构造service方法上有细微差别,这里就不挨个具体分析了
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();

这里最后一步的startOtherServices不仅仅只启动了一些Service,在启动完了各个Service后,它还会调用各个Service的systemReady方法:

// It is now time to start up the app processes...
  vibrator.systemReady();
  lockSettings.systemReady();
  wm.systemReady();
  mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
  mPackageManagerService.systemReady();
  mDisplayManagerService.systemReady(safeMode, mOnlyCore);
   mActivityManagerService.systemReady(..)

这里只列出了主要的几个systemReady方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容