最近有一個朋友向我問了一個這樣的問題:
作為一個應用開發工程師,在網上有看到過大家都說了解系統源碼,例如四大組件啟動流程及IPC,Binder通信原理這些。而且我也有去看過,也覺得源碼寫的確實很精彩。但是,好像發現對實際工作上的幫助好像不太大。閱讀framework源碼是在性能調優上以及自己開發框架輪子等有幫助嗎還是?
今天就以這個問題給大家講解一下framework相關知識。
Framework的重要性
其實不需要別的,你去 Github 上看一下 騰訊 Matrix 的源碼,就知道 Framework 的知識有多重要了。
像掉幀監控,函數插裝,慢函數檢測,ANR 監控,啟動監控,都需要對 Framework 有比較深入的了解,才能知道怎麼去做監控,利用什麼機制去監控,函數插樁插到哪裡,反射調用該反射哪個類哪個方法哪個屬性……
另外 Framework 作為 Android 框架層,為 App 提供了眾多 API 去調用 ,但是很多機制都是 Framework 包裝好了給 App 來用的,如果不知道這些機制的原理,那麼很難去在這基礎上做優化。
舉個例子,如果你了解 Android App 的啟動機制,優化啟動速度的時候會更得心應手:
定製什麼樣的 StartingWindow;什麼時候可以拿到圖片的寬高;DelayLoad 怎麼做才會更合適;Service 什麼時候啟動可以不影響啟動速度;Activity onResume 回調的時候真的可見了么?Redex 為什麼會加快應用啟動速度?
再比如我們經常說的 Handler,MessageQueue,Looper。看源碼你就可以更好的理解那些概念:ThreadLocal 做什麼的;Thread 和 Handler 的關係;為什麼不能在子線程更新 UI?
再比如說 Android 的進程管理機制。AMS 把 Android 進程按照一定的規則,設置不同的優先順序,在內存比較低的時候,高優先順序的 App 比低優先順序的 App 更不容易被系統幹掉!那麼 AMS 是按照什麼規則來設置優先順序的呢?了解這些規則是不是可以提高 App 的存活率呢?這都是可以通過熟讀 AMS 代碼知道的。
再比如說 Activity 啟動的模式,可能你會熟練使用各種模式,但是如果你學習 Framework 中 Activity 和進程的管理,知道 Activity 棧和 Task 的管理。那麼你會對這啟動模式的使用更加深刻。
再比如說 View 中的 Hardware Layer,如果你只知道「在動畫開始前將 View 設置為 Hardware/Software Layer ,做完動畫再設置回去」,那麼你會發現,在有些場景下,這麼做會讓動畫變流暢,但是某些情況下動畫會變得更差。如果不了解 View 的 Hardware/Software Layer 的實現機制,盲目地給所有動畫都這麼設置,那麼性能問題是在所難免的。
再比如說 Android 的卡頓掉幀問題,很多文章都說卡頓是由於主線程耗時造成的,這其實只是一部分,其他的比如 RenderThread 耗時也會導致卡頓、Binder 通信耗時也會導致卡頓,60 fps 下沒問題的 app 90fps 下也可能會卡頓,有時候低內存下你主線程讀個文件可能都會導致卡頓。真正明白了卡頓的原理,再面對卡頓問題就不會那麼慌了(Choreographer,VSync,SurfaceFlinger,Binder)。
正所謂知其然知其所以然,API 只是 Android 開發的一部分,底層的實現龐大而又複雜,不用心去讀源碼很難將知識點深入理解。
以上只是個人的一些拙見,希望可以幫到你!

面試中那些Framework相關的問題
通常作為一個Android APP開發者,我們並不關心Android的源代碼實現,不過隨著Android開發者越來越多,企業在篩選Android程序員時越來越看中一個程序員對於Android底層的理解和思考,這裡的底層主要就是Android Framewok中各個組件的運行原理,例如Binder的運行機制、ServiceManager的作用等等。
在Android面試中,關於 Framework 的問題是必備的,但是這些關於位元組跳動 Framework 的高頻面試題你都掌握了嗎?
比如位元組面試官常問的Framework問題知識點:
1.AMS 、PMS
2.Activity 啟動流程,App 啟動流程
3.Binder 機制(IPC、AIDL 的使用)
4.為什麼使用 Parcelable,好處是什 么?
5.Android 圖像顯示相關流程,Vsync 信號等
…….
Android Framework 高頻面試題解析
怎麼學習Framework?
閱讀源碼永遠是學習最快的方式。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/220517.html