Android應用程式進程啟動過程的原始碼分析(一)

來源:互聯網
上載者:User

Android應用程式架構層建立的應用程式進程具有兩個特點,一是進程的入口函數是ActivityThread.main,二是進程天然支援 Binder處理序間通訊機制;這兩個特點都是在進程的初始化過程中實現的,本文將詳細分析Android應用程式進程建立過程中是如何?這兩個特點的。

Android應用程式架構層建立的應用程式進程的入口函數是ActivityThread.main比較好理解,即進程建立完成之 後,Android應用程式架構層就會在這個進程中將ActivityThread類載入進來,然後執行它的main函數,這個main函數就是進程執行 訊息迴圈的地方了。Android應用程式架構層建立的應用程式進程天然支援Binder處理序間通訊機制這個特點應該怎麼樣理解呢?前面我們在學習 Android系統的Binder處理序間通訊機制時說到,它具有四個組件,分別是驅動程式、守護進程、Client以及Server,其中Server組 件在初始化時必須進入一個迴圈中不斷地與Binder驅動程式進行到互動,以便獲得Client組件發送的請求,具體可參考Android系統處理序間通訊 (IPC)機制Binder中的Server啟動過程原始碼分析一文,但是,當我們在Android應用程式中實現Server組件的時候,我們並沒有讓 進程進入一個迴圈中去等待Client組件的請求,然而,當Client組件得到這個Server組件的遠程介面時,卻可以順利地和Server組件進行 處理序間通訊,這就是因為Android應用程式進程在建立的時候就已經啟動了一個線程池來支援Server組件和Binder驅動程式之間的互動了,這 樣,極大地方便了在Android應用程式中建立Server組件。

在Android應用程式架構層中,是由ActivityManagerService組件負責為Android應用程式建立新的進程的,它本來也是 運行在一個獨立的進程之中,不過這個進程是在系統啟動的過程中建立的。ActivityManagerService組件一般會在什麼情況下會為應用程式 建立一個新的進程呢?當系統決定要在一個新的進程中啟動一個Activity或者Service時,它就會建立一個新的進程了,然後在這個新的進程中啟動 這個Activity或者Service,具體可以參考Android系統在新進程中啟動自訂服務過程(startService)的原理分析、 Android應用程式啟動過程原始碼分析和Android應用程式在新的進程中啟動新的Activity的方法和過程分析這三篇文章。

ActivityManagerService啟動新的進程是從其成員函數startProcessLocked開始的,在深入分析這個過程之前,我們先來看一下進程建立過程的順序圖表,然後再詳細分析每一個步驟。

Step 1. ActivityManagerService.startProcessLocked

這個函數定義在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java檔案中:

 
  1. [java] view plaincopypublic final class ActivityManagerService extends 
  2. ActivityManagerNative 
  3. implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { 
  4. ...... 
  5. private final void startProcessLocked(ProcessRecord app, 
  6. String hostingType, String hostingNameStr) { 
  7. ...... 
  8. try { 
  9. int uid = app.info.uid; 
  10. int[] gids = null; 
  11. try { 
  12. gids = mContext.getPackageManager().getPackageGids( 
  13. app.info.packageName); 
  14. } catch (PackageManager.NameNotFoundException e) { 
  15. ...... 
  16. ...... 
  17. int debugFlags = 0; 
  18. ...... 
  19. int pid = Process.start("android.app.ActivityThread", 
  20. mSimpleProcessManagement ? app.processName : null, uid, uid, 
  21. gids, debugFlags, null); 
  22. ...... 
  23. } catch (RuntimeException e) { 
  24. ...... 
  25. ...... 

它調用了Process.start函數開始為應用程式建立新的進程,注意,它傳入一個第一個參數 為"android.app.ActivityThread",這就是進程初始化時要載入的Java類了,把這個類載入到進程之後,就會把它裡面的靜態成 員函數main作為進程的進入點,後面我們會看到。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.