作爲一名Android工程師,瞭解Framework層對工作有什麼幫助嗎?

最近有一個朋友向我問了一個這樣的問題:

作爲一個應用開發工程師,在網上有看到過大家都說了解系統源碼,例如四大組件啓動流程及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 信號等
.......

怎麼學習Framework?

閱讀源碼永遠是學習最快的方式。

所以這裏爲大家整理了Android開發相關源碼精編解析,其中關於Framework與Binder的源碼解析內容:

目錄

第一節 Binder 系列—開篇
第二節 Binder Driver 初探
第三節 Binder Driver 再探
第四節 Binder 啓動 ServiceManager
第五節獲取 ServiceManager
第六節註冊服務(addService)
第七節獲取服務(getService)
第八節 framework 層分析
第九節如何使用 Binder
第十節如何使用 AIDL
第十一節 Binder 總結
第十二節 Binder 面試題全解析

資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖,以上資源均免費分享,以上內容均放在了開源項目:github 中已收錄,大家可以自行獲取(或者關注主頁掃描加微信獲取)。

不用多說,相信大家都有一個共識:無論什麼行業,最牛逼的人肯定是站在金字塔端的人。所以,想做一個牛逼的程序員,那麼就要讓自己站的更高,成爲技術大牛並不是一朝一夕的事情,需要時間的沉澱和技術的積累。

當你發現自己不懂的知識越來越多的時候,證明你懂的知識越來越多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章