Android 編譯命令
一速缨、編譯命令
編譯Android源碼的第一步
# 在源碼根目錄執(zhí)行
source build/envsetup.sh
其中source命令就是用于運行shell腳本命令,功能等價于”.”昌简,因此該命令也等價于. build/envsetup.sh
镜豹。在文件envsetup.sh聲明了當前會話終端可用的命令份企,這里需要注意的是當前會話終端蒲牧,也就意味著每次新打開一個終端都必須再一次執(zhí)行這些指令撇贺。
source envsetup.sh #初始化編譯環(huán)境,包括后面的lunch和make指令
lunch #指定此次編譯的目標設備以及編譯類型冰抢,可以直接跟數(shù)字(沒有指定的話松嘶,會出現(xiàn)選項)
make -j12 #開始編譯,默認為編譯整個系統(tǒng)挎扰,其中-j12代表的是編譯的job數(shù)量為12翠订。
所有的編譯命令都在envsetup.sh文件能找到相對應的function,比如上述的命令lunch遵倦,make蕴轨,在文件一定能找到
function lunch(){
...
}
function make(){
...
}
source envsetup.sh
,需要cd到envsetup.sh文件所在路徑執(zhí)行骇吭,路徑可能在build/envsetup.sh
,或者integrate/envsetup.sh
歧寺,再或者不排除有些廠商會封裝自己的.sh腳本燥狰,但核心思路是一致的。
1.1 代碼編譯
編譯指令 #解釋
m #在源碼樹的根目錄執(zhí)行編譯
mm #編譯當前路徑下所有模塊斜筐,但不包含依賴
mmm [module_path] #編譯指定路徑下所有模塊龙致,但不包含依賴
mma #編譯當前路徑下所有模塊,且包含依賴
mmma [module_path] #編譯指定路徑下所有模塊顷链,且包含依賴
make [module_name] #無參數(shù)目代,則表示編譯整個Android代碼
下面列舉部分模塊的編譯指令:
模塊 make命令 mmm命令
init make init mmm system/core/init
zygote make app_process mmm frameworks/base/cmds/app_process
system_server make services mmm frameworks/base/services
java framework make framework mmm frameworks/base
framework資源 make framework-res mmm frameworks/base/core/res
jni framework make libandroid_runtime mmm frameworks/base/core/jni
binder make libbinder mmm frameworks/native/libs/binder
上述mmm命令同樣適用于mm/mma/mmma,編譯系統(tǒng)采用的是增量編譯,只會編譯發(fā)生變化的目標文件榛了。當需要重新編譯所有的相關模塊在讶,則需要編譯命令后增加參數(shù)-B,比如
make -B [module_name]霜大,
或者 mm -B [module_path]构哺。
對于m、mm战坤、mmm曙强、mma、mmma這些命令的實現(xiàn)都是通過make方式來完成的途茫。
mmm/mm編譯的效率很高碟嘴,而make/mma/mmma編譯較緩慢;
make/mma/mmma編譯時會把所有的依賴模塊一同編譯囊卜,但mmm/mm不會;
- 首次編譯時采用make/mma/mmma編譯娜扇;
- 當依賴模塊已經(jīng)編譯過的情況,則使用mmm/mm編譯边败。
1.2 代碼搜索
搜索指令 | 解釋 |
---|---|
cgrep |
所有C/C++文件執(zhí)行搜索操作 |
jgrep |
所有Java文件執(zhí)行搜索操作 |
ggrep |
所有Gradle文件執(zhí)行搜索操作 |
mangrep [keyword] |
所有AndroidManifest.xml文件執(zhí)行搜索操作 |
mgrep [keyword] |
所有Android.mk文件執(zhí)行搜索操作 |
sepgrep [keyword] |
所有sepolicy文件執(zhí)行搜索操作 |
resgrep [keyword] |
所有本地res/*.xml文件執(zhí)行搜索操作 |
sgrep [keyword] |
所有資源文件執(zhí)行搜索操作 |
#上述指令用法最終實現(xiàn)方式都是基于grep指令袱衷,各個指令用法格式:
xgrep [keyword]
#搜索所有AndroidManifest.xml文件中的launcher關鍵字所在文件的具體位置,指令
mangrep launcher
#搜索所有Java代碼中包含zygote所在文件
jgrep zygote
#搜索所有system_app的selinux權限信息
sepgrep system_app
1.3 導航指令
導航指令 解釋
croot 切換至Android根目錄
cproj 切換至工程的根目錄
godir [filename] 跳轉(zhuǎn)到包含某個文件的目錄
Tips: 當每次修改完某個文件后需要編譯時笑窜,執(zhí)行cproj后會跳轉(zhuǎn)到當前模塊的根目錄致燥,也就是Android.mk文件所在目錄,然后再執(zhí)行mm指令排截,即可編譯目標模塊嫌蚤;當進入源碼層級很深后,需要返回到根目錄断傲,使用croot一條指令完成脱吱;另外cd - 指令可用于快速切換至上次目錄。
1.4 信息查詢
查詢指令 解釋
hmm 查詢所有的指令help信息
findmakefile 查詢當前目錄所在工程的Android.mk文件路徑
print_lunch_menu 查詢lunch可選的product
printconfig 查詢各項編譯變量值
gettop 查詢Android源碼的根目錄
gettargetarch 獲取TARGET_ARCH值
2.5 其他指令
上述只是列舉比較常用的指令认罩,還有其他指令箱蝠,而且不同的build編譯系統(tǒng),支持的指令可能會存在一些差異垦垂,當忘記這些編譯指令宦搬,可以通過執(zhí)行hmm,查詢指令的幫助信息劫拗。
最后再列舉兩個比較常用的指令:
make clean:執(zhí)行清理操作间校,等價于 rm -rf out/
make update-api:更新API,在framework API改動后需執(zhí)行該指令页慷,Api記錄在目錄frameworks/base/api憔足;
二胁附、編譯系統(tǒng)
Android 編譯系統(tǒng)是Android源碼的一部分,用于編譯Android系統(tǒng)滓彰,Android SDK以及相關文檔控妻。該編譯系統(tǒng)是由Make文件、Shell以及Python腳本共同組成找蜜,其中最為重要的便是Make文件饼暑。
2.1 Makefile分類
整個Build系統(tǒng)的Make文件分為三大類:
系統(tǒng)核心的Make文件:定義了Build系統(tǒng)的框架,文件全部位于路徑
/build/core
洗做,其他Make文件都是基于該框架編寫的弓叛;針對產(chǎn)品的Make文件:定義了具體某個型號手機的Make文件,文件路徑位于/device诚纸,該目錄下往往又以公司名和產(chǎn)品名劃分兩個子級目錄撰筷,比如
/device/qcom/msm8916
;針對模塊的Make文件:整個系統(tǒng)分為各個獨立的模塊畦徘,每個模塊都一個專門的Make文件毕籽,名稱統(tǒng)一為"Android.mk",該文件定義了當前模塊的編譯方式井辆。Build系統(tǒng)會掃描整個源碼樹中名為
Android.mk
的文件,并執(zhí)行相應模塊的編譯工作杯缺。
2.2 編譯產(chǎn)物
經(jīng)過make編譯后的產(chǎn)物蒸播,都位于/out目錄袍榆,該目錄下主要關注下面幾個目錄:
/out/host:#Android開發(fā)工具的產(chǎn)物,包含SDK各種工具才写,比如adb奖蔓,dex2oat琅摩,aapt等。
/out/target/common:#通用的一些編譯產(chǎn)物锭硼,包含Java應用代碼和Java庫;
/out/target/product/[product_name]:#針對特定設備的編譯產(chǎn)物以及平臺相關C/C++代碼和二進制文件蜕劝;
在/out/target/product/[product_name]目錄下檀头,有幾個重量級的鏡像文件:
system.img:#掛載為根分區(qū)轰异,主要包含Android OS的系統(tǒng)文件;
ramdisk.img:#主要包含init.rc文件和配置文件等暑始;
userdata.img:#被掛載在/data搭独,主要包含用戶以及應用程序相關的數(shù)據(jù);
當然還有boot.img廊镜,reocovery.img等鏡像文件牙肝,這里就不介紹了。