成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android應用程序進程啟動過程的源代碼分析(一)

移動開發 Android
Android應用程序框架層創建的應用程序進程具有兩個特點,一是進程的入口函數是ActivityThread.main,二是進程天然支持 Binder進程間通信機制;這兩個特點都是在進程的初始化過程中實現的,本文將詳細分析Android應用程序進程創建過程中是如何實現這兩個特點的。

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.   ...... 
  18.   int debugFlags = 0
  19.   ...... 
  20.   int pid = Process.start("android.app.ActivityThread"
  21.   mSimpleProcessManagement ? app.processName : null, uid, uid, 
  22.   gids, debugFlags, null); 
  23.   ...... 
  24.   } catch (RuntimeException e) { 
  25.   ...... 
  26.   } 
  27.   } 
  28.   ...... 
  29.   } 

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

責任編輯:閆佳明 來源: bbs.9ria
相關推薦

2014-06-20 11:05:56

Android應用程序進程啟動

2014-06-20 11:09:35

Android應用程序進程啟動

2014-06-20 11:24:34

Android應用程序進程啟動

2014-06-19 14:30:28

Android應用程序進程啟動

2014-06-19 14:54:11

Android應用程序進程啟動

2014-06-19 14:59:40

Android應用程序進程啟動

2014-06-20 11:20:37

Android應用程序進程啟動

2012-02-20 14:47:08

JavaPlay

2014-05-22 15:00:16

Android消息處理機制Looper

2011-08-17 16:16:29

iPhone應用程序啟動過程

2011-07-28 10:34:38

Cocoa 程序 啟動

2011-06-28 13:27:13

ARM Linux

2014-06-23 10:31:09

Android啟動過程

2014-07-31 10:06:01

谷歌Google應用

2024-09-11 09:25:03

Tomcat組件PREP

2022-08-29 17:34:05

鴻蒙操作系統

2012-08-16 09:07:57

Erlang

2018-03-13 13:00:03

Linux運維啟動分析

2009-08-14 17:57:43

ASP.NET MVC

2014-05-22 15:45:58

Android消息處理機制Looper
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜男人的天堂 | 久草热在线 | 一级黄色片网址 | 高清不卡毛片 | 国产精品国产 | 成人精品一区亚洲午夜久久久 | 成人欧美一区二区三区在线观看 | 欧美日韩精品国产 | 亚洲免费成人av | 欧美成人精品一区二区男人看 | 成人免费看片又大又黄 | 亚洲精品在线免费观看视频 | 精品一区二区三区av | 97色在线观看免费视频 | 欧美日韩精选 | 亚洲国产成人精品女人久久久 | 国产高清在线精品一区二区三区 | 亚洲国产欧美国产综合一区 | 精品一区二区三区免费视频 | 九九久久在线看 | 在线不卡av | 老司机深夜福利网站 | 中文字幕日韩欧美一区二区三区 | 韩日有码 | 毛片视频网址 | 日韩成人在线免费视频 | 久久免费精品 | 国产一区二区免费在线 | 精品久久久一区 | 免费在线观看av | 可以在线看的黄色网址 | 黑人巨大精品欧美一区二区免费 | 日韩精品一区二区三区视频播放 | 日韩精品亚洲专区在线观看 | 国产免费一区二区 | 在线黄色影院 | 亚洲视频中文 | 精品久久久久久国产 | 久久里面有精品 | 国产精品亚洲一区二区三区在线 | 欧美性生活一区二区三区 |