Android 編譯命令

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等鏡像文件牙肝,這里就不介紹了。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗤朴,一起剝皮案震驚了整個濱河市配椭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雹姊,老刑警劉巖股缸,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吱雏,居然都是意外死亡敦姻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門歧杏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镰惦,“玉大人,你說我怎么就攤上這事犬绒⊥耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵懂更,是天一觀的道長眨业。 經(jīng)常有香客問我,道長沮协,這世上最難降的妖魔是什么龄捡? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮慷暂,結果婚禮上聘殖,老公的妹妹穿的比我還像新娘。我一直安慰自己行瑞,他們只是感情好奸腺,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著血久,像睡著了一般突照。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氧吐,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天讹蘑,我揣著相機與錄音末盔,去河邊找鬼。 笑死座慰,一個胖子當著我的面吹牛陨舱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播版仔,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼游盲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛮粮?” 一聲冷哼從身側(cè)響起益缎,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝉揍,沒想到半個月后链峭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡又沾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年弊仪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杖刷。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡励饵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滑燃,到底是詐尸還是另有隱情役听,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布表窘,位于F島的核電站典予,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乐严。R本人自食惡果不足惜瘤袖,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昂验。 院中可真熱鬧捂敌,春花似錦、人聲如沸既琴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甫恩。三九已至逆济,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奖慌。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工霎终, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人升薯。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像击困,于是被迫代替她去往敵國和親涎劈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容