前言
對于大多數 Android 開發工程師來說,掌握Android Framework 一定是一個不光要熟練而且還要精通的技能,
高級 Android 工程師崗位的一些技術面試也離不開Framework,一般會針對下面幾個面試題進行提問:
- 1.Android中多行程通信的方式有哪些?
- 2.行程通信你用過哪些?原理是什么?(位元組跳動、小米)
- 3.描述下Binder機制原理?(東方頭條)
- 4.Binder執行緒池的作業程序是什么樣?(東方頭條)
- 5.Handler怎么進行執行緒通信,原理是什么?(東方頭條)
- 6.Handler如果沒有訊息處理是阻塞的還是非阻塞的?(位元組跳動、小米)
- 7.handler.post(Runnable) runnable是如何執行的?(位元組跳動、小米)
- 8.handler的Callback和handlemessage都存在,但callback回傳true handleMessage還會執行么?(位元組跳動、小米)
- 9.Handler的sendMessage和postDelay的區別?(位元組跳動)
- 10.IdleHandler是什么?怎么使用,能解決什么問題?
- 11.為什么Looper.loop不阻塞主執行緒?(騰訊)
- 12.Looper無限回圈為啥沒有ANR(B站)
- 13.Looper如何在子執行緒中創建?(位元組跳動、小米)
- 14.Looper、handler、執行緒間的關系,例如一個執行緒可以有幾個Looper可以對應幾個Handler?(位元組跳動、小米)
- 15.如何更新UI,為什么子執行緒不能更新UI?(美團)
- 16.ThreadLocal的原理,以及在Looper是如何應用的?(位元組跳動、小米)
- 17.Android 有哪些存盤資料的方式?
- 18.SharedPreference原理,commit與apply的區別是什么?使用時需要有哪些注意?(騰訊)
- 19.如何判斷一個 APP 在前臺還是后臺?
- 20.如何做應用保活?
- 21.一張圖片100x100在記憶體中的大小?(位元組跳動)
- 22.Intent的原理,作用,可以傳遞哪些型別的引數?
**然后擴展到和這些知識點相關的更深層次的知識點細節,直到問的你答不上來為止,**以此來探尋你的技術邊際,這樣就能更深入地了解你的技術能力,

這些問題相信很多面試者都遇到過,但我面試的結果卻表明Android Framework框架層原理的掌握并沒有到人盡皆知的境地,不過也好,這些問題就可以很容易區分出面試者是否對Android開發真的還有熱情,
如果非要總結Framework學習中的問題,大家遇到的困惑無非是這些方面:
- 1.開發遇到Bug,百度不到,而你不懂框架里面的黑盒機制
- 2.專案代碼想到哪寫到哪,每次迭代就是一場輪回?你不想知道Android這么龐大的原始碼體系是怎么設計的?
- 3.學完就忘,不會使用,原理結合實戰通過Framework學習知識點的使用,
Android Framework重要性
Android Framework 開發雖然比較偏底層,圈子窄,但是能掌握一些原理的東西,可以觸類旁通,往應用層發展也可以,接下來我們看看Framework知識有多重要,舉幾個栗子,你或許就能清楚了,
像掉幀監控,函式插裝,慢函式檢測,ANR 監控,啟動監控,都需要對 Framework 有比較深入的了解,才能知道怎么去做監控,利用什么機制去監控,函式插樁插到哪里,反射呼叫該反射哪個類哪個方法哪個屬性……
目前大公司的app開發都要基于模塊化、層次化、組件化、控制元件化的思路來設計架構,而這一切的基礎都建立在Android Framework系統框架底層原理實作之上,
如何學習Android Framework
- 1.系統啟動流程分析
眾所周知,Android是谷歌開發的一款基于Linux的開源作業系統,下圖所示為 Android 平臺的主要組件,

Android 平臺的基礎是 Linux 內核,例如,Android Runtime (ART) 依靠 Linux 內核來執行底層功能,例如執行緒和低層記憶體管理,使用 Linux 內核可讓 Android 利用主要安全功能,并且允許設備制造商為著名的內核開發硬體驅動程式,
此外還需要學習和掌握int行程,
init行程是Android系統中及其重要的第一個行程,init行程通常會做到以下幾點,
- 創建和掛載啟動所需要的檔案目錄
- 初始化和啟動屬性服務
- 決議init.rc組態檔并啟動Zygote行程
init.rc是一個非常重要的組態檔,它是由Android初始化語言(Android Init Language)撰寫的腳本,這里也是需要重點掌握和學習的,
最后不得不提zgyote了,作為Android中的第一個art虛擬機,他通過socket的方式與其他行程進行通信,這里的“其他行程”其實主要是系統行程——SystemServer,因此重要性不言而喻,
- 2.Binder決議
Binder機制作為行程間通信的一種手段,基本上貫穿了andorid框架層的全部,所以首先必須要搞懂的Android Binder的基本通信機制,
首先我們要宏觀認識Binder,從binder框架、binder涉及到的類、binder驅動整體層面去重新認識它,

接下來再從binder的jni方法注冊、binder驅動、資料結構、啟動service_manager、獲取service_manager、addService流程等逐級進行學習,
- 3.深入決議Handler
Message 原始碼分析,再到MessageQueue 的原始碼分析,Looper 的原始碼分析,handler 的原始碼分析,Handler 機制實作原理,既是面試常考,又是作業必備技能,

- 4.深入決議AMS
Android系統非常龐大、錯綜復雜,其底層是采用Linux作為基底,上層采用包含虛擬機的Java層以及Native層, 通過系統呼叫(Syscall)連通系統的內核空間與用戶空間,用戶空間主要采用C++和Java代碼,通過JNI技術打通用戶空 間的Java層和Native層(C++/C),從而融為一體,
Google官方提供了一張經典的四層架構圖,從下往上依次分為Linux內核、系統庫和Android運行時環境、框架 層以及應用層這4層架構,其中每一層都包含大量的子模塊或子系統,

- 5.深入決議 WindowManagerService
簡稱Wms,WindowManagerService管理視窗的創建、更新和洗掉,顯示順序等,是WindowManager這個管理接品的真正的實作類,它運行在System_server行程,作為服務端,客戶端(應用程式)通過IPC呼叫和它進行互動, - 6.PackagerManagerService
PKMS 是什么東西?

PackageManagerService(簡稱 PKMS),是 Android 系統中核心服務之一,負責應用程式的安裝**,卸載,**資訊查詢,等作業,
大佬云集、資料豐富
當初我在騰訊認識一個非常非常資深的前輩,他在騰訊十來年了,但因為各種原因級別不是很高,我當時問他,既然你對現狀如此不滿,為什么不想著離開尋找更好的機會呢?
他沉思了片刻跟我說,他說我現在在這里雖然待著不順心,但是我接觸到的人都是非常優秀的,我遇到問題,還可以和你們討論討論,我如果出去了,我要是再遇到問題,可能連一個討論的人都沒有,
我當時聽聽只是覺得有道理,現在再回想起來,感受非常深刻,三觀、格局、能力,能夠進入大公司的,這三個方面一般都不會太差,除了優秀的同事之外,大公司里往往還有豐富的內部檔案和資料,
我當時在騰訊內部看到了很多優秀的文章,也有很多優秀的技術沙龍和分享,現在想起來兩年下來,也沒有去過幾次,文章和資料看得也不算多,現在想想頗為遺憾,別的不說,就拿推薦領域而言,近些年質量不錯的論文往往都來源于大公司尤其是國內的大公司,以騰訊、華為和頭條為主,除了公開的論文,公司內部還有很多技術相關的資料和檔案,這些真的可以說是有價無市,非常珍貴,
例如:《Android Framework 開發揭秘》
**這份由騰訊技術團隊出品的《Android Framework 開發揭秘》總共有19萬字,包含109個知識點,**通過經典Binder、Handler、AMS等面試題決議加深你對Android Framework框架層的理解,需要《Android Framework 開發揭秘》這份資料的小伙伴,可以微信掃描下方CSDN官方認證二維碼【免費獲取】,希望對正在學習的你有所幫助!


需要《Android Framework 開發揭秘》這份資料的小伙伴,可以微信掃描下方CSDN官方認證二維碼【免費獲取】,希望對正在學習的你有所幫助!

最后
當程式員容易,當一個優秀的程式員是需要不斷學習的,從初級程式員到高級程式員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力,早早確定自己的職業方向,才能在作業和能力提升中甩開同齡人,
- 無論你現在水平怎么樣一定要 持續學習 沒有雞湯,別人看起來的毫不費力,其實費了很大力,這四個字就是我的建議!!!!!!!!!
- 我希望每一個努力生活的IT工程師,都會得到自己想要的,因為我們很辛苦,我們應得的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/396179.html
標籤:java
