寫在最前
學(xué)習(xí)Framework有什么意義碳蛋?
來到2023年,App開發(fā)崗位已經(jīng)越來越少省咨,做App開發(fā)的門檻越來越低肃弟,但目前市場的產(chǎn)業(yè)轉(zhuǎn)型,Android的開發(fā)需求都轉(zhuǎn)向了Framework的開發(fā)零蓉。因此今年開始Android的工程師又會有一大堆人嘗試要越過Framework開發(fā)這道坎了笤受。
Framework 的學(xué)習(xí)內(nèi)容足夠龐大,因此日后的工作面試敌蜂,只要面試官愿意問箩兽,肯定能找到讓你思考半天的。
Android Framework 涉及的行業(yè)相當(dāng)廣泛紊册,可以是手機比肄,汽車,手表囊陡,冰箱,微波爐掀亥,電視撞反,機頂盒,空調(diào)等等設(shè)備搪花。
Framework 學(xué)習(xí)門檻也較高遏片,薪資也比大部分 App 開發(fā)崗位高出不少。如果能系統(tǒng)地學(xué)習(xí) Framework 撮竿,不論從經(jīng)濟上還是個人職業(yè)發(fā)展上都是非常不錯的選擇吮便。
這是一張經(jīng)典的架構(gòu)圖
- Linux kernel 層,驅(qū)動程序
- HAL 層幢踏,封裝驅(qū)動硬件操作髓需,向 App 提供統(tǒng)一穩(wěn)定的驅(qū)動操作接口
- Native層,C/C++ 庫以及 Java 虛擬機
- Java 層房蝉, Java 庫僚匆,系統(tǒng)服務(wù)等
- App 層微渠,系統(tǒng)和三方APP
framework 大多數(shù)指的是中間三層的開發(fā),即 Java層咧擂、Native層逞盆、HAL層
Android 系統(tǒng)啟動過程
1.由 Boot Loader 引導(dǎo)開機
2.進入 -> Kernel
3.進入 -> Native
4.進入-> Framework
5.進入 -> App
- kernel 層主要向上提供了驅(qū)動,Hal 層加以封裝后,向上提供驅(qū)動程序功能
- Native 層通過 init 進程啟動了很多守護進程用于支持系統(tǒng)的運轉(zhuǎn)
- Java 層通過 Zygote 孵化了 Java 守護進程松申,用于支持系統(tǒng)的運行和 App 的運行
Framework 能開發(fā)什么
- 添加自己的硬件云芦、驅(qū)動、HAL和硬件系統(tǒng)服務(wù)贸桶,硬件的提供商可能會提供相應(yīng)軟件支持
- 定制系統(tǒng) App焕数,比如 Launcher Setting System UI Message Camera 等
- 開發(fā)廠商自己的系統(tǒng) App,比如 音視頻播放器 應(yīng)用商店 主題 紅外遙控等
- 個性化功能開發(fā)刨啸,比如軟件多開堡赔,手機分身,語音變聲设联,錄屏善已,雙卡雙待等等
- 集成一些常用三方應(yīng)用,比如 微信 淘寶 愛奇藝等
- 系統(tǒng)穩(wěn)定性 性能 安全相關(guān)優(yōu)化
- 系統(tǒng)裁剪
Framework 怎么學(xué)--學(xué)習(xí)路線分析
1. 基礎(chǔ)知識
編程語言方面我們需要掌握:
- C/C++
- Java
- JNI
對一些工具類的語言有一定的了解:
- Python:源碼下載工具 repo 使用 python 對 git 操作做了封裝离例,以適應(yīng)多個 git 倉庫的操作
- Shell 編程:Android 編譯系統(tǒng)包含了大量的 Shell 腳本
- go 語言换团,Android 編譯系統(tǒng)中部分腳本使用 go 語言編寫
早期 Android 編譯系統(tǒng)使用 make 構(gòu)建,后來逐步使用 Soong 進行替換宫蛆,Android 的官方博客指出未來會使用 Bazel 來替換掉目前 make 和 Soong 混合的結(jié)構(gòu)艘包,鑒于 Android 代碼量龐大,這些替換都是部分的逐步開展的耀盗。
對于 Linux 需要掌握三個方面:
- 熟悉 Linux 的基本使用想虎,主要是常用的命令和常用服務(wù)搭建
- 熟悉 Linux 系統(tǒng)編程,Native 層使用了很多系統(tǒng)編程接口叛拷,熟悉 Linux 系統(tǒng)編程是讀懂 Native 層的基礎(chǔ)
- Linux 系統(tǒng)編程可能或多或少需要我們對 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)是怎么編譯的,怎么燒錄到手機上的署浩。
4. Hal與硬件服務(wù)
- 完成一個簡單字符驅(qū)動程序的編寫
- 完成 Hal 層編寫揉燃,首先掌握傳統(tǒng)方式,再學(xué)習(xí)基于 HwBinder 的現(xiàn)代方式
- 最后就是在系統(tǒng)中添加硬件服務(wù)筋栋,寫個簡單的 App 訪問我們的硬件服務(wù)
5. 基礎(chǔ)組件
基礎(chǔ)組件就是被使用的比較多的組件,主要包含了:
- Android 智能指針
- Android 屬性系統(tǒng)
- Android 日志系統(tǒng)
- SeAndroid
- Android 權(quán)限系統(tǒng)
- 匿名共享內(nèi)存
6. Binder
Binder 是 Android 最核心的基礎(chǔ)炊汤,整個 Android 都是基于 Binder 搭建的,不夸張的講,不懂 Binder 就不懂 Android婿崭。
Binder 涉及了內(nèi)核驅(qū)動層拨拓,C 層,C++ 層氓栈,Java 層渣磷,涉及知識多,流程復(fù)雜授瘦,很多人學(xué)了一遍有一遍醋界,還是沒有掌握。
7. 系統(tǒng)啟動過程分析
主要熟悉整個系統(tǒng)啟動的流程:
重點掌握:
- init 的實現(xiàn)細節(jié)
- Zygote 的具體實現(xiàn)
- SystemServer 的內(nèi)部實現(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)主要三個方面來具體學(xué)習(xí):
- 讀取事件
- 分發(fā)事件
- 處理事件
11. 系統(tǒng)應(yīng)用
對系統(tǒng)應(yīng)用的開發(fā)要有所了解形纺,主要學(xué)習(xí)一下幾個 App:
- Calculator
- Setting
- Launcher
- SystemUI