使用 Soong 來進行 Android 模塊的構(gòu)建

原文地址:https://android.googlesource.com/platform/build/soong/

Soong 是原基于 make 的構(gòu)建系統(tǒng)的替代品蜘澜。它使用 Android.bp 來取代 Android.mk两踏,并使用類似于 JSON 的格式來描述一個模塊的構(gòu)建方案盐碱。

Android.bp 文件格式

Android.bp 的設(shè)計非常簡單,沒有條件判斷或控制流語句蹋嵌。在 Go 語言中編寫的構(gòu)建邏輯沒有任何復(fù)雜度。Android.bp 的語法和語義可能也類似于 Bazel BUILD 文件。

模塊

模塊在 Android.bp 文件中以一個模塊類型開始炫隶,后面跟著一組屬性,以名值對(name: value)表示憔披〉认蓿基本格式為:

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

每個模塊都必須有一個 name 屬性爸吮,name 的值在所有的 Android.bp 文件中都必須是唯一的。
有關(guān)有效模塊類型及其屬性的列表望门,請參閱 $OUT_DIR/soong/.bootstrap/docs/soong_build.html形娇。

變量

Android.bp 文件可以包含頂級變量并賦值:

gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
    name: "gzip",
    srcs: gzip_srcs,
    shared_libs: ["libz"],
    stl: "none",
}

變量的范圍被限定為它們聲明的文件的剩余部分,以及任何子 blueprint 文件筹误。變量只能夠被 += 進行附加賦值桐早,而且只有在被引用之前可變。

注釋

Android.bp 文件可以使用 C 風(fēng)格的多行 /* */ 和 C++ 風(fēng)格的單行 // 注釋厨剪。

類型

變量和屬性是強類型的哄酝,基于第一次被賦值的值動態(tài)推定,以及由模塊類型決定的靜態(tài)屬性祷膳。支持的類型有:

布爾值(true 或 false)
字符串(”string”)
字符串列表([“string1”, “string2”])
Map({key1: “value1”, key2:[“value2”]})

Map 可以包含任意類型的值陶衅,包括嵌套的 Map。列表和 Map 允許在最后一個值之后有逗號直晨。

操作符

字符串搀军,字符串列表和 Map 可以使用 + 運算符進行附加。附加 Map 將生成兩個 Map 中的鍵的并集勇皇,并且附加兩個 Map 中存在的所有鍵的值罩句。

默認模塊

默認模塊可以描述在多個模塊中被重復(fù)的相同屬性。例如:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}
cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

格式化工具

Soong 包含了一個 blueprint 文件的格式化器敛摘,類似于 gofmt门烂。使用以下命令來遞歸格式化當(dāng)前目錄中的所有 Android.bp 文件:

$ bpfmt -w

標(biāo)準(zhǔn)格式包括 4 個空格的縮進,包含多個元素的列表中兄淫,每個元素之后的換行符屯远,并且始終包括列表和 Map 中的逗號。

轉(zhuǎn)換 Android.mk 文件:

androidmk Android.mk > Android.bp

該工具可以轉(zhuǎn)換變量拖叙,模塊氓润,注釋和一些條件,但任何自定義的 Makefile 規(guī)則薯鳍,復(fù)雜條件或額外的 include 必須手動轉(zhuǎn)換咖气。

Android.mk和Android.bp之間的差異

Android.mk 文件通常包含了擁有相同名稱的多個模塊(例如,對于同時擁有靜態(tài)和動態(tài)版本的庫挖滤,或同時供主機和設(shè)備使用的庫)崩溪。Android.bp 文件要求每個模塊擁有唯一的名稱,但每個模塊可以內(nèi)置多種變化斩松,例如添加 host_supported: true伶唯。 androidmk 轉(zhuǎn)換器將產(chǎn)生多個沖突的模塊,必須手動合并到單個模塊內(nèi)的 target: { android: { }, host: { } } 塊里惧盹。

構(gòu)建邏輯

構(gòu)建邏輯使用 Go 語言編寫乳幸,并使用 blueprint 框架瞪讼。構(gòu)建邏輯接收模塊定義,并利用反射和構(gòu)建規(guī)則解析為 Go 數(shù)據(jù)結(jié)構(gòu)粹断。構(gòu)建規(guī)則由 blueprint 收集并寫入 ninja 構(gòu)建文件符欠。

常見問題

如何寫一個條件判斷?

Soong 故意不支持 Android.bp 文件中的條件瓶埋。作為替代希柿,復(fù)雜的、需要用到條件的構(gòu)建規(guī)則已被 Go 處理养筒,可以使用高級語言特征來跟蹤由條件引入的隱式依賴關(guān)系曾撤。大多數(shù)條件將被轉(zhuǎn)換為 Map 屬性,Map 中的一個值將被選中并附加到頂級屬性晕粪。

例如挤悉,支持特定架構(gòu)的文件:

cc_library {
    ...
    srcs: ["generic.cpp"],
    arch: {
        arm: {
            srcs: ["arm.cpp"],
        },
        x86: {
            srcs: ["x86.cpp"],
        },
    },
}

有關(guān)產(chǎn)品變量或環(huán)境變量的更復(fù)雜條件的示例,請參閱 art/build/art.go 或 external/llvm/soong/llvm.go兵多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尖啡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剩膘,更是在濱河造成了極大的恐慌,老刑警劉巖盆顾,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怠褐,死亡現(xiàn)場離奇詭異,居然都是意外死亡您宪,警方通過查閱死者的電腦和手機奈懒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪巨,“玉大人磷杏,你說我怎么就攤上這事∧笞浚” “怎么了极祸?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怠晴。 經(jīng)常有香客問我遥金,道長,這世上最難降的妖魔是什么蒜田? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任稿械,我火速辦了婚禮,結(jié)果婚禮上冲粤,老公的妹妹穿的比我還像新娘美莫。我一直安慰自己页眯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布厢呵。 她就那樣靜靜地躺著餐茵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪述吸。 梳的紋絲不亂的頭發(fā)上忿族,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音蝌矛,去河邊找鬼道批。 笑死,一個胖子當(dāng)著我的面吹牛入撒,可吹牛的內(nèi)容都是我干的隆豹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼茅逮,長吁一口氣:“原來是場噩夢啊……” “哼璃赡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起献雅,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤碉考,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挺身,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侯谁,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年章钾,在試婚紗的時候發(fā)現(xiàn)自己被綠了墙贱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡贱傀,死狀恐怖惨撇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情府寒,我是刑警寧澤魁衙,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站椰棘,受9級特大地震影響纺棺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邪狞,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一祷蝌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帆卓,春花似錦巨朦、人聲如沸米丘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拄查。三九已至,卻和暖如春棚蓄,著一層夾襖步出監(jiān)牢的瞬間堕扶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工梭依, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稍算,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓役拴,卻偏偏與公主長得像糊探,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子河闰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,528評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理科平,服務(wù)發(fā)現(xiàn),斷路器姜性,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 22年12月更新:個人網(wǎng)站關(guān)停瞪慧,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,160評論 22 257
  • 無戒365極限挑戰(zhàn)日更營 早知是這樣撕心裂肺的結(jié)束汞贸,當(dāng)初又何必滿心期待的開始。 一切都是宿命印机。 當(dāng)冰冷的機器進入她...
    藍煙月閱讀 684評論 1 6
  • 使用一個很好用的app的時候,或者在一個不起眼的繪本借閱網(wǎng)站上借書的時候门驾,它們雖然不起眼射赛,沒有上市創(chuàng)業(yè)成功這樣的光...
    綠玉閱讀 210評論 0 1