Android的Soong介紹

原文:https://android.googlesource.com/platform/build/soong/+/master/README.md

Soong

Soong是以前Android基于make的編譯系統(tǒng)的替代品瓷产。它以Android.bp文件替代Android.mk,Android.bp文件用類似JSON的簡(jiǎn)潔聲明來描述需要構(gòu)建的模塊锯岖。

Android.bp文件格式

Android.bp文件設(shè)計(jì)得非常簡(jiǎn)潔钝凶。沒有條件或控制流語言(任何復(fù)雜性都在用Go編寫的構(gòu)建邏輯中被處理)仪芒。Android.bp文件的語法和語義在可能的情況下有意類似于 Bazel構(gòu)建文件

模塊

Android.bp文件中的模塊以模塊類型開頭耕陷,后跟一組name: value格式的屬性:

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

每個(gè)模塊必須有name屬性掂名,且其值在所有Android.bp文件中必須是唯一的。
關(guān)于可用模塊類型及其屬性列表哟沫,參見$OUT_DIR/soong/.bootstrap/docs/soong_build.html.

Glob模式

獲取文件列表的屬性可以采用glob模式饺蔑。Glob模式可以包含普通的Unix通配符*,如"*.java"嗜诀。Glob模式還可以包含單個(gè)**通配符作為路徑元素猾警,它將匹配零個(gè)或多個(gè)路徑元素。如 java/**/*.java 將匹配
java/Main.javajava/com/android/Main.java隆敢。

變量

Android.bp文件可包含頂級(jí)變量賦值:

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

變量范圍限定為聲明它們的文件的其余部分发皿,以及任何子藍(lán)圖文件。變量是不可變的拂蝎,但有一個(gè)例外 —— 它們可以附上+= 賦值穴墅,但僅在變量被引用之前。

注釋

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

類型

變量和屬性是強(qiáng)類型的玄货,變量動(dòng)態(tài)地基于首次賦值皇钞,屬性靜態(tài)地由模塊類型。支持的類型是:

  • Bool (true or false)
  • Integers (int)
  • Strings ("string")
  • Lists of strings (["string1", "string2"])
  • Maps ({key1: "value1", key2: ["value2"]})

Map可以是任何類型的值誉结,包括嵌套Map鹅士。List和Map在最后一個(gè)值后可能有逗號(hào)。

操作符

字符串(String)惩坑,字符串列表和映射(Map)可以使用 + 操作符追加字符串掉盅。整形(Integers )可以使用 + 操作符來求和。追加Map映射會(huì)產(chǎn)生兩個(gè)Map中鍵(Key)的并集以舒,并追加上兩個(gè)Map中所有鍵的值(Value)趾痘。

默認(rèn)模塊

默認(rèn)模塊可用于在多個(gè)模塊中重復(fù)相同的屬性。例如:

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

名稱解析

Soong提供為不同目錄中的模塊指定相同名稱的能力蔓钟,只要每個(gè)模塊在單獨(dú)的命名空間中聲明即可永票。命名空間可以像這樣聲明:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

每個(gè)Soong模塊都根據(jù)其在樹中的位置分配命名空間。每個(gè)Soong模塊都被認(rèn)為是在當(dāng)前目錄或最近祖先目錄中的Android.bp中找到的soong_namespace定義的命名空間中滥沫,除非找不到這樣的soong_namespace模塊侣集,在這種情況下,模塊被認(rèn)為是在隱式root命名空間中兰绣。

當(dāng)Soong嘗試解析依賴關(guān)系D聲明的我的模塊M時(shí)(M在導(dǎo)入命名空間I1世分,I2,I3 ......的命名空間N中)缀辩,如果D是一個(gè)形如“// namespace:module”的完全限定名稱臭埋,則只有特定的命名空間才會(huì)被搜索指定的模塊名稱。否則臀玄,Soong將首先查找在命名空間N中聲明的名為D的模塊瓢阴。如果該模塊不存在,Soong將在命名空間I1健无,I2荣恐,I3中尋找名為D的模塊......最后,Soong將查找根命名空間累贤。

在我們完全從Make轉(zhuǎn)換為Soong之前募胃,Make product配置必須指定PRODUCT_SOONG_NAMESPACES的值。它的值應(yīng)該是一個(gè)空格分隔的命名空間列表畦浓,Soong導(dǎo)出到Make由m命令構(gòu)建 。在我們完全從Make轉(zhuǎn)換為Soong之后检疫,啟用命名空間的細(xì)節(jié)可能會(huì)發(fā)生變化讶请。

格式化

Soong包含一個(gè)藍(lán)圖文件的規(guī)范的格式化程序,類似于gofmt。以遞歸重新格式化當(dāng)前目錄中的所有Android.bp文件:

bpfmt -w .

規(guī)范的格式包括4個(gè)空格縮進(jìn)夺溢,在多元素列表的每個(gè)元素之后的換行论巍,并且在列表和映射中始終包含尾隨的逗號(hào)。

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

Soong包含一個(gè)工具风响,在將Android.mk文件轉(zhuǎn)換為Android.bp文件時(shí)執(zhí)行第一遍:

androidmk Android.mk > Android.bp

該工具轉(zhuǎn)換變量嘉汰,模塊,注釋和一些條件状勤,但必須手動(dòng)轉(zhuǎn)換任何自定義Makefile規(guī)則鞋怀,復(fù)雜條件或額外包含。

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

  • Android.mk文件通常具有多個(gè)具有相同名稱的模塊(如:庫的靜態(tài)和共享版本持搜,或主機(jī)和設(shè)備版本)密似。Android.bp文件需要每個(gè)模塊有唯一的名稱,但是可以在多個(gè)變體中構(gòu)建單個(gè)模塊葫盼,如通過添加host_supported: true残腌。androidmk轉(zhuǎn)換器會(huì)生成多個(gè)沖突的模塊,必須通過處理單個(gè)模塊的target: { android: { }, host: { } }塊里的差異來手動(dòng)解決贫导。

構(gòu)建邏輯

使用blueprint 框架在Go中編寫構(gòu)建邏輯抛猫。構(gòu)建邏輯接收使用反射解析為Go結(jié)構(gòu)的模塊定義并生成構(gòu)建規(guī)則。構(gòu)建規(guī)則由blueprint收集并寫入ninja構(gòu)建文件孩灯。

其他文檔

常問問題

如何編輯條件?

Soong特意在Android.bp文件中不支持條件闺金。相反,需要條件的構(gòu)建規(guī)則的復(fù)雜性在Go中處理钱反,其中可以使用高級(jí)語言特性并且可以跟蹤條件引入的隱式依賴性掖看。大多數(shù)條件被轉(zhuǎn)換為map屬性,其中將選擇映射中的一個(gè)值并將其附加到頂級(jí)屬性面哥。

例如哎壳,要支持特定體系結(jié)構(gòu)的文件:

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

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

Soong開發(fā)

要在Go-aware IDE中加載Soong代碼归榕,請(qǐng)?jiān)赼ndroid樹之外創(chuàng)建一個(gè)目錄,然后:

apt install bindfs
export GOPATH=<path to the directory you created>
build/soong/scripts/setup_go_workspace_for_soong.sh

以上將把Soong源目錄掛載到IDE所期望的布局目錄中吱涉。

聯(lián)系方式

任何疑問請(qǐng)發(fā)電子郵件至android-building@googlegroups.com (外部)或參閱go/soong (內(nèi)部)刹泄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怎爵,隨后出現(xiàn)的幾起案子特石,更是在濱河造成了極大的恐慌,老刑警劉巖鳖链,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姆蘸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逞敷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門狂秦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人推捐,你說我怎么就攤上這事裂问。” “怎么了牛柒?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵堪簿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我焰络,道長(zhǎng)戴甩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任闪彼,我火速辦了婚禮甜孤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畏腕。我一直安慰自己缴川,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布描馅。 她就那樣靜靜地躺著把夸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铭污。 梳的紋絲不亂的頭發(fā)上恋日,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音嘹狞,去河邊找鬼攒至。 笑死途样,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烫止,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饲化,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼第岖!你這毒婦竟也來了块差?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤燎潮,失蹤者是張志新(化名)和其女友劉穎喻鳄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體确封,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡除呵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年唉锌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竿奏。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腥放,靈堂內(nèi)的尸體忽然破棺而出泛啸,到底是詐尸還是另有隱情,我是刑警寧澤秃症,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布候址,位于F島的核電站,受9級(jí)特大地震影響种柑,放射性物質(zhì)發(fā)生泄漏岗仑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一聚请、第九天 我趴在偏房一處隱蔽的房頂上張望荠雕。 院中可真熱鬧,春花似錦驶赏、人聲如沸炸卑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖文。三九已至,卻和暖如春蚯姆,著一層夾襖步出監(jiān)牢的瞬間五续,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工龄恋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疙驾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓篙挽,卻偏偏與公主長(zhǎng)得像荆萤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铣卡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評(píng)論 25 707
  • 一 概述 1.1 編譯系統(tǒng)變化 隨著android工程越來越大链韭,包含的module越來越多,以makefile...
    Little熊貓閱讀 30,469評(píng)論 4 15
  • Soong Soong is the replacement for the old Android make-b...
    gaolinfeng閱讀 3,262評(píng)論 0 2
  • 應(yīng)青椒學(xué)員王雪琴推薦,我加入了一個(gè)有趣而且免費(fèi)的彩鉛繪畫課程蝉仇,第一節(jié)課畫的便是這燈塔旋讹,看的時(shí)候課程已過半殖蚕,迅速拿出...
    陜縣1903賀紹芳閱讀 1,325評(píng)論 1 2
  • “a==b”和”a.equals(b)”有什么區(qū)別?如果 a 和 b 都是對(duì)象沉迹,則 a==b 是比較兩個(gè)對(duì)象的引用...
    迷人的酋長(zhǎng)閱讀 187評(píng)論 0 0