从Android系统启动说起

作者: 十蛋stan | 来源:发表于2018-07-21 22:53 被阅读21次

    前言:
    看源码也有一段时间了,为了能更深刻的理解Android源码,我准备把看过的源码用自己的思维捋一遍,通过写博客逼迫自己认真去理解.源码太庞大了,尽量能抛开繁琐的源代码把他们的功能讲出来.每次只讲某一段逻辑的源码实现,这样读起来就不会太累.

    Android系统启动的第一个进程是init进程,接着init通过解析init.rc依次启动ServiceManager进程,Zygote进程,SystemServer进程.
    SystemServer就是AMS,PMS,WMS等我们经常接触到的主要服务的宿主进程.
    SystemServer开始启动各种服务,入口函数为main

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

    run里面就开启了大部分的Service.
    startBootstrapServices();
    startCoreServices();
    startOtherServices();

    SystemServer:
     private void run() {
      ...
      try {
        traceBeginAndSlog("StartServices");
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
        SystemServerInitThreadPool.shutdown();
      } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
      } finally {
        traceEnd();
      }
      ...
    }
    

    startBootstrapServices()里就开启了常见的几个Service,比如ActivityManagerService,PowerManagerService等等
    startOtherServices()启动了PackageManagerService,VibratorService,AlarmManagerService,WindowManagerService等常见service

    SystemServer:
    private void startBootstrapServices() {
      ...
      traceBeginAndSlog("StartActivityManager");
      mActivityManagerService = mSystemServiceManager.startService(
                    ActivityManagerService.Lifecycle.class).getService();
      mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
      mActivityManagerService.setInstaller(installer);
      traceEnd();
      ...
      // Set up the Application instance for the system process and get started.
      traceBeginAndSlog("SetSystemProcess");
      mActivityManagerService.setSystemProcess();
      traceEnd();
      ...
    }
    

    这里是通过SystemServiceManager(一看名字就是SystemServer的管理类API-19新加的,老的源码是通过各个service的main方法去构造自己,比如ActivityManagerService.main())的startService()通过反射去构造各个服务.
    AMS启动后还要通过setSystemProcess()去向ServiceManager注册自己

    ActivityManagerService:
      public void setSystemProcess() {
            try {
                ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
                ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
                ServiceManager.addService("meminfo", new MemBinder(this));
                ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
                ServiceManager.addService("dbinfo", new DbBinder(this));
                if (MONITOR_CPU_USAGE) {
                    ServiceManager.addService("cpuinfo", new CpuBinder(this));
                }
                ServiceManager.addService("permission", new PermissionController(this));
                ServiceManager.addService("processinfo", new ProcessInfoService(this));
    
                ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                        "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
                mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
    
                synchronized (this) {
                    ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
                    app.persistent = true;
                    app.pid = MY_PID;
                    app.maxAdj = ProcessList.SYSTEM_ADJ;
                    app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
                    synchronized (mPidsSelfLocked) {
                        mPidsSelfLocked.put(app.pid, app);
                    }
                    updateLruProcessLocked(app, false, null);
                    updateOomAdjLocked();
                }
            } catch (PackageManager.NameNotFoundException e) {
                throw new RuntimeException(
                        "Unable to find android system package", e);
            }
        }
    

    从代码上可以看出他不仅注册的自己的主业务(ACTIVITY_SERVICE),还有很多比如内存管理("meninfo"),cpu管理("cpuinfo"),权限管理("permission")等等诸多副业.
    ActivityManagerService启动好之后,我们就可以去启动我们的应用程序了.Launcher程序就是一个特殊的应用程序.
    Activity的启动也是个复杂的过程就放到下一节来讲吧.

    类的总结:
    ServiceManager:Binder机制中的"DNS服务器",负责域名(某Binder服务在ServiceManager注册时提供的名称)到IP地址(Binder驱动分配)的解析.
    Zygote进程:字面意思"受精卵",是Android大多数应用和系统进程的孵化器.
    SystemServer:大部分服务的宿主Service,SystemServer启动后就进入Launcher主界面了.
    ActivityManagerService:寄生在SystemServer里.管理Activity,Service,Broadcast等生命周期.同时负责内存管理,CPU管理,权限管理等功能

    源码版本:API-27

    相关文章

      网友评论

        本文标题:从Android系统启动说起

        本文链接:https://www.haomeiwen.com/subject/mbchmftx.html