当前位置:网站首页>大廠Offer拿到手軟啊,不可思議

大廠Offer拿到手軟啊,不可思議

2021-09-15 03:57:19 A移動端開發

啟動模式

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

大廠Offer拿到手軟啊,不可思議_程序員

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

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

啟動過程

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

啟動過程圖:

大廠Offer拿到手軟啊,不可思議_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頻率,也會影響啟動的時間

最後,如果大夥有什麼好的學習方法或建議歡迎大家在評論中積極留言哈,希望大家能够共同學習、共同努力、共同進步。

 CodeChina開源項目地址:Android學習PDF+架構視頻+面試文檔+源碼筆記

小編在這裏祝小夥伴們在未來的日子裏都可以 昇職加薪,當上總經理,出任CEO,迎娶白富美,走上人生巔峰!!

不論遇到什麼困難,都不應該成為我們放弃的理由!

很多人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,比如學了一段時間感覺沒有方向感,不知道該從那裏入手去學習

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

版权声明
本文为[A移動端開發]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/09/20210915035446333j.html

随机推荐