使用Bazel構建Android應用

一相满、前提

  • Bazel
  • Android Studio
  • Git(可選)

二、開始

下載源碼

git clone git@github.com:bazelbuild/examples.git bazel-examples
cd bazel-examples/android/tutorial

使用上述命令clone對應的工程源碼,clone完成后,結構目錄如下:

[min@localhost:] tutorial $ tree
.
├── README.md
└── src
    └── main
        ├── AndroidManifest.xml
        └── java
            └── com
                └── example
                    └── bazel
                        ├── AndroidManifest.xml
                        ├── Greeter.java
                        ├── MainActivity.java
                        └── res
                            ├── layout
                            │   └── activity_main.xml
                            └── values
                                ├── colors.xml
                                └── strings.xml

9 directories, 8 files

初始化工作空間

工作空間是一個包含了與一個或者多個工程源碼的文件目錄诊霹,在其根目錄中存在一個WORKSPACE文件。

這個WORKSPACE文件可能為空睁宰,也有可能包含一些構建項目所需外部依賴的引用缰贝。在macOS或者Linux上,可以使用touch WORKSPACE創(chuàng)建一個空的WORKSPACE文件柠衍。

當創(chuàng)建完成WORKSPACE文件后洋满,可以使用如下命令,檢查Bazel是否準備妥當:

 bazel info workspace

如果Bazel輸出當前目錄當路徑珍坊,即表示配置正確牺勾,示例如下:

[min@bogon:] tutorial $ bazel info workspace
/Users/min/Desktop/workspace/android/min/bazel-examples/android/tutorial

配置工具鏈

大體也能想到使用Bazel去編譯Android App,實際上還是離不開Android SDK Build Tools阵漏,部分場景可能還需要Android NDK驻民,所以Bazel需要一個可以配置Android SDK等工具鏈Path的地方,這就是上面提到的WORKSPACE文件的作用之一履怯。

我們需要在WORKSPACE文件中添加如下兩行內容:

# 配置Android SDK
android_sdk_repository(name = "androidsdk")

# 配置Android NDK(可選)
android_ndk_repository(name = "androidndk")

當然這其實是一種“簡寫”回还,因為Bazel會自動讀取ANDROID_HOME, ANDROID_NDK_HOME環(huán)境變量,然后自動完成配置叹洲,完整版本應該是這個樣子的柠硕,以Android SDK為例:

android_sdk_repository(
    name = "androidsdk",
    path = "/path/to/Android/sdk",
    api_level = 25,
    build_tools_version = "26.0.1"
)

Bazel只會識別ANDROID_HOME, ANDROID_NDK_HOME這兩個環(huán)境變量,所以如果你的Path不是這樣配置的运提,建議就可以使用完整版本配置或者更換Env名稱蝗柔。

創(chuàng)建構建文件

其實任何編譯系統(tǒng)都需要一個來描述編譯規(guī)則的文件,比如build.gradle民泵、CMakeLists.txt等等癣丧,Bazel也不例外,它是一個叫做BUILD的文件栈妆,這個文件可以將Android的各類編譯中間產物的關系進行進行描述胁编,比如aapt編譯出來的資源文件、javac編譯出來的class文件等等签钩,其使用Starlark語言編寫掏呼,具體見Bazel 官網(wǎng)

針對Android铅檩,Bazel提供兩個基礎的編譯規(guī)則:android_libraryandroid_binary憎夷,具體的含義如下:

  • android_library:聲明一個Android library module;
  • android_binary:聲明一個Android App;

創(chuàng)建android_library BUILD

src/main/java/com/example/bazel目錄創(chuàng)建一個BUILD文件昧旨,并將如下內容添加進來:

# src/main/java/com/example/bazel/BUILD

package(
    default_visibility = ["http://src:__subpackages__"],
)

android_library(
    name = "greeter_activity",
    srcs = [
        "Greeter.java",
        "MainActivity.java",
    ],
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
)

創(chuàng)建android_binary BUILD

src/main目錄下創(chuàng)建一個BUILD文件拾给,并將如下內容添加進來:

# src/main/BUILD

android_binary(
    name = "app",
    manifest = "AndroidManifest.xml",
    deps = ["http://src/main/java/com/example/bazel:greeter_activity"],
)

可以看到它依賴了上面android_library定義出來的greeter_activity祥得。

至此,我們的配置工作就完成了蒋得。

構建APP

在當前目錄下執(zhí)行如下構建命令:

tutorial $ bazel build //src/main:app

最后得出如下圖所示結果 (目標APK路徑:bazel-bin/src/main/app.apk):

編譯結果

首次執(zhí)行可能時間會比較長一些

安裝執(zhí)行

關于這部分级及,Bazel給出了一個完整的流程,你可以使用如下命令進行安裝:

bazel mobile-install //src/main:app

備注:如果手機上沒有GMS套件额衙,建議還是使用adb install的方式饮焦,因為筆者在嘗試的過程中發(fā)現(xiàn),這種方式安裝后窍侧,貌似Bazel會對.apk進行修改县踢,導致導致Activity在啟動時回去加載某個com.google.**.Stub*的類。

三伟件、總結

  • 安裝相關工具硼啤,準備工程源碼;
  • 初始化工作空間斧账,在WORKSPACE中配置相關工具鏈谴返,比如Android SDK、Android NDK等咧织;
  • 創(chuàng)建BUILD文件嗓袱,并配置響應的編譯規(guī)則,主要為android_libraryandroid_binary拯爽;
  • 開始構建索抓;

四钧忽、參考

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末毯炮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耸黑,更是在濱河造成了極大的恐慌桃煎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大刊,死亡現(xiàn)場離奇詭異为迈,居然都是意外死亡,警方通過查閱死者的電腦和手機缺菌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門葫辐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伴郁,你說我怎么就攤上這事耿战。” “怎么了焊傅?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵剂陡,是天一觀的道長狈涮。 經常有香客問我,道長鸭栖,這世上最難降的妖魔是什么歌馍? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮晕鹊,結果婚禮上松却,老公的妹妹穿的比我還像新娘。我一直安慰自己溅话,他們只是感情好玻褪,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著公荧,像睡著了一般带射。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上循狰,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天窟社,我揣著相機與錄音,去河邊找鬼绪钥。 笑死灿里,一個胖子當著我的面吹牛,可吹牛的內容都是我干的程腹。 我是一名探鬼主播匣吊,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寸潦!你這毒婦竟也來了色鸳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤见转,失蹤者是張志新(化名)和其女友劉穎命雀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斩箫,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡吏砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乘客。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狐血。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖易核,靈堂內的尸體忽然破棺而出匈织,到底是詐尸還是另有隱情,我是刑警寧澤耸成,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布报亩,位于F島的核電站浴鸿,受9級特大地震影響,放射性物質發(fā)生泄漏弦追。R本人自食惡果不足惜岳链,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劲件。 院中可真熱鬧掸哑,春花似錦、人聲如沸零远。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牵辣。三九已至摔癣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纬向,已是汗流浹背择浊。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逾条,地道東北人琢岩。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像师脂,于是被迫代替她去往敵國和親担孔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容