教你一種更清晰的Android架構,源碼解析

不加班的程序猿 2021-09-19 07:15:48 阅读数:968

教你 清晰 android 解析

啟動模式

要准確的測量APP的啟動時間,首先我們要了解APP整個啟動過程。 啟動過程,一般可以分為以下三類:

教你一種更清晰的Android架構,源碼解析_移動開發

愛奇藝Android客戶端啟動優化與分析

從上圖可以看出,啟動過程中,Cold的模式下,生命周期中做的事情最多,啟動的時間最長,因此,我們以冷啟動來衡量APP啟動時間。啟動過程中,如何判斷哪些生命周期影響啟動速度呢?

啟動過程

我們知道,APP的啟動和運行,就是Linux系統創建進程和組件對象,並在UI線程中處理組件消息的過程。

啟動過程圖:

教你一種更清晰的Android架構,源碼解析_程序員_02

App的啟動過程,可以劃分為三個階段:

3.1 創建進程

當APP啟動時,如果當前app的進程不存在,便會創建新的進程;App主進程啟動後,如果啟動某個組件,並且該組件設置了android:process屬性,組件所運行的進程不存在,也會創建新的進程。

需要注意的是,如果在啟動階段,初始化的組件中,包含了多個進程,便會創建多次進程,BindApplication操作也會重複執行多次

3.2 創建UI線程及Handler

進程創建後,會通過反射,執行ActivityThread入口函數,創建Handler,並在當前線程中prepareMainLooper,並在Handler中接收組件的消息,我們來看一下Handler中處理的消息:

  • LAUNCH_ACTIVITY,啟動,執行Activity
  • RESUME_ACTIVITY,恢複Activity
  • BIND_APPLICATION,啟動app
  • BIND_SERVICE,Service創建, onBind
  • LOW_MEMORY,內存不足,回收後臺程序

sMainThreadHandler中,處理的消息很多,這裏只羅列了,可能在啟動階段可能會執行的操作, 這些操作都是運行在Main Thread中,對啟動而言,屬於阻塞性的。

Activity生命周期,自然需要在啟動階段執行,但,對於Service的創建,Trim_memory回調,廣播接收等操作,就需要重點考慮,其操作耗時性。

3.3 Activity運行及繪制

前兩個過程,創建進程和UI線程及Handler,都是由系統决定的,對APP開發者而言,並不能控制其執行時間,在本階段,執行BindApplication,和Acitivity生命周期,都是可以由開發者自定義。

Activity執行到onResume之後,會執行至ViewRootImpl,執行兩次performTraversals,第二次traversal操作中,會執行performDraw操作,同時通知RenderThread線程執行繪制.

從啟動的三個階段,我們可以看出,啟動啟動時間的長短,决定因素在於,主線程中所做事情消耗的時間的多少,所以,我們的優化工作主要集中在,排查主線程中耗時性的工作,並進行合理的優化。Android手機,系統的資源是有限的,過多的异步線程,會搶占CPU,導致主線程執行時間片間隔增大。同樣的,內存消耗狀態,GC頻率,也會影響啟動的時間

最後

如果你看到了這裏,覺得文章寫得不錯就給個贊唄?如果你覺得那裏值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。

教你一種更清晰的Android架構,源碼解析_Android_03

最後針對Android程序員,我這邊給大家整理了一些資料,包括不限於高級UI、性能優化、移動架構師、NDK、混合式開發(ReactNative+Weex)微信小程序、Flutter等全方面的Android進階實踐技術;希望能幫助到大家,也節省大家在網上搜索資料的時間來學習,也可以分享動態給身邊好友一起學習!

 CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》
版权声明:本文为[不加班的程序猿]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919071548451g.html