国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一個APP從啟動到主頁面顯示經歷了哪些過程?

移動開發 Android
本文以圖文并茂的形式簡單介紹一個APP從啟動到主頁面顯示經歷了哪些流程,以及實現的原理。不介紹具體源碼,僅僅構建一個大體框架。

本文以圖文并茂的形式簡單介紹一個APP從啟動到主頁面顯示經歷了哪些流程,以及實現的原理。不介紹具體源碼,僅僅構建一個大體框架。

***程概述

 

流程

 

啟動流程:

①點擊桌面App圖標,Launcher進程采用Binder IPC向system_server進程發起startActivity請求;

②system_server進程接收到請求后,向zygote進程發送創建進程的請求;

③Zygote進程fork出新的子進程,即App進程;

④App進程,通過Binder IPC向sytem_server進程發起attachApplication請求;

⑤system_server進程在收到請求后,進行一系列準備工作后,再通過binder IPC向App進程發送scheduleLaunchActivity請求;

⑥App進程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程發送LAUNCH_ACTIVITY消息;

⑦主線程在收到Message后,通過發射機制創建目標Activity,并回調Activity.onCreate()等方法。

⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束后便可以看到App的主界面。

上面的一些列步驟簡單介紹了一個APP啟動到主頁面顯示的過程,可能這些流程中的一些術語看的有些懵,什么是Launcher,什么是zygote,什么是applicationThread.....

下面我們一一介紹。

二、理論基礎

1.zygote

zygote意為“受精卵“。Android是基于Linux系統的,而在Linux中,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。

在Android系統里面,zygote是一個進程的名字。Android是基于Linux System的,當你的手機開機的時候,Linux的內核加載完成之后就會啟動一個叫“init“的進程。在Linux System里面,所有的進程都是由init進程fork出來的,我們的zygote進程也不例外。

我們都知道,每一個App其實都是

  • 一個單獨的dalvik虛擬機
  • 一個單獨的進程

所以當系統里面的***個zygote進程運行之后,在這之后再開啟App,就相當于開啟一個新的進程。而為了實現資源共用和更快的啟動速度,Android系統開啟新進程的方式,是通過fork***個zygote進程實現的。所以說,除了***個zygote進程,其他應用所在的進程都是zygote的子進程,這下你明白為什么這個進程叫“受精卵”了吧?因為就像是一個受精卵一樣,它能快速的分裂,并且產生遺傳物質一樣的細胞!

2.system_server

SystemServer也是一個進程,而且是由zygote進程fork出來的。

知道了SystemServer的本質,我們對它就不算太陌生了,這個進程是Android Framework里面兩大非常重要的進程之一——另外一個進程就是上面的zygote進程。

為什么說SystemServer非常重要呢?因為系統里面重要的服務都是在這個進程里面開啟的,比如

ActivityManagerService、PackageManagerService、WindowManagerService等等。

3.ActivityManagerService

ActivityManagerService,簡稱AMS,服務端對象,負責系統中所有Activity的生命周期。

ActivityManagerService進行初始化的時機很明確,就是在SystemServer進程開啟的時候,就會初始化ActivityManagerService。

下面介紹下Android系統里面的服務器和客戶端的概念。

其實服務器客戶端的概念不僅僅存在于Web開發中,在Android的框架設計中,使用的也是這一種模式。服務器端指的就是所有App共用的系統服務,比如我們這里提到的ActivityManagerService,和前面提到的PackageManagerService、WindowManagerService等等,這些基礎的系統服務是被所有的App公用的,當某個App想實現某個操作的時候,要告訴這些系統服務,比如你想打開一個App,那么我們知道了包名和MainActivity類名之后就可以打開

  1. Intent intent = new Intent(Intent.ACTION_MAIN);   
  2.  
  3. intent.addCategory(Intent.CATEGORY_LAUNCHER);               
  4.  
  5. ComponentName cn = new ComponentName(packageName, className);               
  6.  
  7. intent.setComponent(cn);   
  8.  
  9. startActivity(intent); 

 

但是,我們的App通過調用startActivity()并不能直接打開另外一個App,這個方法會通過一系列的調用,***還是告訴AMS說:“我要打開這個App,我知道他的住址和名字,你幫我打開吧!”所以是AMS來通知zygote進程來fork一個新進程,來開啟我們的目標App的。這就像是瀏覽器想要打開一個超鏈接一樣,瀏覽器把網頁地址發送給服務器,然后還是服務器把需要的資源文件發送給客戶端的。

知道了Android Framework的客戶端服務器架構之后,我們還需要了解一件事情,那就是我們的App和AMS(SystemServer進程)還有zygote進程分屬于三個獨立的進程,他們之間如何通信呢?

App與AMS通過Binder進行IPC通信,AMS(SystemServer進程)與zygote通過Socket進行IPC通信。后面具體介紹。

那么AMS有什么用呢?在前面我們知道了,如果想打開一個App的話,需要AMS去通知zygote進程,除此之外,其實所有的Activity的開啟、暫停、關閉都需要AMS來控制,所以我們說,AMS負責系統中所有Activity的生命周期。

在Android系統中,任何一個Activity的啟動都是由AMS和應用程序進程(主要是ActivityThread)相互配合來完成的。AMS服務統一調度系統中所有進程的Activity啟動,而每個Activity的啟動過程則由其所屬的進程具體來完成。

4.Launcher

當我們點擊手機桌面上的圖標的時候,App就由Launcher開始啟動了。但是,你有沒有思考過Launcher到底是一個什么東西?

Launcher本質上也是一個應用程序,和我們的App一樣,也是繼承自Activity

packages/apps/Launcher2/src/com/android/launcher2/Launcher.java

 

  1. public final class Launcher extends Activity 
  2.  
  3.         implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, 
  4.  
  5.                    View.OnTouchListener { 
  6.  
  7.                    } 

 

Launcher實現了點擊、長按等回調接口,來接收用戶的輸入。既然是普通的App,那么我們的開發經驗在這里就仍然適用,比如,我們點擊圖標的時候,是怎么開啟的應用呢?捕捉圖標點擊事件,然后startActivity()發送對應的Intent請求唄!是的,Launcher也是這么做的,就是這么easy!

5.Instrumentation和ActivityThread

每個Activity都持有Instrumentation對象的一個引用,但是整個進程只會存在一個Instrumentation對象。

Instrumentation這個類里面的方法大多數和Application和Activity有關,這個類就是完成對Application和Activity初始化和生命周期的工具類。Instrumentation這個類很重要,對Activity生命周期方法的調用根本就離不開他,他可以說是一個大管家。

ActivityThread,就是UI線程。App和AMS是通過Binder傳遞信息的,那么ActivityThread就是專門與AMS的外交工作的。

6.ApplicationThread

前面我們已經知道了App的啟動以及Activity的顯示都需要AMS的控制,那么我們便需要和服務端的溝通,而這個溝通是雙向的。

客戶端-->服務端

 

 

而且由于繼承了同樣的公共接口類,ActivityManagerProxy提供了與ActivityManagerService一樣的函數原型,使用戶感覺不出Server是運行在本地還是遠端,從而可以更加方便的調用這些重要的系統服務。

服務端-->客戶端

還是通過Binder通信,不過是換了另外一對,換成了ApplicationThread和ApplicationThreadProxy。

 

 

他們也都實現了相同的接口IApplicationThread

  1. private class ApplicationThread extends ApplicationThreadNative {} 
  2.  
  3.  public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}  class ApplicationThreadProxy implements IApplicationThread {} 

 

好了,前面羅里吧嗦的一大堆,介紹了一堆名詞,可能不太清楚,沒關系,下面結合流程圖介紹。

三、啟動流程

1.創建進程

①先從Launcher的startActivity()方法,通過Binder通信,調用ActivityManagerService的startActivity方法。

②一系列折騰,***調用startProcessLocked()方法來創建新的進程。

③該方法會通過前面講到的socket通道傳遞參數給Zygote進程。Zygote孵化自身。調用ZygoteInit.main()方法來實例化ActivityThread對象并最終返回新進程的pid。

④調用ActivityThread.main()方法,ActivityThread隨后依次調用Looper.prepareLoop()和Looper.loop()來開啟消息循環。

方法調用流程圖如下:

 

 

更直白的流程解釋:

 

 

①App發起進程:當從桌面啟動應用,則發起進程便是Launcher所在進程;當從某App內啟動遠程進程,則發送進程便是該App所在進程。發起進程先通過binder發送消息給system_server進程;

②system_server進程:調用Process.start()方法,通過socket向zygote進程發送創建新進程的請求;

③zygote進程:在執行ZygoteInit.main()后便進入runSelectLoop()循環體內,當有客戶端連接時便會執行ZygoteConnection.runOnce()方法,再經過層層調用后fork出新的應用進程;

④新進程:執行handleChildProc方法,***調用ActivityThread.main()方法。

2.綁定Application

上面創建進程后,執行ActivityThread.main()方法,隨后調用attach()方法。

將進程和指定的Application綁定起來。這個是通過上節的ActivityThread對象中調用bindApplication()方法完成的。該方法發送一個BIND_APPLICATION的消息到消息隊列中, 最終通過handleBindApplication()方法處理該消息. 然后調用makeApplication()方法來加載App的classes到內存中。

方法調用流程圖如下:

 

 

更直白的流程解釋:

 

 

(如果看不懂AMS,ATP等名詞,后面有解釋)

3.顯示Activity界面

經過前兩個步驟之后, 系統已經擁有了該application的進程。 后面的調用順序就是普通的從一個已經存在的進程中啟動一個新進程的activity了。

實際調用方法是realStartActivity(), 它會調用application線程對象中的scheduleLaunchActivity()發送一個LAUNCH_ACTIVITY消息到消息隊列中, 通過 handleLaunchActivity()來處理該消息。在 handleLaunchActivity()通過performLaunchActiivty()方法回調Activity的onCreate()方法和onStart()方法,然后通過handleResumeActivity()方法,回調Activity的onResume()方法,最終顯示Activity界面。

 

 

更直白的流程解釋:

 

 

四、Binder通信

 

 

簡稱:

ATP: ApplicationThreadProxy

AT: ApplicationThread

AMP: ActivityManagerProxy

AMS: ActivityManagerService

圖解:

①system_server進程中調用startProcessLocked方法,該方法最終通過socket方式,將需要創建新進程的消息告知Zygote進程,并阻塞等待Socket返回新創建進程的pid;

②Zygote進程接收到system_server發送過來的消息, 則通過fork的方法,將zygote自身進程復制生成新的進程,并將ActivityThread相關的資源加載到新進程app process,這個進程可能是用于承載activity等組件;

③ 在新進程app process向servicemanager查詢system_server進程中binder服務端AMS, 獲取相對應的Client端,也就是AMP. 有了這一對binder c/s對, 那么app process便可以通過binder向跨進程system_server發送請求,即attachApplication()

④system_server進程接收到相應binder操作后,經過多次調用,利用ATP向app process發送binder請求, 即bindApplication.

system_server擁有ATP/AMS, 每一個新創建的進程都會有一個相應的AT/AMP,從而可以跨進程 進行相互通信. 這便是進程創建過程的完整生態鏈。

以上大概介紹了一個APP從啟動到主頁面顯示經歷的流程,主要從宏觀角度介紹了其過程,具體可結合源碼理解。

責任編輯:龐桂玉 來源: 安卓巴士Android開發者門戶
相關推薦

2023-10-30 23:14:57

瀏覽器URL網頁

2024-05-21 12:51:06

Python對象PyObject

2024-05-22 13:04:46

Python對象關系

2024-11-15 16:27:58

函數結構存儲

2020-03-18 08:56:27

頁面網址內容

2022-03-28 08:20:49

線程編程語言線程操作系統

2018-09-14 14:20:43

人肉智能運維

2020-08-26 09:05:03

函數編譯詞法

2025-10-09 07:25:00

2023-08-09 14:43:42

應用開發ArkTS

2009-07-06 08:19:11

內向女生求職經歷

2016-01-29 10:32:32

KDEKDE PlatforQt 框架

2011-09-14 09:48:09

2024-10-20 13:28:47

虛擬機字節碼CPU

2017-11-14 16:38:05

智慧新城

2017-05-25 12:40:06

SOA微服務系統

2025-08-27 09:33:42

2018-06-14 10:40:02

人工智能機器人機器學習

2024-08-29 12:37:11

2014-09-25 09:51:29

Android App個人博客
點贊
收藏

51CTO技術棧公眾號

色中文字幕在线观看| 久久伊99综合婷婷久久伊| 成人日日夜夜| 欧美日韩黄色一级片| 大波视频国产精品久久| 在线播放日韩专区| 欧美视频一区在线| 亚洲欧洲av在线| 国产91色综合久久免费分享| 一区二区三区四区日韩| 亚洲精品一区av| 色在线免费观看| aⅴ在线视频男人的天堂| 成人网址大全| 欧美老熟妇喷水| 裸体裸乳免费看| 日韩精品无码一区二区三区| 亚洲已满18点击进入在线看片 | 亚洲一区二区三区爽爽爽爽爽 | 欧美亚洲国产bt| 亚洲永久免费视频| 国产精品嫩草99a| 日韩激情电影| 中文字幕在线视频网| 国产97色在线 | 日韩| 日韩精品久久一区二区| 亚洲午夜激情| 亚洲欧洲日本国产| 亚洲精品一区二区三区av| 干日本少妇首页| 日本一区免费在线观看| 久久久成人精品视频| 性做久久久久久久免费看| 精品亚洲国内自在自线福利| 国产伦子伦对白在线播放观看| 国产精品自拍三区| 亚洲黄色网址在线观看| 欧美va天堂va视频va在线| 欧美日韩国产一区二区| 国产乱淫av一区二区三区| 国产传媒在线播放| 成人一对一视频| 日本精品久久电影| 精品国偷自产在线视频| 亚洲精品一区二三区不卡| 欧美日韩亚洲高清一区二区| 久久国产成人午夜av影院| 国产卡一卡二在线| 亚洲一区二区黄| 久久综合999| 久久91精品| 自拍视频在线| 欧美一级黄色录像片| 欧美黑人xxxx| 色综合夜色一区| 韩国欧美一区二区| 日本国产精品| av在线日韩国产精品| 大桥未久一区二区| 欧美诱惑福利视频| 欧美美女视频在线观看| 国产成人亚洲精品狼色在线| 久久99精品国产自在现线| 国产在线网站| 亚洲国产精品女人| 日本中文字幕不卡免费| 欧美巨大另类极品videosbest | 欧美日韩一区二| 中文字幕精品久久| 亚洲免费资源在线播放| 亚洲精品99久久久久| 136导航精品福利| 宅男视频免费在线观看视频| 国产精品99久久久久久久女警| 国产乱妇无码大片在线观看| 亚洲国产精品电影| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲精品一区二区三区在线观看| 欧美成人小视频| 99re6在线| 中文字幕一区在线| 亚洲国产免费| 国产95亚洲| 日韩毛片久久久| 男人添女人下部高潮视频在观看 | 国产精华一区二区三区| 日韩在线观看电影完整版高清免费| 欧美亚洲国产成人精品| 国产一区二区精品免费| av黄色在线网站| 国产私人影院| 欧美高潮视频| 四虎成人免费在线| 日韩加勒比系列| 97福利电影| 国产玉足脚交久久欧美| 日韩少妇中文字幕| 成人亲热视频网站| 日本视频一区二区不卡| 日本视频一区在线观看| 日韩欧美一级精品久久| 欧美激情精品久久久久| 色开心亚洲综合| 亚洲国产精品ⅴa在线观看| 91精品国产综合久久久久久蜜臀 | 日韩西西人体444www| 久久中文精品视频| 国产精品流白浆视频| 韩国无码av片在线观看网站| 激情av网站| 麻豆精品在线| 久久亚洲风情| 国产精品短视频| 日韩专区在线观看| 丰满女人性猛交| 日本激情视频在线观看| 亚洲自拍都市欧美小说| 国产精品亚洲第一区在线暖暖韩国 | 成人黄色图片网站| 日本一区二区三区视频| 在线成人www免费观看视频| 亚洲视频在线观看三级| xvideos成人免费中文版| 色妞久久福利网| 97超视频免费观看| 亚洲色图都市激情| h片在线观看网站| 影音先锋中文字幕一区| 性做久久久久久免费观看| 日本成人激情视频| 日韩av不卡在线播放| wwwav91com| 亚洲先锋成人| 欧美视频一区二区三区| 国产日韩换脸av一区在线观看| 免费久久一级欧美特大黄| 污污软件在线观看| 国产精品欧美大片| 另类av导航| 99热在线免费| 久久男人av| 亚洲高清不卡在线| 91香蕉电影院| 免费h视频在线观看| 久久综合九色综合久久久精品综合| 大白屁股一区二区视频| 午夜久久中文| 久久久资源网| 国产精品㊣新片速递bt| 亚洲欧美在线精品| 69堂免费视频| 水蜜桃在线免费观看| 亚洲国产欧美一区二区三区不卡| 国产一区二区在线观看免费播放| 成人有码在线视频| 国产色综合天天综合网 | 1769国产精品| 欧美人与性动交a欧美精品| 中文字幕一区电影| 成人高清网站| 警花观音坐莲激情销魂小说| 精品一区二区不卡| 久久99影院| 蜜桃一区二区三区在线观看| 国产成人亚洲一区二区三区| 高清在线视频不卡| 日韩男人天堂| 国产成人在线色| 91成人伦理在线电影| 欧美视频免费一区二区三区| 中文有码一区| 日韩欧美一区视频| 免费观看国产视频在线| 亚洲影院久久精品| 亚洲摸摸操操av| 91久久偷偷做嫩草影院电| 一区二区三区四区在线| 国产狼人综合免费视频| 国产在线视频网| 欧美日韩国产探花| 色呦呦国产精品| 懂色一区二区三区av片| 日本国产亚洲| 91麻豆精品国产自产在线观看一区 | 日韩视频亚洲视频| 夜夜嗨av一区二区三区四区| 国产亚洲精品久久久优势| 国产亚洲一级高清| 久久香蕉国产线看观看网| 欧美成人一区在线| 国产精品久久精品| 国产一区二区三区四区五区在线| 欧美另类一区| a级黄色小视频| 超碰av在线免费观看| 男人在线视频资源| 韩国中文字幕2020精品| 色婷婷在线播放| 亚洲国产天堂| 欧美日韩国产免费观看视频|