一相满、前提
- 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_library
和android_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_library
和android_binary
拯爽; - 開始構建索抓;