Android雜談:編譯環(huán)境參數(shù)是從哪里來的锦聊?

Android源碼編譯有很多全局的參數(shù)当编,例如TARGET_OUT_DATA,TARGET_OUT_ROOT ,這些參數(shù)是從何而來的呢丛楚?

編譯步驟

我們通過走一下編譯步驟族壳,看一下,這些參數(shù)的來源吧趣些!

souce build/envsetup.sh

上面這句命令仿荆,是編譯前準備環(huán)境的。
/build/envsetup.sh
可以看到到引進了一堆的函數(shù)喧务,有mm赖歌,mmm等常用指令

函數(shù)引進.png

看看跑了啥邏輯,
1.首先判斷了下shell的環(huán)境,最好使用/bin/bash功茴。
參考:https://www.douban.com/note/404726254/
2.包含廠商vendor目錄的vendorsetup.sh

#只支持shell為/bin/bash庐冯,否則會報錯,ps -o command -p $$是顯示shell的進程名坎穿。
if [ "x$SHELL" != "x/bin/bash" ]; then
    case `ps -o command -p $$` in
        *bash*)
            ;;
        *)
            echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
            ;;
    esac
fi

#引進一些廠商的verdorsetup.sh
# Execute the contents of any vendorsetup.sh files we can find.
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null`
do
    echo "including $f"
    . $f
done
unset f

addcompletions

包含后展父,echo打印出來,像下面這樣子~

verdorsetup.sh
lunch

lunch就是選擇一些編譯參數(shù)玲昧,估計就是在這里準備好這些全局的參數(shù)的栖茉。
lunch函數(shù)在envsetup.sh里面定義

function lunch()
{
    local answer   #定義一個本地變量answer
#獲取第一個輸入?yún)?shù),例如如果執(zhí)行l(wèi)unch mini_emulator_arm64-userdebug孵延,第一個參數(shù)就是mini_emulator_arm64-userdebug
    if [ "$1" ] ; then       
        answer=$1
    else
        print_lunch_menu                     #如果沒有輸入第一個參數(shù)吕漂,例如直接執(zhí)行l(wèi)unch,就會打印出選項讓你選擇
        echo -n "Which would you like? [full-eng] "
        read answer
    fi

    local selection=                    #定義一個本地變量selection

    if [ -z "$answer" ]                  #如果answer為空尘应,selection就是full-eng
    then
        selection=full-eng
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")  #grep -q表示安靜輸出惶凝,-e為正則表達式,匹配0-99
    then
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
            selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
        fi
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")  #匹配整個名稱輸入犬钢,這個正則不太懂~
    then
        selection=$answer
    fi

    if [ -z "$selection" ]  #無效輸入苍鲜,例如你輸入1000就無效啦
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi

    export TARGET_BUILD_APPS=

    local product=$(echo -n $selection | sed -e "s/-.*$//")
    check_product $product  ##檢查product
    if [ $? -ne 0 ]
    then
        echo
        echo "** Don't have a product spec for: '$product'"   #無效的product
        echo "** Do you have the right repo manifest?"
        product=
    fi

    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")  ##編譯類型,例如user玷犹,debug
    check_variant $variant
    if [ $? -ne 0 ]
    then
        echo
        echo "** Invalid variant: '$variant'"                #無效的編譯類型
        echo "** Must be one of ${VARIANT_CHOICES[@]}"
        variant=
    fi

    if [ -z "$product" -o -z "$variant" ]
    then
        echo
        return 1
    fi

    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release

    echo

    set_stuff_for_environment
    printconfig
}

set_stuff_for_environment
會進入set_stuff_for_environment,主要是設(shè)置title混滔,java環(huán)境,paths還有序列號歹颓。貌似沒多大用處~

function set_stuff_for_environment()
{
    settitle
    set_java_home
    setpaths  #一些交叉編譯鏈路徑
    set_sequence_number

    export ANDROID_BUILD_TOP=$(gettop)
}

printconfig
最后會進入printconfig坯屿,就是打印配置信息給我們看啦!

function printconfig()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    get_build_var report_config
}

打印一些配置晴股,可以看到TARGET_PRODUCT愿伴,TARGET_BUILD_VARIANT和TARGET_BUILD_TYPE。


打印配置.png

printconfig包含get_build_var函數(shù),函數(shù)執(zhí)行了一句make指令电湘,make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
(1)make -C "$T" 就是跳轉(zhuǎn)到top目錄。
(2)make -f 來指定makefile文件build/core/config.mk,我去config.mk還是個makefile文件寂呛。
(3)dumpvary用來打印用的怎诫,就是打印第一個參數(shù)$1啦,呵呵呵
所以贷痪,主要get_build_var主要是執(zhí)行makefile config.mk幻妓。

function get_build_var()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1  
}

看看/build/core/config.mk,可以看到他進一步包含了envsetup.mk

include $(BUILD_SYSTEM)/envsetup.mk

envsetup.mk就是最后設(shè)置一些常用編譯環(huán)境參數(shù)的文件了!劫拢!
/build/core/envsetup.mk
看下面的圖肉津,可以看到他定義了很多編譯常量了!舱沧!

編譯常量

總結(jié)

1.通過source envsetup.sh可以引進很多函數(shù)妹沙,包含vendorsetup.sh
2.通過lunch,選擇類型后熟吏,會編譯build/core/config.mk文件距糖,進而再編譯envsetup.mk文件,而這個文件就是定義編譯常量的地方牵寺!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悍引,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帽氓,更是在濱河造成了極大的恐慌趣斤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黎休,死亡現(xiàn)場離奇詭異浓领,居然都是意外死亡,警方通過查閱死者的電腦和手機奋渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門镊逝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嫉鲸,你說我怎么就攤上這事撑蒜。” “怎么了玄渗?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵座菠,是天一觀的道長。 經(jīng)常有香客問我藤树,道長浴滴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任岁钓,我火速辦了婚禮升略,結(jié)果婚禮上微王,老公的妹妹穿的比我還像新娘。我一直安慰自己品嚣,他們只是感情好炕倘,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翰撑,像睡著了一般罩旋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眶诈,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天涨醋,我揣著相機與錄音,去河邊找鬼逝撬。 笑死浴骂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的球拦。 我是一名探鬼主播靠闭,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坎炼!你這毒婦竟也來了愧膀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤谣光,失蹤者是張志新(化名)和其女友劉穎檩淋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萄金,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蟀悦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氧敢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片日戈。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孙乖,靈堂內(nèi)的尸體忽然破棺而出浙炼,到底是詐尸還是另有隱情,我是刑警寧澤唯袄,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布弯屈,位于F島的核電站,受9級特大地震影響恋拷,放射性物質(zhì)發(fā)生泄漏资厉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一蔬顾、第九天 我趴在偏房一處隱蔽的房頂上張望宴偿。 院中可真熱鬧湘捎,春花似錦、人聲如沸酪我。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽都哭。三九已至,卻和暖如春逞带,著一層夾襖步出監(jiān)牢的瞬間欺矫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工展氓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穆趴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓遇汞,卻偏偏與公主長得像未妹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子空入,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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