注意:使用 Bazel 建構 Android 應用程式時有一些已知的限制。 請前往 GitHub team-Android 熱點清單,查看已知問題清單。雖然 Bazel 團隊與開放原始碼軟體 (OSS) 貢獻者會積極解決已知問題,但使用者應瞭解 Android Studio 並未正式支援 Bazel 專案。
本教學課程說明如何使用 Bazel 建構簡易的 Android 應用程式。
Bazel 支援使用 Android 規則。
本教學課程的適用對象為 Windows、macOS 和 Linux 使用者,而非 需要有 Bazel 或 Android 應用程式開發經驗。您不一定要 並撰寫任何 Android 程式碼
課程內容
在本教學課程中,您會瞭解如何執行下列作業:
- 安裝 Bazel 和 Android Studio 來設定環境 下載範例專案
- 設定包含原始碼的 Bazel 工作區
以及
WORKSPACE
檔案,用於識別應用程式的 工作區目錄 - 更新
WORKSPACE
檔案,加入所需必要參照 外部依附元件 (例如 Android SDK) - 建立
BUILD
檔案。 - 使用 Bazel 建構應用程式。
- 在 Android 模擬器或實體裝置上部署及執行應用程式。
事前準備
安裝 Bazel
開始教學課程前,請先安裝下列軟體:
- Bazel按照安裝操作說明進行安裝。
- Android Studio:如要安裝,請按照這裡的步驟下載 Android 手機 Studio。 執行設定精靈以下載 SDK 並設定環境。
- (選用) Git.使用
git
下載 Android 應用程式專案。
取得範例專案
針對範例專案,請在下列位置使用基本 Android 應用程式專案: Bazel 的範例存放區。
此應用程式有單一按鈕,可在使用者點選時列印問候語:
圖 1. Android 應用程式按鈕問候語。
使用 git
複製存放區 (或下載 ZIP 檔案)
直接):
git clone https://github.com/bazelbuild/examples
本教學課程的範例專案位於 examples/android/tutorial
。適用對象
在教學課程的其餘部分,您將在這個目錄中執行指令。
查看來源檔案
查看應用程式的來源檔案。
.
├── 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
主要檔案和目錄如下:
名稱 | 位置 |
---|---|
Android 資訊清單檔案 | src/main/AndroidManifest.xml 和src/main/java/com/example/bazel/AndroidManifest.xml |
Android 來源檔案 | src/main/java/com/example/bazel/MainActivity.java 和Greeter.java |
資源檔案目錄 | src/main/java/com/example/bazel/res/ |
使用 Bazel 進行建構
設定工作區
工作區是包含
一或多項軟體專案的來源檔案,並在 WORKSPACE
檔案中找到
也不必擔心
WORKSPACE
檔案可能沒有任何內容,或是包含外部參照
依附元件。
首先,請執行下列指令來建立空白的 WORKSPACE
檔案:
作業系統 | 指令 |
---|---|
Linux、macOS | touch WORKSPACE |
Windows (命令提示字元) | type nul > WORKSPACE |
Windows (PowerShell) | New-Item WORKSPACE -ItemType file |
執行 Bazel
現在您可以使用下列指令檢查 Bazel 是否正常執行:
bazel info workspace
如果 Bazel 輸出目前目錄的路徑,就可以出發了!如果
WORKSPACE
檔案不存在,系統會顯示類似下方的錯誤訊息:
ERROR: The 'info' command is only supported from within a workspace.
與 Android SDK 整合
Bazel 必須執行 Android SDK
建構工具
建構應用程式這表示您需要在
WORKSPACE
檔案,讓 Bazel 知道要在哪裡找到這些內容。
在 WORKSPACE
檔案中新增下列程式碼:
android_sdk_repository(name = "androidsdk")
這會在 ANDROID_HOME
參照的路徑中使用 Android SDK
環境變數,並自動偵測最高 API 級別
安裝於該位置的最新版建構工具。
您可以將 ANDROID_HOME
變數設為 Android SDK 的位置。尋找
使用 Android Studio 的 SDK 執行已安裝 SDK 的路徑
經理。
假設 SDK 安裝在預設位置,您可以使用下列
設定 ANDROID_HOME
變數的指令:
作業系統 | 指令 |
---|---|
Linux | export ANDROID_HOME=$HOME/Android/Sdk/ |
macOS | export ANDROID_HOME=$HOME/Library/Android/sdk |
Windows (命令提示字元) | set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk |
Windows (PowerShell) | $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk" |
上述指令只會為目前的殼層工作階段設定變數。要求 請執行以下指令:
作業系統 | 指令 |
---|---|
Linux | echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc |
macOS | echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc |
Windows (命令提示字元) | setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk" |
Windows (PowerShell) | [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User) |
您也可以明確指定 Android SDK 的絕對路徑
加入 path
、API 級別,以及要使用的建構工具版本。
api_level
和 build_tools_version
屬性。如果 api_level
和
未指定build_tools_version
,android_sdk_repository
規則會
請使用 SDK 中提供的最新版本。您可以指定任何
只要這些屬性存在於 SDK 中
範例:
android_sdk_repository(
name = "androidsdk",
path = "/path/to/Android/sdk",
api_level = 25,
build_tools_version = "30.0.3"
)
在 Windows 上,請注意,path
屬性必須使用混合樣式路徑,
是具有正斜線的 Windows 路徑:
android_sdk_repository(
name = "androidsdk",
path = "c:/path/to/Android/sdk",
)
選用:如要將原生程式碼編譯至 Android 應用程式,您必須
您還需要下載 Android
NDK
並在 WORKSPACE
檔案中加入下列程式碼,讓 Bazel 知道可以找到該檔案的位置:
android_ndk_repository(name = "androidndk")
與 android_sdk_repository
類似,系統會推論 Android NDK 的路徑
來自 ANDROID_NDK_HOME
環境變數。路徑
只要在 android_ndk_repository
上使用 path
屬性明確指定即可。
詳情請參閱將 Android 原生開發套件與 Bazel。
api_level
是 SDK 和 NDK 的 Android API 版本
target - 例如,Android 6.0 為 23,Android 7.1 則為 25。如果不是
已明確設定,api_level
預設為
android_sdk_repository
和android_ndk_repository
。
您不需要將 SDK 和 NDK 的 API 級別設為相同的值。 這個頁面 包含從 Android 版本到支援 NDK 的 API 級別的對應表。
建立 BUILD 檔案
BUILD
檔案說明關聯
和建構輸出內容組合之間,例如從 aapt
編譯的 Android 資源,或是
javac
的類別檔案及其依附元件。這些依附元件可能是
工作區或其他建構輸出內容中的來源檔案 (Java、C++)。BUILD
個檔案
使用的語言是 Starlark。
BUILD
檔案是 Bazel 中稱為套件階層的概念的一部分。
套件階層是疊加目錄的邏輯結構
主要容器結構每個套件都是
包含一組相關來源檔案的目錄 (及其子目錄)
和 BUILD
檔案套件也包括任何子目錄,但不包括
包含自己的 BUILD
檔案的檔案。「套件名稱」是
相對於 WORKSPACE
的 BUILD
檔案。
請注意,Bazel 的套件階層在概念上與 Java 程式碼不同
Android 應用程式目錄的套件階層,其中 BUILD
檔案
但目錄的組織方式可能完全相同。
針對本教學課程中的簡易 Android 應用程式,src/main/
中的來源檔案
當中包含單一 Bazel 套件較複雜的專案可能包含許多巢狀結構
套件
新增 android_library 規則
BUILD
檔案包含多種不同類型的 Bazel 宣告。
最重要的類型是
建構規則
Bazel 如何從一組來源建構中繼或最終軟體輸出內容
或其他依附元件Bazel 提供了兩項建構規則
android_library
和
android_binary
,您可以用來
建構 Android 應用程式
在本教學課程中,您將先使用
android_library
規則,指示 Bazel 建構 Android 程式庫
模組
應用程式原始碼和資源檔案中。接下來,您會使用
android_binary
規則告知 Bazel 如何建構 Android 應用程式套件。
在 src/main/java/com/example/bazel
目錄中建立新的 BUILD
檔案。
並宣告新的 android_library
目標:
src/main/java/com/example/bazel/BUILD
:
package(
default_visibility = ["//src:__subpackages__"],
)
android_library(
name = "greeter_activity",
srcs = [
"Greeter.java",
"MainActivity.java",
],
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_library
建構規則包含一組屬性,用來指定
Bazel 需要從來源檔案建構程式庫模組所需的資訊。
另請注意,規則名稱是 greeter_activity
。透過
在 android_binary
規則中使用此名稱做為依附元件的規則。
新增 android_binary 規則
android_binary
規則建構
應用程式的 Android 應用程式套件 (.apk
檔案)。
在 src/main/
目錄中建立新的 BUILD
檔案。
並宣告新的 android_binary
目標:
src/main/BUILD
:
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
這裡的 deps
屬性參照 greeter_activity
規則的輸出內容
您已新增至上述 BUILD
檔案。也就是說,當 Bazel 建構了
其輸出內容會先檢查
已建立 greeter_activity
程式庫規則,並已更新為最新狀態。如果沒有,Bazel
建構應用程式,然後使用該輸出內容建構應用程式套件檔案。
現在請儲存並關閉檔案。
建構應用程式
請嘗試建構應用程式!執行下列指令來建構
android_binary
目標:
bazel build //src/main:app
build
子指令會指示 Bazel 建構
下一個目標目標被指定為內部建構規則的名稱
BUILD
檔案及工作區相對路徑
目錄。在這個範例中,目標為 app
,套件路徑為
//src/main/
。
請注意,有時您可以省略套件路徑或目標名稱,實際情況取決於 找到目前的工作目錄,以及目標名稱。 如要進一步瞭解目標標籤和路徑,請參閱標籤。
Bazel 就會開始建構範例應用程式。在建構程序中 看起來會像這樣:
INFO: Analysed target //src/main:app (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src/main:app up-to-date:
bazel-bin/src/main/app_deploy.jar
bazel-bin/src/main/app_unsigned.apk
bazel-bin/src/main/app.apk
找出建構輸出內容
Bazel 會將中繼與最終建構作業的輸出內容放在集合中
每個工作區每個使用者、每個工作區的輸出目錄這些目錄會互相連結
從以下位置存取專案目錄頂層:
WORKSPACE
為:
bazel-bin
會儲存二進位執行檔和其他可執行的建構輸出內容bazel-genfiles
會儲存 Bazel 規則bazel-out
會儲存其他類型的建構輸出內容
Bazel 會儲存使用 android_binary
規則產生的 Android .apk
檔案
位於 bazel-bin/src/main
目錄,子目錄名稱為 src/main
衍生自 Bazel 套件的名稱
在命令提示字元中,列出此目錄的內容並找出 app.apk
檔案:
作業系統 | 指令 |
---|---|
Linux、macOS | ls bazel-bin/src/main |
Windows (命令提示字元) | dir bazel-bin\src\main |
Windows (PowerShell) | ls bazel-bin\src\main |
執行應用程式
您現在可以前往以下網址,將應用程式部署至已連結的 Android 裝置或模擬器:
使用 bazel
mobile-install
指令建立指令列。這項指令會使用
Android Debug Bridge (adb
),以便與裝置通訊。您必須設定
確認裝置使用 adb
,請按照 Android Debug 中的操作說明
橋接。個人中心
您也可以在 Android 模擬器上安裝應用程式
在執行下方指令前,請確認模擬器正在執行。
輸入下列指令:
bazel mobile-install //src/main:app
接著,尋找並啟動「Bazel Tutorial App」:
圖 2. Bazel 教學課程應用程式。
恭喜!您已安裝第一個透過 Bazel 建立的 Android 應用程式。
請注意,mobile-install
子指令也支援
--incremental
旗標,可用於
僅部署應用程式內自上次部署後有變更的部分。
它也支援使用 --start_app
標記,在以下情況時立即啟動應用程式:
安裝中。
延伸閱讀
詳情請參閱以下頁面:
- 在 GitHub 上開啟問題
- 進一步瞭解行動裝置安裝
- 整合外部依附元件,例如 Maven 的 AppCompat、Guava 和 JUnit 使用 rules_jvm_external 存放區
- 使用 robolectric-bazel 執行 Robolectric 測試 擷取及準備資料、針對特定領域進行預先訓練 調整指示、離線評估和整合
- 使用 Android 檢測設備測試測試應用程式
- 使用 NDK 將 C 和 C++ 程式碼整合到 Android 應用程式中
- 查看下列其他 Bazel 專案範例:
祝您建構愉快!