成人免费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 程序 啟動

2014-06-23 10:31:09

Android啟動過程

2011-06-28 13:27:13

ARM Linux

2014-07-31 10:06:01

谷歌Google應用

2012-08-16 09:07:57

Erlang

2018-03-13 13:00:03

Linux運維啟動分析

2024-09-11 09:25:03

Tomcat組件PREP

2022-08-29 17:34:05

鴻蒙操作系統

2009-08-14 17:57:43

ASP.NET MVC

2014-05-22 15:45:58

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

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品中文字幕 | 欧美福利久久 | 一区二区三区精品视频 | 罗宾被扒开腿做同人网站 | 亚洲人成人一区二区在线观看 | 日本网站免费在线观看 | 日本亚洲精品成人欧美一区 | 国产精品中文字幕在线 | 中文字幕国产视频 | 国产精品高潮呻吟久久久久 | 欧美成人免费电影 | 男人av在线播放 | 国产一区二区在线视频 | 午夜久久久久 | 色欧美片视频在线观看 | 一区二区精品电影 | 婷婷久久五月 | 成人天堂噜噜噜 | 中文日韩在线 | 人人叉| 亚洲精品在线观看视频 | 91久久精品国产 | 午夜噜噜噜 | 仙人掌旅馆在线观看 | 日韩高清国产一区在线 | 日本三级播放 | 99re6在线视频 | 日韩久久久久久 | 91麻豆精品一区二区三区 | 欧美精品福利视频 | 日中文字幕在线 | 久热m3u8 | 国产精品久久久久久婷婷天堂 | www.887色视频免费 | 午夜欧美 | 国产美女在线看 | 懂色中文一区二区在线播放 | 国产一区亚洲二区三区 | 久久99精品久久久久久 | 亚洲视频在线免费 | 欧美在线观看免费观看视频 |