หมายเหตุ: มีข้อจำกัดที่ทราบในการใช้ Bazel เพื่อสร้างแอป Android ไปที่รายการปัญหาที่สำคัญของทีม Android ใน Github เพื่อดูรายการปัญหาที่ทราบ แม้ว่าทีม Bazel และผู้ร่วมให้ข้อมูลซอฟต์แวร์โอเพนซอร์ส (OSS) จะทำงานอย่างแข็งขันเพื่อแก้ไขปัญหาที่ทราบ แต่ผู้ใช้ควรทราบว่า Android Studio ไม่รองรับโปรเจ็กต์ Bazel อย่างเป็นทางการ
บทแนะนำนี้ครอบคลุมวิธีสร้างแอป Android อย่างง่ายโดยใช้ Bazel
Bazel รองรับการสร้างแอป Android โดยใช้ กฎ Android
บทแนะนำนี้มีไว้สำหรับผู้ใช้ Windows, macOS และ Linux และไม่จำเป็นต้องมีประสบการณ์ในการใช้ Bazel หรือการพัฒนาแอป Android คุณไม่จำเป็นต้อง เขียนโค้ด Android ในบทแนะนำนี้
สิ่งที่คุณจะได้เรียนรู้
ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีทำสิ่งต่อไปนี้
- ตั้งค่าสภาพแวดล้อมโดยการติดตั้ง Bazel และ Android Studio รวมถึง ดาวน์โหลดโปรเจ็กต์ตัวอย่าง
- ตั้งค่า workspace ของ Bazel ที่มีซอร์สโค้ด
สำหรับแอปและไฟล์
WORKSPACE
ที่ระบุระดับบนสุดของ ไดเรกทอรี workspace - อัปเดตไฟล์
WORKSPACE
ให้มีข้อมูลอ้างอิงถึงทรัพยากร 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 รายการ และมีไฟล์ WORKSPACE
อยู่ที่
รูท
WORKSPACE
อาจว่างเปล่าหรืออาจมีการอ้างอิงถึงการอ้างอิงภายนอกที่จำเป็นต่อการสร้างโปรเจ็กต์
ก่อนอื่น ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์ WORKSPACE
ว่างเปล่า
ระบบปฏิบัติการ | คำสั่ง |
---|---|
Linux, macOS | touch WORKSPACE |
Windows (Command Prompt) | 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 ต้องเรียกใช้ Build Tools ของ Android SDK
เพื่อสร้างแอป ซึ่งหมายความว่าคุณต้องเพิ่มข้อมูลบางอย่างลงในไฟล์
WORKSPACE
เพื่อให้ Bazel รู้ตำแหน่งของเครื่องมือ
เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ WORKSPACE
android_sdk_repository(name = "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 (Command Prompt) | 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 (Command Prompt) | setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk" |
Windows (PowerShell) | [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User) |
นอกจากนี้ คุณยังระบุเส้นทางแบบสัมบูรณ์ของ Android SDK, ระดับ API และเวอร์ชันของเครื่องมือบิลด์ที่จะใช้ได้อย่างชัดเจนโดยรวมแอตทริบิวต์ path
, 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
และบอก Bazel ว่าจะค้นหาได้ที่ใดโดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ WORKSPACE
android_ndk_repository(name = "androidndk")
เช่นเดียวกับ android_sdk_repository
ระบบจะอนุมานเส้นทางไปยัง Android NDK จากตัวแปรสภาพแวดล้อม ANDROID_NDK_HOME
โดยค่าเริ่มต้น นอกจากนี้ คุณยังระบุเส้นทางอย่างชัดเจนได้ด้วยแอตทริบิวต์ path
ใน android_ndk_repository
ดูข้อมูลเพิ่มเติมได้ที่การใช้ Android Native Development Kit กับ Bazel
api_level
คือเวอร์ชันของ Android API ที่ SDK และ NDK
กำหนดเป้าหมาย เช่น 23 สำหรับ Android 6.0 และ 25 สำหรับ Android 7.1 หากไม่ได้ตั้งค่าอย่างชัดเจน api_level
จะเป็นระดับ API สูงสุดที่ใช้ได้สำหรับ android_sdk_repository
และ android_ndk_repository
โดยค่าเริ่มต้น
คุณไม่จำเป็นต้องตั้งค่าระดับ API ให้มีค่าเดียวกันสำหรับ SDK และ NDK หน้านี้ มีแผนที่จากรุ่น Android ไปยังระดับ API ที่ NDK รองรับ
สร้างไฟล์ BUILD
BUILD
ไฟล์จะอธิบายความสัมพันธ์
ระหว่างชุดเอาต์พุตการบิลด์ เช่น ทรัพยากร Android ที่คอมไพล์จาก aapt
หรือ
ไฟล์คลาสจาก javac
กับทรัพยากร Dependency การอ้างอิงเหล่านี้อาจเป็น
ไฟล์ต้นฉบับ (Java, C++) ในพื้นที่ทำงานหรือเอาต์พุตการสร้างอื่นๆ BUILD
ไฟล์
เขียนด้วยภาษาที่เรียกว่า Starlark
BUILD
เป็นส่วนหนึ่งของแนวคิดใน Bazel ที่เรียกว่าลำดับชั้นของแพ็กเกจ
ลำดับชั้นของแพ็กเกจคือโครงสร้างเชิงตรรกะที่ซ้อนทับโครงสร้างไดเรกทอรีในพื้นที่ทำงาน แพ็กเกจแต่ละรายการคือไดเรกทอรี (และไดเรกทอรีย่อย) ที่มีชุดไฟล์ต้นฉบับที่เกี่ยวข้อง
และไฟล์ BUILD
แพ็กเกจยังรวมถึงไดเรกทอรีย่อยทั้งหมด ยกเว้นไดเรกทอรีย่อยที่มีไฟล์ BUILD
ของตัวเอง ชื่อแพ็กเกจคือเส้นทางไปยังไฟล์
BUILD
ที่สัมพันธ์กับ WORKSPACE
โปรดทราบว่าลำดับชั้นของแพ็กเกจของ Bazel นั้นแตกต่างจากลำดับชั้นของแพ็กเกจ Java
ในไดเรกทอรีแอป Android ที่มีไฟล์ BUILD
อยู่
แม้ว่าไดเรกทอรีอาจจัดระเบียบเหมือนกันก็ตาม
สำหรับแอป Android แบบง่ายในบทแนะนำนี้ ไฟล์แหล่งที่มาใน src/main/
ประกอบด้วยแพ็กเกจ Bazel เดียว โปรเจ็กต์ที่ซับซ้อนมากขึ้นอาจมีแพ็กเกจที่ซ้อนกันหลายรายการ
เพิ่มกฎ android_library
BUILD
มีการประกาศหลายประเภทสำหรับ Bazel ประเภทที่สำคัญที่สุดคือกฎการสร้าง ซึ่งจะบอก Bazel วิธีสร้างเอาต์พุตซอฟต์แวร์ขั้นกลางหรือขั้นสุดท้ายจากชุดไฟล์ต้นฉบับหรือการอ้างอิงอื่นๆ 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
:
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
:
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
ในที่นี้ แอตทริบิวต์ deps
จะอ้างอิงเอาต์พุตของกฎ greeter_activity
ที่คุณเพิ่มลงในไฟล์ BUILD
ด้านบน ซึ่งหมายความว่าเมื่อ Bazel สร้างเอาต์พุตของกฎนี้ 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
จัดเก็บไฟล์ต้นฉบับระดับกลางที่สร้างขึ้นโดยกฎ Bazelbazel-out
จัดเก็บเอาต์พุตบิลด์ประเภทอื่นๆ
Bazel จะจัดเก็บไฟล์ Android .apk
ที่สร้างขึ้นโดยใช้กฎ android_binary
ในไดเรกทอรี bazel-bin/src/main
โดยชื่อไดเรกทอรีย่อย src/main
จะ
ได้มาจากชื่อของแพ็กเกจ Bazel
ที่พรอมต์คำสั่ง ให้แสดงเนื้อหาของไดเรกทอรีนี้และค้นหาไฟล์ app.apk
ระบบปฏิบัติการ | คำสั่ง |
---|---|
Linux, macOS | ls bazel-bin/src/main |
Windows (Command Prompt) | 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
จากนั้นค้นหาและเปิด "Bazel Tutorial App" โดยทำดังนี้
รูปที่ 2 แอปบทแนะนำ Bazel
ยินดีด้วย คุณเพิ่งติดตั้งแอป Android ที่สร้างด้วย Bazel เป็นครั้งแรก
โปรดทราบว่าคำสั่งย่อย mobile-install
ยังรองรับแฟล็ก
--incremental
ซึ่งใช้เพื่อ
ติดตั้งใช้งานเฉพาะส่วนของแอปที่มีการเปลี่ยนแปลงตั้งแต่การติดตั้งใช้งานครั้งล่าสุดได้ด้วย
นอกจากนี้ยังรองรับแฟล็ก --start_app
เพื่อเริ่มแอปทันทีเมื่อ
ติดตั้ง
อ่านเพิ่มเติม
ดูรายละเอียดเพิ่มเติมได้ที่หน้าต่อไปนี้
- ปัญหาที่ยังไม่ได้รับการแก้ไขใน GitHub
- ข้อมูลเพิ่มเติมเกี่ยวกับ mobile-install
- ผสานรวมการขึ้นต่อกันภายนอก เช่น AppCompat, Guava และ JUnit จากที่เก็บ Maven โดยใช้ rules_jvm_external
- เรียกใช้การทดสอบ Robolectric ด้วยการผสานรวม robolectric-bazel
- การทดสอบแอปด้วยการทดสอบเครื่องมือ Android
- การผสานรวมโค้ด C และ C++ เข้ากับแอป Android ด้วย NDK
- ดูโปรเจ็กต์ตัวอย่าง Bazel เพิ่มเติมของ
ขอให้สนุกกับการสร้าง