Android启动研究(三)

    技术2022-05-20  54

    Zygote初始化完成,创建的第一个进程为系统进程(SystemServer进程), 首先会执行此进程的main()方法,我们看main方法

     

    public static void main(String[] args) {

        ...

     

       System.loadLibrary("android_servers");

     

       init1(args) ;

     

    }

     

    从这个方法中就可以看出,首先加载了一个本地库android_servers.so库,然后调用init1() 方法,此方法是一个native方法,也就是说,这个方法是由C/C++实现的, 此方法据说是初始化一些系统级的服务,具体什么服务,还有待研究,但肯定的一点是,在init1()方法中会调用init2()方法,现在可以看看init2()方法中做了那些操作,

     

    public static final void init2() {

     

      Thread thr=new ServerThread();

      thr.start();

    }

     

    由此可以,此方法主要是启动了一个线程,那么我们具体分析ServerThread线程中的run()方法,

     

    在run()方法中主要启动了一系列服务,并且把这些服务一一添加到ServiceManager进程,由ServiceManager来统一管理,以后使用这些服务都会通过ServiceManager进程来读取, 示例代码如下:

     

         PowerManagerService power=new PowerManagerService();  // 创建电源管理服务

         ServiceManager.addService(Context.POWER_SERVICE,power); // 添加服务到ServiceManager

     

    其中最重要的两个服务是ActivityManagerService 和 WindowManagerService

     

    ActivityManagerService服务(简称是AMS服务)是管理android概念空间中的四大组件,包括Activity,Service,等的管理,生命周期的管理,状态维护等工作,

    注意,它是管理所有手机中所有应用程序的组件,并不是单独管理一个程序。

     

    WindowManagerService服务(简称是WMS服务)主要是管理Activity中窗口的管理,是管理手机中所有程序所有activity中的所有窗口,并不单间是管理一个程序中的窗口,

     

    我们先看AMS的初始化过程,

     

    1):首先调AMS的main()方法

    2):调用AMS的setSystemProcess()方法

    3):调用AMS的installSystemProviders()方法

    4):调用AMS的setWindowManager()方法

    5):调用AMS的systemReady方法

     

    1:AMS的main()方法分析:通过AThread内部类来创建AMS对象,调用ActivityThread类中的systemMain()方法,创建ActivityThread对象,最后调用AMS中的 startRunning();

     

    2:AMS中的setSystemProcess()方法分析:

     

         首先会把AMS添加到ServiceManager进程中,接着再添加MemBinder,CpuBinder,PermissionController到ServiceManager中

        我猜这三个的作用是:Cpu控制和权限控制,

       

       接着,会调用AMS中的newProcessRecordLocked()方法创建一个ActivityThread类的进程,按照IPC的概念,此类应该为表示客户端,而AMS表示服务端,此类的进程被封装成ProcessRecord类,在服务端ProcessRecord都表示为进程,创建完毕后,再看如下代码

       

        ProcessRecord app=mSelf.newProcessRecordLocked(mSystemThread.getApplicationThread(),info,info.processName);

        mSelf.mProcessNames.put(app,app.info.uid,app); 

        synchronized(mSelf.mPidsSelfLocked) {

           mSelf.mPidsSelfLocked.put(app.pid,app);

          

        }

        mSelf.updateLruProcessLocked(app,true,true);

     

     

    其中mSelf就是代表AMS自己,

    mProcessNames是一个HashMap,主要用来存放ProcessRecord对象,每创建一个新的进程,都会添加到此数据结构中,

    mPidsSelfLocked也是一个ProcessMap数据结构,存取方式为通过app.pid来查找ProcessRecord。

     

    从newProcessRecordLocked(thread,info,customProcess)方法中分析,要创建一个进程要的参数如下:

    IApplicationThread thread:

    ApplicationInfo info:// 进程的信息,包括名字,等内容

    String customProcess:进程名字

     

    再后来会调用updateLruProcessLocked()方法,来更新最后一次打开程序的列表,

     

    3:调用AMS的installSystemProviders()方法分析,这个方法的主要作用是:初始化与系统进程(system)相关的所有ContentProviders

     

        代码如下:

     

        public static final installSystemProviders() {

            List providers;

            synchronized(mSelf) {

               ProcessRecord app=mSelf.mProcessNames.get("system",Process.SYSTEM_UID);// 得到名字为system的进程

               providers=mSelf.generateApplicationProvidersLocked(app); //  得到所有与此进程相关的Providers

     

              ......

            

              if(providers!=null) {

                 mSystemThread.installSystemProviders(providers); // 通知客户端(ActivityThread)初始化providers

              }

     

           }

     

    }

     

    4:调用AMS的setWindowManager()方法,

     

         此方法主要作用是:把WindowManagerService赋给AMS中的一个实例,以便于AMS更好的控制WMS

     

     

     

     

     

     

        

     

     

     

     

     

     

     

     

     

     


    最新回复(0)