首先一般的目錄結(jié)構(gòu)的作用參考博客:[Android 源碼目錄結(jié)構(gòu)詳解][6]
在工作中,因?yàn)樾枰鶕?jù)客戶(hù)需求進(jìn)行簡(jiǎn)單的系統(tǒng)定制,因此需要明確 android 系統(tǒng)運(yùn)行會(huì)去哪些目錄讀取哪些 .mk 文件
一般手機(jī)定制的源代碼中會(huì)存在兩個(gè)目錄,一個(gè)屬于 android 源碼部分,另一個(gè)屬于自己公司定制的代碼部分,由于 android 系統(tǒng)的運(yùn)行是以散射的形式去讀取 .mk 文件(首先讀取項(xiàng)目的主 make 文件,再讀取由主 make 文件引用的其他 make 文件,知道將所需要的 make 文件讀取完整)
定制基本操作:
- 到自己所負(fù)責(zé)項(xiàng)目的 make 文件下找到需要的模塊宏(eg:GN_APK_**_SETTINGS_SUPPORT)
- 根據(jù)找到的宏到定制項(xiàng)目下尋找該 apk 所在文件夾,該目錄下的 .mk 文件就會(huì)有那個(gè)模塊的宏開(kāi)關(guān),若不需要這個(gè)模塊則直接改為 false
- 如果定制涉及到需要在代碼中進(jìn)行修改的話(huà),則需要進(jìn)入到該模塊對(duì)應(yīng)的代碼中進(jìn)行修改(找到需求中需要修改的地方即可)
編譯的過(guò)程(以MTK為基礎(chǔ)的定制):
- 首先,系統(tǒng)會(huì)加載 MTK Android 源代碼目錄下所需的系統(tǒng)文件
- 然后會(huì)加載 定制公司 project 目錄文件下的 項(xiàng)目名.mk
- 然后會(huì)加載 定制公司名 目錄文件下的對(duì)應(yīng)項(xiàng)目的文件(比如 海外 項(xiàng)目)
(前三步都是在 MTK Android 源碼目錄下進(jìn)行的,每一層級(jí)若出現(xiàn)同名文件都會(huì)進(jìn)行覆蓋) - 加載第三步的文件之后,那些文件會(huì)映射到第二個(gè)目錄中(公司定制的代碼部分)就是在這個(gè)文件下的 common_version_version/app 目錄下進(jìn)行讀取系統(tǒng) app ,那么修改完這些之后,重新編譯就能體現(xiàn)出修改的內(nèi)容
當(dāng)然這只是一個(gè)簡(jiǎn)單的流程,如果涉及到比較深度的定制,那么則需要明確修改的宏對(duì)應(yīng)的代碼部分,不然就會(huì)導(dǎo)致明明修改了某處地方但是編譯之后沒(méi)有得到對(duì)應(yīng)的結(jié)果
編譯需要使用 android 源碼中的 Tmake*** 腳本文件進(jìn)行編譯(這個(gè)腳本文件由公司內(nèi)部定義)
總的來(lái)說(shuō),定制手機(jī)先從獲取的基礎(chǔ)代碼進(jìn)行執(zhí)行,然后從定制公司的目錄出發(fā)尋找所映射的文件讀取,編譯后會(huì)生成一個(gè)可供刷機(jī)的軟件,使用該軟件就能夠?qū)⒍ㄖ频南到y(tǒng)安裝到手機(jī)上。基本過(guò)程就是這樣,沒(méi)有圖片可能比較抽象,建議下套源碼結(jié)合這些步驟摸索一下(如有錯(cuò)誤,歡迎指出)