1. 程式人生 > >【Bash百寶箱】從Android.mk到Android.bp

【Bash百寶箱】從Android.mk到Android.bp

最近更新了Android Nougat原始碼,無意間發現Android的編譯系統已經發生了巨大改變,到處是“Android.bp”檔案,下面就來看一下這個bp檔案到底是何方神聖。

首先從Soong說起,Soong是Android中對基於GNU make的編譯系統的替代物,編譯檔案“Android.mk”被替換為“Android.bp”。bp檔案的目的就是一切從簡,格式類似於JSON,像mk檔案的條件控制語句等這些複雜的東西都由Go來處理,bp檔案是由Go語言來解析的,為“blueprint”框架,隨後轉為Ninja檔案,這大概就是Google的Go興起後轉而使用Go來重構自己的編譯系統。bp檔案的語法、語義同Bazel,如下網址是Bazel的參考文件:

https://bazel.build/versions/master/docs/be/overview.html

Bazel是Google開源的自動化構建工具,意在替換複雜、臃腫的Makefile,這裡不做詳細介紹。下面介紹bp檔案的常用規則。

1、模組

定義一個模組從模組的型別開始,模組有不同的型別,如下例子中的“cc_binary”,模組包含一些屬性,格式為“property-name: property-value”,其中name屬性必須指定,其屬性值必須是全域性唯一的。

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

預設模組“cc_defaults”的用法如下(效果同上面的例子):

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

2、變數

變數賦值使用“=”或“+=”,有其作用域,例子如下。

gzip_srcs = ["src/test/minigzip.c"],

cc_binary {
    name: "gzip",
    srcs: gzip_srcs,
    shared_libs: ["libz"],
    stl: "none",
}

3、註釋

註釋包括單行註釋和多行註釋,例子如下。

// single-line comment
/*
* multi-line comment
*/

4、型別

變數和屬性都有型別,變數的型別在其第一次賦值時而定,屬性的型別由其模組型別而定,具體支援以下幾種型別。

Bool型別:truefalse
String型別:"string"
字串列表型別:["string1", "string2"]
Map型別:{key1: "value1", key2: "value2"}

5、操作符

String型別、字串列表型別和Map型別支援操作符“+”。

6、格式控制工具

bpfmt是一個bp檔案的格式控制工具,包括4個空格的縮排、列表有多個元素時每個元素一行、列表和map的最後一個元素多一個冗餘的逗號等等,如下例子用於遞迴格式化當前目錄下的所有bp檔案

bpfmt -w .

7、從Android.mk到Android.bp

androidmk Android.mk > Android.bp

androidmk工具可以把mk檔案轉換為bp檔案,但一些發雜的用法和自定義的規則需要手動轉換。