安卓系統應用啟動流程分析

2021-02-13 內核工匠

隨著移動開發的興起,安卓系統的重要性愈加突顯。本文簡要介紹安卓系統上應用啟動流程,對於應用開發、系統定製以及性能優化人員來說,熟悉應用啟動流程會使得在今後的工作中更加得心應手,做到知其然,知其所以然。本文主要面向開發人員,假定讀者已有一定的安卓基礎。

本文以安卓P版本為基礎,不同安卓版本上應用啟動流程略有差異,但核心邏輯仍然一致。



冷啟動

這種方式應用需要完成完整的啟動過程,即創建進程、初始化資源及顯示應用界面,相比於另外兩種啟動模式,應用冷啟動耗時最長。

這種方式下應用進程已經啟動,通常只需將要顯示的activity帶到前臺即可,所以在該模式下應用可以較快速啟動。

這種方式需要完成部分冷啟動過程,比如進程已經創建,但要重新執行activity的onCreate()來創建要顯示的activity,這種模式下的啟動時間介於以上兩種之間。

本文主要介紹冷啟動的執行流程。

該進程是安卓上所有應用進程的父進程,在開機過程中由系統啟動並保持運行狀態。由於現在的安卓平臺大部分同時支持32位和64位應用,zygote也分為32位和64位兩個版本,其原理相同,在本文中不做區分。

安卓上的系統服務進程,絕大部分主要系統服務都駐留在該進程內,包括下文中介紹的AMS、WMS、PMS等。system_server由zygote在啟動進程中分裂而來(即也是zygote的子進程),然後持續運行。

Activity Manager Service,是安卓上的一個核心服務,負責管理應用各個組件,所有應用在其生命周期內均需和AMS打交道。該服務駐留在system_server進程內。 

Window Manager Service,是安卓上的窗口管理服務,負責處理應用的界面顯示相關的請求。該服務駐留在system_server進程內。

Package Manager Service,是安卓上的包管理服務,負責處理應用的安裝、缷載等。該服務駐留在system_server進程內。

1. 在AMS端分配應用資源;

2. 顯示應用的空白啟動窗口;

3. 創建應用進程;

1. 創建應用對象;

2. 啟動主線程;

3. 創建主activity並完成繪製及顯示;

應用進程完成第一幀繪製後,系統會將空白窗口替換為應用的畫面,此時,用戶可以開始使用應用。

接下來,我們以一個典型場景,即從桌面點擊應用圖標啟動應用這一過程,來介紹應用啟動流程。其它應用啟動場景,比如從命令行啟動,或者從A應用啟動B應用,與本場景大同小異,本文中不再另做說明。

先看下簡要的流程圖:

如上圖所示,當用戶點擊桌面上應用圖標後,Launcher進程會將應用信息發送給AMS,由於這時應用進程還沒有啟動,所以需要先創建應用進程,AMS收到請求後會發送命令給zygote進程要求創建目標應用進程,當目標進程啟動後,會將自身的遠程handle註冊給AMS,這樣AMS就可以控制應用進程去執行接下來的一系列啟動操作。

接下來,我們對這一過程做下詳細說明。

1. 用戶點擊應用圖標後,launcher進程向system_server進程發消息請求啟動應用進程,即launcher通過startActivity()向AMS發送請求啟動對應的activity,核心代碼如下:

frameworks/base/core/java/android/app/Activity.java

其中,參數intent包含了要啟動的目標應用的信息。

以上代碼最終會調用AMS內部的startActivity(),由於Launcher和AMS分屬不同進程,這一過程通過binder通信。

2. system_server進程收到請求後,通過其內部邏輯,即AMS收到startActivity()調用後,會進行必要的權限檢查,創建activity的內部表示即ActivityRecord對象,並顯示一個空白的窗口。

核心代碼如下:

frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java

由於應用冷啟動時進程不存在,AMS會通過zygote創建應用進程。

核心代碼如下:

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

在非冷啟動的情況,即如果應用進程已經啟動完成,則可以直接進入啟動activity的邏輯,代碼如下:

在冷啟動的startProcessLocked()調用過程中,有一個參數需要特別注意,即 」entryPoint」,這個參數表示zygote分裂出的應用進程的入口,其定義為:

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

也就是說,ActivityThread是應用程式的入口。

3. 當應用進程啟動後,會進入ActivityThread的main()方法執行應用端邏輯;

核心代碼如下:

frameworks/base/core/java/android/app/ActivityThread.java

創建ActivityThread對象時,會同時創建應用進程的表示對象,即該應用的handle,代碼如下:

frameworks/base/core/java/android/app/ActivityThread.java

同時要特別注意應用進程的「attach」操作,這一操作會將應用進程自身的遠程handle即mAppThread註冊給AMS,這樣AMS就可以和應用通信,通知應用執行後續的操作,啟動相應的activity;

核心代碼如下:

frameworks/base/core/java/android/app/ActivityThread.java

4. 現在應用進程已經啟動,並且已與AMS建立關聯,AMS會繼續執行啟動應用的第一個activity的邏輯;

核心代碼如下:

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

其中,realStartActivityLocked()會通知應用啟動相應activity,邏輯如下:

5. 應用進程收到 」launch」及」resume」 命令後,就會創建相應的activity對象以及關聯的窗口對象等資源,並調用activity的生命周期回調函數完成activity的顯示;到此,應用進程的第一個activity就創建完成了;

核心代碼如下:

frameworks/base/core/java/android/app/ActivityThread.java

初始化圖形資源及與WMS的連接:

接下來會繼續activity的其它生命周期回調函數並將activity顯示出來,至此,一個應用的首個activity即完成了啟動。

本文簡要說明了安卓平臺上應用啟動的流程,通過本篇介紹,希望讀者能理清應用啟動的大致脈絡,對應用啟動過程有一個基本的理解。

參考資料

[1]http://androidxref.com/

[2]https://developer.android.com/topic/performance/vitals/launch-time

相關焦點

  • 藍牙配對在安卓系統中的流程分析
    安卓系統藍牙配對流程分析配對流程基本上始於首次連接一個藍牙設備的過程中,本端的搜索流程結束獲取到該設備的BluetoothDevice信息,就可以開啟配對流程。本期我們就簡單聊聊安卓系統藍牙配對的流程是如何運行的。Application通過framework層BluetoothDevice對外提供的接口createBond()開啟這一流程。createBondOutOfBand()通過OOB技術進行配對的接口,一般很少使用。所以應用層需要根據自己的實際使用場景選擇正確的接口。
  • Android系統啟動流程(四)Launcher啟動過程與系統啟動流程
    :Launcher的啟動流程,並結合本系列的前三篇文章的內容來講解Android系統啟動流程。1.Launcher概述Android系統啟動的最後一步是啟動一個Home應用程式,這個應用程式用來顯示系統中已經安裝的應用程式,這個Home應用程式就叫做Launcher。
  • Android系統篇之----分析AMS遠端服務調用機制以及Activity的啟動流程
    ,以及攔截具體方法的功能了,按照流程本文應該介紹如何Hook系統的AMS服務攔截應用的啟動流程操作,但是本文並不會,因為在介紹這個知識點之前,還有一件大事要做,那就是得先分析一下Android中應用的啟動流程,如果這個流程不搞清楚的話,後面沒辦法Hook的,因為你都找不到Hook點,當然Hook代理對象倒是很容易獲得,如果沒有Hook點,是沒辦法後續的操作的,所以得先把流程分析清楚了,當然現在關於應用的啟動流程的知識已經爛大街了
  • 源碼分析 — Activity的啟動流程
    原文連結:https://blog.csdn.net/lj19851227/article/details/82562115 前言 熟悉Activity的啟動流程和運行原理是一個合格的應用開發人員所應該具備的基本素質
  • 你了解 Android 系統啟動流程嗎?
    10k面試官:你了解 Android 系統啟動流程嗎?面試官:好的,回去等通知吧😨 業餘時間經常打遊戲、追劇、熬夜,目前月薪 15k面試官:你了解 Android 系統啟動流程嗎?這個不清楚了,我只是大概了解這些服務的啟動順序,再深入的就沒有去學了面試官:好的,回去等通知吧🤔️ 堅持每天學習、不斷的提升自己,目前月薪 30k面試官:你了解 Android 系統啟動流程嗎?
  • App 啟動流程,從點擊桌面開始
    Q:畫出 Android 的大體架構圖Q:App 啟動流程,從點擊桌面開始Q:Activity 棧Q:簡述 Activity 啟動全部過程?Q:ActicityThread 相關?普通安裝:PackagInstaller是安卓上默認的應用程式,用它來安裝普通文件。PackageInstaller調用一個叫做InstallAppProgress的activity來獲取用戶發出的指令。
  • Nreal在CES 2020發布3D系統「星雲」,支持安卓應用
    Nreal在CES 2020上發布3D系統「星雲」,支持全部安卓應用藉助5G和MR技術,Nreal正在幫助消費者從平面世界朝著3D混合現實世界轉移,在今年的CES上,Nreal也展示了大量的混合現實技術的應用場景和案例。
  • 比輕啟動更好用,免費自動跳過安卓應用開屏廣告教程,附官方下載
    今天聊一款個人開發者的優秀作品,名字簡單直接就叫做「自動跳過」,主要功能就是跳過安卓各個應用的開屏廣告。先來看一下實際效果怎麼樣吧。安裝完成之後,接下來介紹如何進行配置操作,此處我以MIUI11為例,其他國產系統大同小異。(P.S.魅族的Flyme我找了好久都沒有發現如何設置自啟動,知道的朋友可以在留言區回復)。需要授予的權限有:自啟動,省電策略設置為無限制,在多任務列表固定App。
  • IT應用,流程先行!
    所以這一切,並不能只是通過在ERP系統中變更一下銷售訂單就可以高枕無憂地把問題自動解決了。 CRM為了彌補ERP系統的不足,專門用於解決客戶關係管理,如客戶跟蹤分析、訂單報價、甚至是售後服務的問題。企業在實施應用系統的時候,一般會考慮到共用ERP的數據,比如物料信息、BOM信息等。
  • 華為鴻蒙系統可以安裝安卓應用APP了:apk就可以
    對於華為鴻蒙系統大家應該不陌生,雖然很多人都沒接觸使用過華為鴻蒙系統,不過我們經常可以在網上關於鴻蒙系統的消息。雖然很多人都期待在智慧型手機上用上鴻蒙系統,不過目前來說還不行,當然我們可以買個搭載鴻蒙系統的華為榮耀智能電視——榮耀智慧屏。
  • Windows 10系統可成功運行安卓應用程式
    打開APP Windows 10系統可成功運行安卓應用程式 李正浩 發表於 2020-12-14 11:12:04 微軟內部有一個名為「Latte」的項目,使用戶可以在Windows 10上運行安卓應用。
  • 希爾頓榮譽客會中文安卓系統版本應用程式發布
    上海和美國維吉尼亞州麥克萊恩市2019年9月18日 /美通社/ -- 今日,希爾頓集團(紐約證券交易所代碼:HLT)宣布,正式推出希爾頓榮譽客會中文安卓系統版本應用程式,此次發布是繼2018年蘋果應用商店上線希爾頓榮譽客會中文應用程式之後的另一次升級舉措,旨在為更多中國消費者獲得更好的希爾頓卓越體驗
  • 華為系統更新,安卓應用廠商過多獲取系統權限將成為歷史
    手機陣營主要是安卓和蘋果手機兩大作業系統,而蘋果的ios從一開始便是閉源,讓ios生態成了一個閉環,增加了ios系統安全性,禁止應用廠商獲取額外系統權限。由於安卓的開源,具有開放性,隱私保護問題一直是其詬病,導致很多應用廠商讓應用App過多獲取安卓系統權限,比如讀取聯繫人,讀取簡訊,甚至是瀏覽照片甚至銀行簡訊等私密信息的權限等。
  • 世界之窗團隊新作鳳凰系統:x86桌面版安卓
    安卓系統已經佔據了全球多數智慧型手機,而在桌面領域還是Windows的天下。微軟一直力圖將Windows帶入移動領域,那麼安卓為啥不能反攻桌面呢?這個問題,Google還沒有行動,已經有人站出來了。
  • 鳳凰系統--用安卓打造的個人電腦系統
    安卓巨人肩上的新一代桌面平臺鳳凰系統是基於安卓系統打造的個人電腦系統。相比傳統作業系統,安卓系統具有後發優勢,先天具備了現代作業系統的技術特點。如低功耗、沙箱運行、高DPI支持、開發者眾多、各類應用豐富、兼容等。正是憑藉著整個產業生態的完備性,安卓系統在Windows和Mac兩大陣營強勢夾擊下突出重圍,成功後來居上。
  • 新版Chrome能編輯PDF了,安卓版首次支持64位系統!
    最重要的,是安卓版Chrome首次支持64位系統,這麼多年,終於等到了……這四點是本次更新的最重要的點,也是直接影響用戶使用體驗的改動。那麼,下面就來詳細看一看新的Chrome 85都有哪些新特性吧。如果一個應用的運行使用方式沒有十分特殊的地方,那麼可以認為代碼的調用沒有傾向性。實際上,操作一個應用的時候,往往有一套固定流程,尤其在程序啟動的時候更加明顯。一般PGO的流程分為3步:1、使用/Qprof-gen編譯程序,產生能記錄運行細節的特殊程序。
  • 安卓綠色聯盟攜手開發者加快各類應用適配安卓8.0
    日前,安卓綠色聯盟聯合華為終端開放實驗室對主流遊戲類應用進行了安卓8.0版本兼容性檢測,絕大部分遊戲應用已經完成適配,但仍有38款遊戲未完全兼容適配安卓8.0版本,目前安卓綠色聯盟已正式通告應用開發者加快兼容適配工作。
  • Windows 10系統將可以使用Android應用了
    與Windows Linux子系統類似,微軟正在創建Windows 安卓子系統,未來將允許Windows 10系統上運行安卓應用了。 安卓APP佔移動市場份額的70%,微軟意識到這一商機,並已經開始提供一些功能來實現在Windows 10系統上啟動安卓APP了,比如通過Your Phone app和支持安卓設備。通過Your Phone 來啟動安卓APP 還是在手機上運行APP,而不是直接在Windows 10系統上運行APP。
  • Win10系統將增加新功能,原生支持安卓應用APP,模擬器突然不香了
    ,如果想運行安卓應用APP,一般需要通過安裝安卓模擬器來運行。當前的Windows10系統並不兼容安卓APP應用,而大多數安卓模擬器需要額外佔用不少電腦資源。畢竟是模擬器,使用體驗也並不友好,近日有消息稱,Windows10系統或將原生支持運行安卓應用APP。很多日常應用需要在手機端來完成,手機雖然擁有天生的便攜功能,但相比電腦端的大屏,其使用體驗並不是非常友好,特別對一些視力偏弱的用戶群體。
  • 安卓手機原來也能安裝Windows和macOS系統?
    要是再在虛擬機上安裝一個 Android 系統,App Store 沒有上架的軟體就可以從安卓各大第三方應用商店下載,沒有什麼能阻止你搞機的步伐。話又說回來,既然 iPhone、iPad 可以藉助虛擬機運行桌面級的作業系統,那麼 Android 手機有沒有類似的軟體能夠實現這樣的騷操作呢?答案是肯定的。