編譯流程(4)

Google給出了編譯Android的三步驟,分別是:

  1. source build/envsetup.sh:設(shè)置環(huán)境
  2. lunch aosp_arm-eng:選擇目標(biāo)
  3. make -j16:執(zhí)行編譯 借助-jN參數(shù)處理并行任務(wù)帮非,N介于編譯時(shí)所用計(jì)算機(jī)核心數(shù)的1-2倍之間
    下面具體分析這三個(gè)步驟:

1.source流程(加載命令)

source命令也稱為“點(diǎn)命令”塞椎,也就是一個(gè)點(diǎn)符號(hào)(.)溺森,其使Shell讀入指定的Shell腳本并依次執(zhí)行腳本中的所有語句霍骄。
先來看看build/envsetup.sh腳本的內(nèi)容:

一.加載函數(shù)
  1. croot:切換到源碼樹的根目錄
  2. lunch:選擇編譯板型
  3. m:在源碼樹的根目錄執(zhí)行make
  4. mm:編譯當(dāng)前目錄下的模塊,不包含依賴
  5. mmm:編譯指定目錄下的模塊菠隆,不包含依賴
  6. mma:編譯當(dāng)前目錄下的模塊,包含依賴
  7. mmma:編譯指定目錄下的模塊狂秘,包含依賴
  8. cgrep:在所有C/C++文件上執(zhí)行g(shù)rep
  9. jgrep:在所有Java文件上執(zhí)行g(shù)rep
  10. resgrep:在所有res/*.xml文件上執(zhí)行g(shù)rep
  11. printconfig:顯示當(dāng)前Build的配置信息

比如m函數(shù)的定義如下:

#build/envsetup.sh
function m()
{
    local T=$(gettop)
    local DRV=$(getdriver $T)
    if [ "$T" ]; then
        $DRV make -C $T -f build/core/main.mk $@
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
        return 1
    fi
}
二.定義3種編譯模式:
#build/envsetup.sh
VARIANT_CHOICES=(user userdebug eng)

user:權(quán)限受限骇径;適用于生產(chǎn)環(huán)境
userdebug:與user類似,但具有root權(quán)限和可調(diào)試性
eng: 具有額外調(diào)試工具的開發(fā)配置

三. 加載默認(rèn)的lunch選項(xiàng)到LUNCH_MENU_CHOICES:
#build/envsetup.sh
#LUNCH_MENU_CHOICES存放lunch變量者春,先清空
unset LUNCH_MENU_CHOICES

add_lunch_combo aosp_arm-eng
add_lunch_combo aosp_arm64-eng
....
#add_lunch_combo主要是向LUNCH_MENU_CHOICES添加lunch變量
function add_lunch_combo()
{
    local new_combo=$1
    local c
    for c in ${LUNCH_MENU_CHOICES[@]} ; do
        if [ "$new_combo" = "$c" ] ; then
            return
        fi
    done
    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
}

除了默認(rèn)的lunch選項(xiàng)外破衔,在“device/廠商/版型”目錄中的vendorsetup.sh還有add_lunch_combo的調(diào)用,部分摘錄如下:

add_lunch_combo aosp_angler-userdebug
四. 查找所有的vendorsetup.sh腳本并執(zhí)行:
#build/envsetup.sh
#查找的目錄層級(jí)為4層
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
    echo "including $f"
    . $f
done
unset f

2.lunch流程

由第一步可知钱烟,lunch是build/envsetup.sh腳本中定義的用來選擇對(duì)應(yīng)的編譯項(xiàng)的晰筛,下面看看lunch函數(shù)都做了哪些事情。

一.獲取編譯目標(biāo)保存到answer變量:
    if [ "$1" ] ; then
        answer=$1
二.根據(jù)answer變量從LUNCH_MENU_CHOICES中獲取值賦給selection:
    if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
    then
        selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
    fi
三.從selection變量獲取product變量
local product=$(echo -n $selection | sed -e "s/-.*$//") 
四.從selection變量獲取VARIANT_CHOICES(eng/user/userdebug)
 local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
五.導(dǎo)出宏變量:
    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release
六.調(diào)用配置/打印函數(shù)
    #set_stuff_for_environment主要就是設(shè)置PROMPT_COMMAND拴袭,ANDROID_BUILD_PATHS传惠,JAVA_HOME和BUILD_ENV_SEQUENCE_NUMBER等等環(huán)境變量
    set_stuff_for_environment
    #printconfig用來打印最終準(zhǔn)備好的環(huán)境變量
    printconfig 

3.make流程

3.1 編譯入口

在Android源碼根目錄下執(zhí)行make命令,系統(tǒng)會(huì)找到根目錄下的Makefile文件稻扬,里面指向了另外一個(gè)mk文件:

#Makefile
include build/core/main.mk  
3.2 導(dǎo)入依賴/確定編譯模式/定義編譯目標(biāo)/編譯
#build/core/main.mk 
....
#確定shell
ifdef ANDROID_BUILD_SHELL
SHELL := $(ANDROID_BUILD_SHELL)
else
SHELL := /bin/bash
endif
....
#檢查MAKE版本
ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \>= 3.81)))
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL):
....
#設(shè)定默認(rèn)編譯目標(biāo)
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL):
....
#導(dǎo)入工具和編譯模塊
include $(BUILD_SYSTEM)/config.mk
#定義target清除編譯文件
include $(BUILD_SYSTEM)/cleanbuild.mk
....
#確定編譯模式 user/userdebug/eng
user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
tags_to_install :=
ifneq (,$(user_variant))
  ifeq ($(user_variant),userdebug)
    tags_to_install += debug
  else
    enable_target_debugging :=
  endif
....
#查找所有的android.mk
subdir_makefiles := \
    $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) $(subdirs) Android.mk)
#執(zhí)行編譯
$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))
....
#定義編譯目標(biāo) 
.PHONY: ramdisk
ramdisk: $(INSTALLED_RAMDISK_TARGET)

注意:make update-api

谷歌對(duì)于所有的類和API卦方,分為開方和非開放兩種,而開放的類和API泰佳,可以通過“Javadoc”標(biāo)簽與源碼同步生成“開發(fā)文檔”盼砍;
當(dāng)我們修改或者添加一個(gè)新的API時(shí),我們有兩種方案可以避免出現(xiàn)上述錯(cuò)誤.

  1. 將該接口加上非公開的標(biāo)簽:/*{@hide}/逝她;
  2. 在修改后執(zhí)行:makeupdate-api浇坐,將修改內(nèi)容與API的doc文件更新到一致。同時(shí)在frameworks/base/api庫下面會(huì)產(chǎn)生“.current.txt”文件的差異黔宛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末近刘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌觉渴,老刑警劉巖介劫,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異案淋,居然都是意外死亡座韵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門踢京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉碴,“玉大人,你說我怎么就攤上這事瓣距∏粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蹈丸,是天一觀的道長(zhǎng)蹬屹。 經(jīng)常有香客問我,道長(zhǎng)白华,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任贩耐,我火速辦了婚禮弧腥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潮太。我一直安慰自己管搪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布铡买。 她就那樣靜靜地躺著更鲁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奇钞。 梳的紋絲不亂的頭發(fā)上澡为,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音景埃,去河邊找鬼媒至。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谷徙,可吹牛的內(nèi)容都是我干的拒啰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼完慧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谋旦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤册着,失蹤者是張志新(化名)和其女友劉穎拴孤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體指蚜,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乞巧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摊鸡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绽媒。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖免猾,靈堂內(nèi)的尸體忽然破棺而出是辕,到底是詐尸還是另有隱情,我是刑警寧澤猎提,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布获三,位于F島的核電站,受9級(jí)特大地震影響锨苏,放射性物質(zhì)發(fā)生泄漏疙教。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一伞租、第九天 我趴在偏房一處隱蔽的房頂上張望贞谓。 院中可真熱鬧,春花似錦葵诈、人聲如沸裸弦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽理疙。三九已至,卻和暖如春泞坦,著一層夾襖步出監(jiān)牢的瞬間窖贤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工贰锁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留主之,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓李根,卻偏偏與公主長(zhǎng)得像槽奕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子房轿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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