自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android應(yīng)用程序進(jìn)程啟動(dòng)過(guò)程的源代碼分析(一)

移動(dòng)開(kāi)發(fā) Android
Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程具有兩個(gè)特點(diǎn),一是進(jìn)程的入口函數(shù)是ActivityThread.main,二是進(jìn)程天然支持 Binder進(jìn)程間通信機(jī)制;這兩個(gè)特點(diǎn)都是在進(jìn)程的初始化過(guò)程中實(shí)現(xiàn)的,本文將詳細(xì)分析Android應(yīng)用程序進(jìn)程創(chuàng)建過(guò)程中是如何實(shí)現(xiàn)這兩個(gè)特點(diǎn)的。

Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程具有兩個(gè)特點(diǎn),一是進(jìn)程的入口函數(shù)是ActivityThread.main,二是進(jìn)程天然支持 Binder進(jìn)程間通信機(jī)制;這兩個(gè)特點(diǎn)都是在進(jìn)程的初始化過(guò)程中實(shí)現(xiàn)的,本文將詳細(xì)分析Android應(yīng)用程序進(jìn)程創(chuàng)建過(guò)程中是如何實(shí)現(xiàn)這兩個(gè)特點(diǎn)的。

Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程的入口函數(shù)是ActivityThread.main比較好理解,即進(jìn)程創(chuàng)建完成之 后,Android應(yīng)用程序框架層就會(huì)在這個(gè)進(jìn)程中將ActivityThread類(lèi)加載進(jìn)來(lái),然后執(zhí)行它的main函數(shù),這個(gè)main函數(shù)就是進(jìn)程執(zhí)行 消息循環(huán)的地方了。Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程天然支持Binder進(jìn)程間通信機(jī)制這個(gè)特點(diǎn)應(yīng)該怎么樣理解呢?前面我們?cè)趯W(xué)習(xí) Android系統(tǒng)的Binder進(jìn)程間通信機(jī)制時(shí)說(shuō)到,它具有四個(gè)組件,分別是驅(qū)動(dòng)程序、守護(hù)進(jìn)程、Client以及Server,其中Server組 件在初始化時(shí)必須進(jìn)入一個(gè)循環(huán)中不斷地與Binder驅(qū)動(dòng)程序進(jìn)行到交互,以便獲得Client組件發(fā)送的請(qǐng)求,具體可參考Android系統(tǒng)進(jìn)程間通信 (IPC)機(jī)制Binder中的Server啟動(dòng)過(guò)程源代碼分析一文,但是,當(dāng)我們?cè)贏(yíng)ndroid應(yīng)用程序中實(shí)現(xiàn)Server組件的時(shí)候,我們并沒(méi)有讓 進(jìn)程進(jìn)入一個(gè)循環(huán)中去等待Client組件的請(qǐng)求,然而,當(dāng)Client組件得到這個(gè)Server組件的遠(yuǎn)程接口時(shí),卻可以順利地和Server組件進(jìn)行 進(jìn)程間通信,這就是因?yàn)锳ndroid應(yīng)用程序進(jìn)程在創(chuàng)建的時(shí)候就已經(jīng)啟動(dòng)了一個(gè)線(xiàn)程池來(lái)支持Server組件和Binder驅(qū)動(dòng)程序之間的交互了,這 樣,極大地方便了在A(yíng)ndroid應(yīng)用程序中創(chuàng)建Server組件。

在A(yíng)ndroid應(yīng)用程序框架層中,是由ActivityManagerService組件負(fù)責(zé)為Android應(yīng)用程序創(chuàng)建新的進(jìn)程的,它本來(lái)也是 運(yùn)行在一個(gè)獨(dú)立的進(jìn)程之中,不過(guò)這個(gè)進(jìn)程是在系統(tǒng)啟動(dòng)的過(guò)程中創(chuàng)建的。ActivityManagerService組件一般會(huì)在什么情況下會(huì)為應(yīng)用程序 創(chuàng)建一個(gè)新的進(jìn)程呢?當(dāng)系統(tǒng)決定要在一個(gè)新的進(jìn)程中啟動(dòng)一個(gè)Activity或者Service時(shí),它就會(huì)創(chuàng)建一個(gè)新的進(jìn)程了,然后在這個(gè)新的進(jìn)程中啟動(dòng) 這個(gè)Activity或者Service,具體可以參考Android系統(tǒng)在新進(jìn)程中啟動(dòng)自定義服務(wù)過(guò)程(startService)的原理分析、 Android應(yīng)用程序啟動(dòng)過(guò)程源代碼分析和Android應(yīng)用程序在新的進(jìn)程中啟動(dòng)新的Activity的方法和過(guò)程分析這三篇文章。

ActivityManagerService啟動(dòng)新的進(jìn)程是從其成員函數(shù)startProcessLocked開(kāi)始的,在深入分析這個(gè)過(guò)程之前,我們先來(lái)看一下進(jìn)程創(chuàng)建過(guò)程的序列圖,然后再詳細(xì)分析每一個(gè)步驟。

Step 1. ActivityManagerService.startProcessLocked

這個(gè)函數(shù)定義在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.   } 

它調(diào)用了Process.start函數(shù)開(kāi)始為應(yīng)用程序創(chuàng)建新的進(jìn)程,注意,它傳入一個(gè)***個(gè)參數(shù) 為"android.app.ActivityThread",這就是進(jìn)程初始化時(shí)要加載的Java類(lèi)了,把這個(gè)類(lèi)加載到進(jìn)程之后,就會(huì)把它里面的靜態(tài)成 員函數(shù)main作為進(jìn)程的入口點(diǎn),后面我們會(huì)看到。

責(zé)任編輯:閆佳明 來(lái)源: bbs.9ria
相關(guān)推薦

2014-06-19 14:30:28

Android應(yīng)用程序進(jìn)程啟動(dòng)

2014-06-20 11:20:37

Android應(yīng)用程序進(jìn)程啟動(dòng)

2014-06-19 14:54:11

Android應(yīng)用程序進(jìn)程啟動(dòng)

2014-06-19 14:59:40

Android應(yīng)用程序進(jìn)程啟動(dòng)

2014-06-20 11:05:56

Android應(yīng)用程序進(jìn)程啟動(dòng)

2014-06-20 11:09:35

Android應(yīng)用程序進(jìn)程啟動(dòng)

2014-06-20 11:24:34

Android應(yīng)用程序進(jìn)程啟動(dòng)

2012-02-20 14:47:08

JavaPlay

2014-05-22 15:00:16

Android消息處理機(jī)制Looper

2011-08-17 16:16:29

iPhone應(yīng)用程序啟動(dòng)過(guò)程

2011-07-28 10:34:38

Cocoa 程序 啟動(dòng)

2014-06-23 10:31:09

Android啟動(dòng)過(guò)程

2011-06-28 13:27:13

ARM Linux

2014-07-31 10:06:01

谷歌Google應(yīng)用

2012-08-16 09:07:57

Erlang

2018-03-13 13:00:03

Linux運(yùn)維啟動(dòng)分析

2024-09-11 09:25:03

Tomcat組件PREP

2022-08-29 17:34:05

鴻蒙操作系統(tǒng)

2014-05-22 15:45:58

Android消息處理機(jī)制Looper

2009-08-14 17:57:43

ASP.NET MVC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)