Android啟動研究(三)

來源:互聯網
上載者:User

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

 

 

 

 

 

 

    

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.