寫(xiě)在最前
學(xué)習(xí)Framework有什么意義?
來(lái)到2023年,App開(kāi)發(fā)崗位已經(jīng)越來(lái)越少,做App開(kāi)發(fā)的門(mén)檻越來(lái)越低,但目前市場(chǎng)的產(chǎn)業(yè)轉(zhuǎn)型,Android的開(kāi)發(fā)需求都轉(zhuǎn)向了Framework的開(kāi)發(fā)。因此今年開(kāi)始Android的工程師又會(huì)有一大堆人嘗試要越過(guò)Framework開(kāi)發(fā)這道坎了。
Framework 的學(xué)習(xí)內(nèi)容足夠龐大,因此日后的工作面試,只要面試官愿意問(wèn),肯定能找到讓你思考半天的。
Android Framework 涉及的行業(yè)相當(dāng)廣泛,可以是手機(jī),汽車(chē),手表,冰箱,微波爐,電視,機(jī)頂盒,空調(diào)等等設(shè)備。
Framework 學(xué)習(xí)門(mén)檻也較高,薪資也比大部分 App 開(kāi)發(fā)崗位高出不少。如果能系統(tǒng)地學(xué)習(xí) Framework ,不論從經(jīng)濟(jì)上還是個(gè)人職業(yè)發(fā)展上都是非常不錯(cuò)的選擇。
這是一張經(jīng)典的架構(gòu)圖

- Linux kernel 層,驅(qū)動(dòng)程序
- HAL 層,封裝驅(qū)動(dòng)硬件操作,向 App 提供統(tǒng)一穩(wěn)定的驅(qū)動(dòng)操作接口
- Native層,C/C++ 庫(kù)以及 Java 虛擬機(jī)
- Java 層, Java 庫(kù),系統(tǒng)服務(wù)等
- App 層,系統(tǒng)和三方APP
framework 大多數(shù)指的是中間三層的開(kāi)發(fā),即 Java層、Native層、HAL層
Android 系統(tǒng)啟動(dòng)過(guò)程
1.由 Boot Loader 引導(dǎo)開(kāi)機(jī)
2.進(jìn)入 -> Kernel
3.進(jìn)入 -> Native
4.進(jìn)入-> Framework
5.進(jìn)入 -> App
- kernel 層主要向上提供了驅(qū)動(dòng),Hal 層加以封裝后,向上提供驅(qū)動(dòng)程序功能
- Native 層通過(guò) init 進(jìn)程啟動(dòng)了很多守護(hù)進(jìn)程用于支持系統(tǒng)的運(yùn)轉(zhuǎn)
- Java 層通過(guò) Zygote 孵化了 Java 守護(hù)進(jìn)程,用于支持系統(tǒng)的運(yùn)行和 App 的運(yùn)行
Framework 能開(kāi)發(fā)什么
- 添加自己的硬件、驅(qū)動(dòng)、HAL和硬件系統(tǒng)服務(wù),硬件的提供商可能會(huì)提供相應(yīng)軟件支持
- 定制系統(tǒng) App,比如 Launcher Setting System UI Message Camera 等
- 開(kāi)發(fā)廠(chǎng)商自己的系統(tǒng) App,比如 音視頻播放器 應(yīng)用商店 主題 紅外遙控等
- 個(gè)性化功能開(kāi)發(fā),比如軟件多開(kāi),手機(jī)分身,語(yǔ)音變聲,錄屏,雙卡雙待等等
- 集成一些常用三方應(yīng)用,比如 微信 淘寶 愛(ài)奇藝等
- 系統(tǒng)穩(wěn)定性 性能 安全相關(guān)優(yōu)化
- 系統(tǒng)裁剪
Framework 怎么學(xué)--學(xué)習(xí)路線(xiàn)分析
1. 基礎(chǔ)知識(shí)

編程語(yǔ)言方面我們需要掌握:
- C/C++
- Java
- JNI
對(duì)一些工具類(lèi)的語(yǔ)言有一定的了解:
- Python:源碼下載工具 repo 使用 python 對(duì) git 操作做了封裝,以適應(yīng)多個(gè) git 倉(cāng)庫(kù)的操作
- Shell 編程:Android 編譯系統(tǒng)包含了大量的 Shell 腳本
- go 語(yǔ)言,Android 編譯系統(tǒng)中部分腳本使用 go 語(yǔ)言編寫(xiě)
早期 Android 編譯系統(tǒng)使用 make 構(gòu)建,后來(lái)逐步使用 Soong 進(jìn)行替換,Android 的官方博客指出未來(lái)會(huì)使用 Bazel 來(lái)替換掉目前 make 和 Soong 混合的結(jié)構(gòu),鑒于 Android 代碼量龐大,這些替換都是部分的逐步開(kāi)展的。
對(duì)于 Linux 需要掌握三個(gè)方面:
- 熟悉 Linux 的基本使用,主要是常用的命令和常用服務(wù)搭建
- 熟悉 Linux 系統(tǒng)編程,Native 層使用了很多系統(tǒng)編程接口,熟悉 Linux 系統(tǒng)編程是讀懂 Native 層的基礎(chǔ)
- Linux 系統(tǒng)編程可能或多或少需要我們對(duì) Linux 內(nèi)核有基本的了解
另外在 Linux 的學(xué)習(xí)工程中兼顧一下操作系統(tǒng)基礎(chǔ)的學(xué)習(xí)
2. AOSP 源碼學(xué)習(xí)

了解一下系統(tǒng)源碼的管理,掌握 repo 和 gerrit 的使用。
3. AOSP 源碼編譯系統(tǒng)

在上手了 AOSP 源碼后,我們需要知道,我們的系統(tǒng)是怎么編譯的,怎么燒錄到手機(jī)上的。
4. Hal與硬件服務(wù)

- 完成一個(gè)簡(jiǎn)單字符驅(qū)動(dòng)程序的編寫(xiě)
- 完成 Hal 層編寫(xiě),首先掌握傳統(tǒng)方式,再學(xué)習(xí)基于 HwBinder 的現(xiàn)代方式
- 最后就是在系統(tǒng)中添加硬件服務(wù),寫(xiě)個(gè)簡(jiǎn)單的 App 訪(fǎng)問(wèn)我們的硬件服務(wù)
5. 基礎(chǔ)組件
基礎(chǔ)組件就是被使用的比較多的組件,主要包含了:
- Android 智能指針
- Android 屬性系統(tǒng)
- Android 日志系統(tǒng)
- SeAndroid
- Android 權(quán)限系統(tǒng)
- 匿名共享內(nèi)存
6. Binder

Binder 是 Android 最核心的基礎(chǔ),整個(gè) Android 都是基于 Binder 搭建的,不夸張的講,不懂 Binder 就不懂 Android。
Binder 涉及了內(nèi)核驅(qū)動(dòng)層,C 層,C++ 層,Java 層,涉及知識(shí)多,流程復(fù)雜,很多人學(xué)了一遍有一遍,還是沒(méi)有掌握。
7. 系統(tǒng)啟動(dòng)過(guò)程分析
主要熟悉整個(gè)系統(tǒng)啟動(dòng)的流程:

重點(diǎn)掌握:
- init 的實(shí)現(xiàn)細(xì)節(jié)
- Zygote 的具體實(shí)現(xiàn)
- SystemServer 的內(nèi)部實(shí)現(xiàn)
8. 應(yīng)用層框架

主要搞懂:
- AMS/ATMS
- Handler 和 Looper
- PackageManagerService
9. 顯示系統(tǒng)

在掌握了 Android 顯示系統(tǒng)整體框架后,再逐步學(xué)習(xí)一下內(nèi)容:
- Hal 層的 Gralloc 和 Hwcomposer
- Surfaceflinger
- WMS
- View 系統(tǒng)
10. Android 輸入系統(tǒng)
輸入系統(tǒng)主要三個(gè)方面來(lái)具體學(xué)習(xí):
- 讀取事件
- 分發(fā)事件
- 處理事件
11. 系統(tǒng)應(yīng)用
對(duì)系統(tǒng)應(yīng)用的開(kāi)發(fā)要有所了解,主要學(xué)習(xí)一下幾個(gè) App:
- Calculator
- Setting
- Launcher
- SystemUI