บทแนะนำนี้จะครอบคลุมวิธีสร้างแอป Android อย่างง่ายโดยใช้ Bazel
Bazel รองรับการสร้างแอป Android โดยใช้ กฎ Android
บทแนะนำนี้มีไว้สำหรับผู้ใช้ Windows, macOS และ Linux และไม่จำเป็นต้องมีประสบการณ์ในการใช้ Bazel หรือการพัฒนาแอป Android คุณไม่จำเป็นต้องเขียนโค้ด Android ในบทแนะนำนี้
สิ่งที่คุณจะได้เรียนรู้
ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีการต่อไปนี้
- ตั้งค่าสภาพแวดล้อมโดยการติดตั้ง Bazel และ Android Studio รวมถึงดาวน์โหลดโปรเจ็กต์ตัวอย่าง
- ตั้งค่าพื้นที่ทำงาน Bazel ที่มีซอร์สโค้ดสำหรับแอปและไฟล์
MODULE.bazelที่ระบุระดับบนสุดของไดเรกทอรีพื้นที่ทำงาน - อัปเดตไฟล์
MODULE.bazelให้มีการอ้างอิงทรัพยากร Dependency ภายนอกที่จำเป็น เช่น 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
ไฟล์และไดเรกทอรีที่สำคัญมีดังนี้
| ชื่อ | ตำแหน่ง |
|---|---|
| ไฟล์ Manifest ของ 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
ตั้งค่าพื้นที่ทำงาน
พื้นที่ทำงานคือไดเรกทอรีที่มี
ไฟล์ต้นฉบับสำหรับโปรเจ็กต์ซอฟต์แวร์อย่างน้อย 1 รายการ และมีไฟล์ MODULE.bazel อยู่ที่
รูท
ไฟล์ MODULE.bazel อาจว่างเปล่าหรือมีการอ้างอิงทรัพยากร Dependency ภายนอกที่จำเป็นในการสร้างโปรเจ็กต์
ขั้นแรก ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์ MODULE.bazel ที่ว่างเปล่า
| ระบบปฏิบัติการ | คำสั่ง |
|---|---|
| Linux, macOS | touch MODULE.bazel |
| Windows (พรอมต์คำสั่ง) | type nul > MODULE.bazel |
| Windows (PowerShell) | New-Item MODULE.bazel -ItemType file |
การเรียกใช้ Bazel
ตอนนี้คุณสามารถตรวจสอบว่า Bazel ทำงานอย่างถูกต้องหรือไม่ด้วยคำสั่งต่อไปนี้
bazel info workspaceหาก Bazel แสดงเส้นทางของไดเรกทอรีปัจจุบัน แสดงว่าคุณพร้อมใช้งาน หากไฟล์ MODULE.bazel ไม่มีอยู่ คุณอาจเห็นข้อความแสดงข้อผิดพลาดดังต่อไปนี้
ERROR: The 'info' command is only supported from within a workspace.
ผสานรวมกับ Android SDK
Bazel ต้องเรียกใช้เครื่องมือสร้าง Android SDK
เพื่อสร้างแอป ซึ่งหมายความว่าคุณต้องเพิ่มข้อมูลบางอย่างลงในไฟล์
MODULE.bazel
เพื่อให้ Bazel ทราบตำแหน่งของเครื่องมือเหล่านั้น
เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ MODULE.bazel
bazel_dep(name = "rules_android", version = "0.6.6")
remote_android_extensions = use_extension(
"@rules_android//bzlmod_extensions:android_extensions.bzl",
"remote_android_tools_extensions")
use_repo(remote_android_extensions, "android_tools")
android_sdk_repository_extension = use_extension("@rules_android//rules/android_sdk_repository:rule.bzl", "android_sdk_repository_extension")
use_repo(android_sdk_repository_extension, "androidsdk")
การดำเนินการนี้จะใช้ Android SDK ในเส้นทางที่อ้างอิงโดยตัวแปรสภาพแวดล้อม ANDROID_HOME และตรวจหาระดับ API สูงสุดและเครื่องมือสร้างเวอร์ชันล่าสุดที่ติดตั้งในตำแหน่งนั้นโดยอัตโนมัติ
คุณสามารถตั้งค่าตัวแปร ANDROID_HOME เป็นตำแหน่งของ Android SDK ได้ ค้นหา
เส้นทางไปยัง SDK ที่ติดตั้งโดยใช้ SDK
Manager ของ Android Studio
สมมติว่า 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 คุณต้องดาวน์โหลด Android
NDK และใช้ rules_android_ndk โดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ MODULE.bazel ด้วย
bazel_dep(name = "rules_android_ndk", version = "0.1.3")
ดูข้อมูลเพิ่มเติมได้ที่ การใช้ Android Native Development Kit กับ Bazel
คุณไม่จำเป็นต้องตั้งค่าระดับ API ให้มีค่าเดียวกันสำหรับ SDK และ NDK หน้านี้ มีแผนที่ที่แสดงการจับคู่ระหว่าง Android เวอร์ชันต่างๆ กับระดับ API ที่ NDK รองรับ
สร้างไฟล์ BUILD
ไฟล์ BUILD อธิบายความสัมพันธ์ระหว่างชุดเอาต์พุตบิลด์ เช่น ทรัพยากร Android ที่คอมไพล์จาก aapt หรือไฟล์คลาสจาก javac กับทรัพยากร Dependency ทรัพยากร Dependency เหล่านี้อาจเป็นไฟล์ต้นฉบับ (Java, C++) ในพื้นที่ทำงานหรือเอาต์พุตการสร้างอื่นๆ ไฟล์ BUILD เขียนด้วยภาษาที่เรียกว่า Starlark
ไฟล์ BUILD เป็นส่วนหนึ่งของแนวคิดใน Bazel ที่เรียกว่า ลำดับชั้นของแพ็กเกจ
ลำดับชั้นของแพ็กเกจเป็นโครงสร้างเชิงตรรกะที่ซ้อนทับโครงสร้างไดเรกทอรีในพื้นที่ทำงาน แต่ละ แพ็กเกจ คือ
ไดเรกทอรี (และไดเรกทอรีย่อย) ที่มีชุดไฟล์ต้นฉบับที่เกี่ยวข้อง
และไฟล์ BUILD แพ็กเกจยังรวมถึงไดเรกทอรีย่อย ยกเว้นไดเรกทอรีย่อยที่มีไฟล์ BUILD ของตัวเอง ชื่อแพ็กเกจคือเส้นทางไปยังไฟล์ BUILD สัมพัทธ์กับไฟล์ MODULE.bazel
โปรดทราบว่าลำดับชั้นของแพ็กเกจของ Bazel นั้นแตกต่างจากลำดับชั้นของแพ็กเกจ Java ของไดเรกทอรีแอป Android ที่ไฟล์ BUILD อยู่ แม้ว่าไดเรกทอรีอาจจัดระเบียบเหมือนกันก็ตาม
สำหรับแอป Android อย่างง่ายในบทแนะนำนี้ ไฟล์ต้นฉบับใน src/main/ ประกอบด้วยแพ็กเกจ Bazel เดียว โปรเจ็กต์ที่ซับซ้อนกว่าอาจมีแพ็กเกจซ้อนกันหลายรายการ
เพิ่มกฎ android_library
ไฟล์ BUILD มีการประกาศหลายประเภทสำหรับ Bazel ประเภทที่สำคัญที่สุดคือ
กฎการสร้าง ซึ่งจะบอก
Bazel ถึงวิธีสร้างเอาต์พุตซอฟต์แวร์ระดับกลางหรือขั้นสุดท้ายจากชุด
ไฟล์ต้นฉบับหรือทรัพยากร Dependency อื่นๆ Bazel มีกฎการบิลด์ 2 ข้อ
android_library และ
android_binary ที่คุณใช้
สร้างแอป Android ได้
สำหรับบทแนะนำนี้ คุณจะใช้กฎ
android_library ก่อนเพื่อบอก Bazel ให้สร้างโมดูลไลบรารี Android
จากซอร์สโค้ดของแอปและไฟล์ทรัพยากร จากนั้นจะใช้กฎ android_binary เพื่อบอก Bazel ถึงวิธีสร้างแพ็กเกจแอปพลิเคชัน Android
สร้างไฟล์ BUILD ใหม่ในไดเรกทอรี src/main/java/com/example/bazel และประกาศเป้าหมาย android_library ใหม่
src/main/java/com/example/bazel/BUILD:
load("@rules_android//rules:rules.bzl", "android_library")
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 คุณจะอ้างอิงกฎโดยใช้ชื่อนี้เป็นทรัพยากร Dependency ในกฎ android_binary
เพิ่มกฎ android_binary
กฎ android_binary จะสร้าง
แพ็กเกจแอปพลิเคชัน Android (ไฟล์ .apk) สำหรับแอป
สร้างไฟล์ BUILD ใหม่ในไดเรกทอรี src/main/ และประกาศเป้าหมาย android_binary ใหม่
src/main/BUILD:
load("@rules_android//rules:rules.bzl", "android_binary")
android_binary(
name = "app",
manifest = "//src/main/java/com/example/bazel: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 จะวางเอาต์พุตของการดำเนินการสร้างทั้งระดับกลางและขั้นสุดท้ายไว้ในชุดไดเรกทอรีเอาต์พุตต่อผู้ใช้และต่อพื้นที่ทำงาน ไดเรกทอรีเหล่านี้จะมีการสร้างลิงก์สัญลักษณ์จากตำแหน่งต่อไปนี้ที่ระดับบนสุดของไดเรกทอรีโปรเจ็กต์ ซึ่งเป็นตำแหน่งที่ไฟล์ MODULE.bazel อยู่
bazel-binจัดเก็บไฟล์ปฏิบัติการไบนารีและเอาต์พุตบิลด์ที่เรียกใช้ได้อื่นๆbazel-genfilesจัดเก็บไฟล์ต้นฉบับระดับกลางที่สร้างโดยกฎ Bazelbazel-outจัดเก็บเอาต์พุตการสร้างประเภทอื่นๆ
Bazel จะจัดเก็บไฟล์ Android .apk ที่สร้างขึ้นโดยใช้กฎ android_binary
ไว้ในไดเรกทอรี bazel-bin/src/main โดยชื่อไดเรกทอรีย่อย src/main ได้
มาจากชื่อแพ็กเกจ Bazel
ใน Command Prompt ให้แสดงรายการเนื้อหาของไดเรกทอรีนี้และค้นหาไฟล์ 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 Bridge
ก่อนการติดตั้ง นอกจากนี้ คุณยังเลือกติดตั้งแอปในโปรแกรมจำลอง Android ที่รวมอยู่ใน Android Studio ได้ด้วย ตรวจสอบว่าโปรแกรมจำลองทำงานอยู่ก่อนที่จะเรียกใช้คำสั่งด้านล่าง
ป้อนข้อมูลต่อไปนี้
bazel mobile-install //src/main:app \
--mode=skylark \
--mobile_install_aspect=@rules_android//mobile_install:mi.bzl \
--mobile_install_supported_rules=android_binary \
--java_runtime_version=17 \
--java_language_version=17 \
--tool_java_runtime_version=17 \
--tool_java_language_version=17โปรดทราบว่าคุณสามารถเพิ่มแฟล็กเพิ่มเติมที่จำเป็นสำหรับการติดตั้งในอุปกรณ์เคลื่อนที่ลงในไฟล์ bazelrc ของโปรเจ็กต์ได้ ระบบจะไม่กำหนดให้ใช้แฟล็กเฉพาะสำหรับการติดตั้งในอุปกรณ์เคลื่อนที่ (--mode, --mobile_install*) ตั้งแต่ Bazel 8.4.0 เป็นต้นไป คุณอาจต้องใช้แฟล็ก Java ต่างๆ สำหรับภาษาและเวอร์ชันรันไทม์ ทั้งนี้ขึ้นอยู่กับการกำหนดค่า Java ของพื้นที่ทำงาน
เครื่องมือย่อยสำหรับการติดตั้งในอุปกรณ์เคลื่อนที่ต้องใช้ภาษาและรันไทม์ระดับ 17 ขึ้นไป
ตอนนี้ "แอปบทแนะนำ Bazel" ควรติดตั้งและเปิดขึ้นโดยอัตโนมัติ

รูปที่ 2 แอปบทแนะนำ Bazel
ยินดีด้วย คุณเพิ่งติดตั้งแอป Android แอปแรกที่สร้างด้วย Bazel
อ่านเพิ่มเติม
ดูรายละเอียดเพิ่มเติมได้ในหน้าต่อไปนี้
- ปัญหาที่เปิดอยู่เกี่ยวกับ rules_android ใน GitHub
- ข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งในอุปกรณ์เคลื่อนที่
- ผสานรวมทรัพยากร Dependency ภายนอก เช่น AppCompat, Guava และ JUnit จากที่เก็บ Maven โดยใช้ rules_jvm_external
- เรียกใช้การทดสอบ Robolectric ด้วยการผสานรวม robolectric-bazel
- การผสานรวมโค้ด C และ C++ ลงในแอป Android ด้วย NDK
- ดูโปรเจ็กต์ตัวอย่าง Bazel เพิ่มเติมของ
ขอให้สนุกกับการสร้าง