framework學習路線和方法

語言: CN / TW / HK

前言

之前分享過我轉framework的經歷,可以看這裏《我是如何從Android開發轉framework開發的》,今天根據自己實際工作感受整理出一份framework的學習路線和方法,僅供參考,如有不足,還望指正。

Android架構

做framework開發,首先必須清楚Android系統架構

1

這裏概括一下,Android架構共分五層,分別是:

  • 應用層(Application)

    各種上層運行的的app,包括系統內置app和第三方app,例如Launcher、Settings等

  • 框架層(Java Framework)

    提供給應用層使用的Java庫,例如WMS,AMS,PMS,各種View等

  • Native層/Android運行環境

    提供給Java Framework層使用的C/C++庫,例如OpenGL

  • HAL層(硬件抽象層)

    為Java Framework層提供硬件功能,例如相機、藍牙、各種傳感器等

  • 內核層

    支撐Android系統運行的Linux內核

具體説明可到Google官網查看官方對評價平台架構的説明https://developer.android.google.cn/guide/platform?hl=zh-cn

而我們常説的framework開發其實大多數指的是中間三層的開發,即框架層、Native層、HAL層,可想而知,framework開發的內容是非常多的,那麼什麼場景下需要framework開發呢,或者説framework開發能做些什麼呢

開發內容

簡單來説,如果需要修改Android源碼,都需要framework開發支持,具體場景包括:

  • 系統定製,比如MIUI、Flyme、ColorOS、OriginOS Ocean
  • 硬件接入,常見的如車載系統的温度、車速傳感器等,不同廠商的硬件標準也可能不同
  • 系統裁剪,其實也可以説是系統定製的一種,把Android中不需要的一些模塊裁掉以提升系統的流暢性

學習路線

語言基本功

語言基本功對於閲讀Android源碼是最基礎的,framework開發寫代碼可能不是很多,但閲讀源碼是家常便飯的工作,所以需要有紮實的語言功底,其中包括:

  • Java

    Java Framework作為framework開發的入口,核心功能都是用Java寫的,如果你是從app開發轉framework開發,這一點肯定不是問題。

  • C/C++

    因為native層和hal層都是c/c++寫的。如果沒有c/c++基礎,也可以先從java framework做起,慢慢過渡到native層,期間需要大量補習c/c++基礎。

重要技能
  • 常用的Linux命令和adb命令

    首先,Android本身是基於Linux的,其次framework開發工作都是在Linux系統中完成的,包括編譯和調試,如果深入學習Linux系統,那絕對是有很大幫助的。

  • Android源碼目錄結構

    搞清楚每個目錄下都有些什麼模塊,整體感受Android架構

  • Android源碼下載、編譯、燒錄

    framework開發無非就是下載源碼、閲讀源碼、修改源碼、編譯源碼、燒寫lib/鏡像

  • 熟練掌握Android中的重要模塊

    Android是一個很龐大的系統,包括很多的模塊,徹底理解所有模塊是十分困難的,但一些常用的模塊必須需要掌握的,比如

    • Android啟動流程:核心進程(init、logd、adbd、servicemanager、zygote)以及進程之間的父子關係
    • 重要服務:servicemanager、PackageManagerService等
    • App啟動流程
    • SystemProperties,系統屬性

    其他的根據實際工作中接觸到的模塊來深入學習,比如

    • WiFi
    • Bluetooth,藍牙
    • Telephony,通話
    • Settings,系統設置
    • Launcher,桌面
    • Media,包括Camera,Video,Audio
    • Display,圖像顯示Surface相關
    • Storage,存儲
    • Sensor,傳感器
  • JNI

    java與C/C++相互調用

  • IPC(Inter-Process Communication)

    進程間通信,主要了解binder(AIDL、HIDL)

  • logcat日誌抓取和分析

    通常處理一個系統bug時,首先會根據系統logcat日誌來定位原因

    image-20221129195708690

學習方法

網上有很多framework相關的資料,但我看了一下,大多都不繫統,並且恰飯居多,根據我個人的經驗總結出以下一些學習方法以及學習小技巧。

首先有條件的話最好買一本framework相關的書籍,一個是因為書籍會比較系統性,不會存在有頭無尾的情況,二是書籍稍微權威一點,錯誤率會相對較低,如果一開始你就接受一個錯誤的觀點,後面會很難更正過來。個人推薦《深入理解Android內核設計思想》這本書,我個人也看過這本書,感覺寫得非常好,需要注意的是,這本書是以Android N的源碼來展開的,所以下載源碼的時候建議也下載Android N的源碼。

image-20221129191450154

然後根據作者的思路和實際你download下來的源碼進行學習,閲讀源碼的時候不用糾結每一行代碼的意思,只需要找到主線即可,因為一個類或者一個方法可能涉及到多個模塊的功能,你只需要找到你研究的那個模塊的代碼即可。如果你是從app開發轉到framework,那麼建議先從app的啟動入口開始看起,一路追蹤到Activity的創建以及onCreate()方法的執行,閲讀過程中可能會比較晦澀難懂,但不用糾結,主要是感受一些framework層如何過渡到app層,這樣讓framework和Application銜接到一起,更容易感受到framework的輪廓和邊界。

在系統性學習的過程中遇到一些邊邊角角知識點不懂的,可以網上查閲相關資料,擴展自己對framework的知識面。

很重要的一點,每學習完一個模塊都需要對當前學習內容進行總結,最好是能繪出模塊的架構圖和流程圖,總結能加深你對源碼的理解。這裏推薦使用Android Studio的plantUML插件來完成,插件官網有使用教程。

image-20221129190927081

總結

學習framework是一件非常枯燥的事情,原因在於相比於app開發的coding,framework更側重於對源碼的reading,但學習它能讓我們更深入的瞭解Android系統,增加自身的知識儲備,降低自己在行業中的可替代性,延長自己的職業生涯,提高自身身價。如果你有想法學習framework,或許我們可以一起成長。