1. 常見AOSP目錄
目錄名 | 介紹 |
---|---|
build/core/ | AOSP整個(gè)編譯過程中核心的編譯規(guī)則makefile |
build/envsetup.sh | 編譯初始化腳本 |
build/target | AOSP自帶的Target(模擬器)的一些makefile |
build/tools/ | 編譯中使用的shell及python寫的工具腳本 |
packagess | 系統(tǒng)app以及一些provider,輸入法等桌面看不到的app |
framework/av/ | 多媒體相關(guān)的native層源碼目錄 |
framework/webview/ | 瀏覽器內(nèi)核chromium的源碼目錄 |
framework/native/ | power柴钻、surface彼乌、input、binder等服務(wù)的native層實(shí)現(xiàn)源碼目錄 |
framework/base/core/ | framework.jar、framework-res.apk床三、libandroid_runtime.so等的源文件 |
framework/base/native/ | libandroid.so的源代碼目錄.java中的api的native實(shí)現(xiàn).比如looper,assertManager |
framework/base/media/ | 多媒體相關(guān)的JavaApi和jni層的源文件 |
framework/base/packages/ | SettingProviders,SystemUI等不在桌面啟動(dòng)的APP源碼 |
framework/base/service/ | service.jar酥泛、libandroid_service.so的源文件 |
framework/base/service/ | wifi服務(wù)相關(guān)的JavaApi,WifiManager,WifiService等 |
device/(vendor_name)/(product_name) | 跟某些廠商的某個(gè)硬件平臺(tái)相關(guān)的內(nèi)核,硬件配置等 |
vendor/(vendor_name)/(product_name) | 廠商對AOSP進(jìn)行的修改或者定制,放在vendor目錄。包括但不限于framework層新增API,新增APP等業(yè)務(wù)需求,但是現(xiàn)在Google更推薦放在devices目錄下 |
/out/host | 該目錄下包含了針對當(dāng)前操作系統(tǒng)所編譯出的Android開發(fā)工具產(chǎn)物,例如adb,aapt,fastboot等命令 |
/out/target/common/ | 該目錄包含了針對Android設(shè)備的通用的編譯產(chǎn)物,主要是java應(yīng)用代碼和java庫莉测。Framework.jar,services.jar,android.policy.jar等等 |
/out/target/(product)/(product_name) | 包含了針對特定設(shè)備的編譯結(jié)果以及平臺(tái)相關(guān)的C/C++庫和二進(jìn)制文件颜骤。其中,product_name是具體目標(biāo)設(shè)備的名稱 |
2. AndroidBuildSystem
andorid build系統(tǒng)用來編譯android系統(tǒng),android sdk以及相關(guān)文檔.該系統(tǒng)主要由make文件,shell腳本以及python腳本組成,在編譯時(shí)能夠支持面向不同的硬件設(shè)備,不同的編譯類型,且提供面向各個(gè)廠商的定制擴(kuò)展捣卤。
2.1 什么是makefile
makefile是一些有特定語法的忍抽,可供make命令讀取并執(zhí)行的腳本性質(zhì)的配置文件。作用就是可以告知編譯系統(tǒng)董朝,對哪些源文件進(jìn)行編譯鸠项,怎么編譯,怎么處理依賴關(guān)系子姜。makefile可以定義變量祟绊,函數(shù),調(diào)用系統(tǒng)命令,shell久免、python腳本浅辙,管理module之間的依賴。整個(gè)Android Build系統(tǒng)中的 Make 文件可以分為三類:
-
Build系統(tǒng)核心 Makefile
這類makefile定義了整個(gè)Build系統(tǒng)的框架阎姥,而其他所有Make文件都是在這個(gè)框架的基礎(chǔ)上編寫出來的记舆。位于/build/core目錄下。 -
針對某個(gè)產(chǎn)品的Makefile
這類makefile是針對某個(gè)產(chǎn)品Make文件呼巴,這些文件通常位于device/<vendor>/<product>目錄下泽腮。 -
針對某個(gè)模塊的Makefile
Android.mk
第三類是針對某個(gè)模塊的makefile文件.AOSP中,不會(huì)針對某一個(gè)文件進(jìn)行編譯,每一個(gè)編譯單位都是一個(gè)模塊,每一個(gè)模塊由一個(gè)名為"Android.mk
"的makefile來聲明。該文件中定義了如何編譯當(dāng)前模塊衣赶。
2.2 make文件中的內(nèi)容
LOCAL_PATH := $(call my-dir)
表示源代碼的目錄在哪
include $(CLEAR_VARS)
表示變量全部清空,其中CLEAR_VARS也是一個(gè)makefile文件
LOCAL_MODULE_TAGS := optional
表示是哪個(gè)TAG,可為eng,user,userdebug,optional等,在哪個(gè)版本下執(zhí)行編譯等...
3. ABS思維導(dǎo)圖
ABS思維導(dǎo)圖
ps:原諒我不會(huì)在markdown上畫思維導(dǎo)圖
略丑的流程圖
ps:圖不是重點(diǎn),重點(diǎn)是掌握build系統(tǒng)的流程
附上文字描述:
- 入口為
Makefile.mk
文件 -
build/core/main.mk
:- 檢查當(dāng)前的編譯環(huán)境inclue build/core/下的核心makefile從而完成編譯環(huán)境的配置
- 檢索所有的
BoardConfig.mk
和AndroidProduct.mk
載入到編譯系統(tǒng) -
main.mk
里會(huì)使用python腳本遍歷AOSP下的所有模塊(AndroidProduct.mk
)并include
-
所有模塊下的AndroidProduct.mk
:
告訴編譯系統(tǒng),當(dāng)前module的一些配置信息(源文件,依賴庫等)和編譯輸出類型(可執(zhí)行文件,共享庫,靜態(tài)庫,java庫,app等)诊赊。根據(jù)不同的輸出類型,會(huì)include不同的makefile(package.mk java_library.mk等
),這些makefile會(huì)調(diào)用相關(guān)的編譯工具,達(dá)到編譯目的