หมายเหตุ: การใช้ Bazel สร้างแอป Android มีข้อจำกัดที่ทราบ ไปที่รายการด่วนของทีม Android ของ GitHub เพื่อดูรายการปัญหาที่ทราบ แม้ว่าทีม Bazel และผู้ร่วมให้ข้อมูลซอฟต์แวร์โอเพนซอร์ส (OSS) จะทำงานอย่างแข็งขันเพื่อแก้ไขปัญหาที่ทราบอยู่แล้ว แต่ผู้ใช้ควรทราบว่า Android Studio ไม่ได้ให้การสนับสนุนโปรเจ็กต์ Bazel อย่างเป็นทางการ
บทแนะนำนี้ครอบคลุมวิธีสร้างแอป Android ง่ายๆ โดยใช้ Bazel
Bazel สนับสนุนการสร้างแอป Android โดยใช้ กฎของ Android
บทแนะนำนี้มีไว้สำหรับผู้ใช้ Windows, macOS และ Linux และไม่ได้ ต้องมีประสบการณ์ในการพัฒนาแอป Bazel หรือ Android คุณไม่จำเป็นต้อง เขียนโค้ด Android อะไรก็ได้ในบทแนะนำนี้
สิ่งที่คุณจะได้เรียนรู้
ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีต่อไปนี้
- ตั้งค่าสภาพแวดล้อมโดยการติดตั้ง Bazel และ Android Studio และ กำลังดาวน์โหลดโปรเจ็กต์ตัวอย่าง
- ตั้งค่าพื้นที่ทำงาน Bazel ที่มีซอร์สโค้ด
สำหรับแอปและไฟล์
WORKSPACE
ที่ระบุระดับบนสุดของ Google Workspace ได้อย่างคุ้มค่าที่สุด - อัปเดตไฟล์
WORKSPACE
ให้มีการอ้างอิงไปยัง ทรัพยากร Dependency ภายนอก เช่น Android SDK - สร้างไฟล์
BUILD
- สร้างแอปด้วย Bazel
- ติดตั้งใช้งานและเรียกใช้แอปบนโปรแกรมจำลองของ Android หรืออุปกรณ์จริง
ก่อนเริ่มต้น
ติดตั้ง 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
ตั้งค่าพื้นที่ทำงาน
workspace คือไดเรกทอรีที่มีองค์ประกอบ
ไฟล์ต้นฉบับสำหรับโครงการซอฟต์แวร์อย่างน้อย 1 โครงการ และมีไฟล์ WORKSPACE
ไว้ที่
ถึงราก
ไฟล์ WORKSPACE
อาจว่างเปล่าหรือมีการอ้างอิงไปยังภายนอก
ทรัพยากร Dependency ที่จำเป็นต่อการสร้างโปรเจ็กต์
ก่อนอื่นให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์ WORKSPACE
ที่ว่างเปล่า
ระบบปฏิบัติการ | คำสั่ง |
---|---|
Linux, macOS | touch WORKSPACE |
Windows (พร้อมท์คำสั่ง) | type nul > WORKSPACE |
Windows (PowerShell) | New-Item WORKSPACE -ItemType file |
บาเซล
ตอนนี้คุณจะตรวจสอบได้ว่า 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 SDK ในเส้นทางที่ ANDROID_HOME
อ้างอิง
ตัวแปรสภาพแวดล้อมโดยอัตโนมัติ ระบบจะตรวจหาระดับ API สูงสุดและ
เครื่องมือบิลด์รุ่นล่าสุดที่ติดตั้งในตำแหน่งนั้น
คุณตั้งค่าตัวแปร ANDROID_HOME
เป็นตําแหน่งของ Android SDK ได้ ค้นหา
เส้นทางไปยัง SDK ที่ติดตั้งโดยใช้ SDK ของ 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" |
คำสั่งด้านบนจะตั้งค่าตัวแปรเฉพาะสำหรับเซสชัน Shell ปัจจุบันเท่านั้น เพื่อให้ ถาวร เรียกใช้คำสั่งต่อไปนี้
ระบบปฏิบัติการ | คำสั่ง |
---|---|
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 อย่างชัดแจ้งได้อีกด้วย
ระดับ 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 NDK มีการอนุมานในลักษณะเดียวกันกับ android_sdk_repository
จากตัวแปรสภาพแวดล้อม 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 ทั้งหมด ทรัพยากร Dependency เหล่านี้
ไฟล์ต้นฉบับ (Java, C++) ในพื้นที่ทำงานของคุณหรือเอาต์พุตอื่นๆ ของบิลด์ BUILD
ไฟล์
เขียนในภาษาชื่อสตาร์ลาร์ก
ไฟล์ BUILD
เป็นส่วนหนึ่งของแนวคิดใน Bazel ซึ่งเรียกกันว่าลำดับชั้นของแพ็กเกจ
ลำดับชั้นของแพ็กเกจเป็นโครงสร้างเชิงตรรกะที่ซ้อนทับไดเรกทอรี
ในพื้นที่ทำงาน แพ็กเกจแต่ละรายการ
ไดเรกทอรี (และไดเรกทอรีย่อย) ที่มีชุดไฟล์ต้นฉบับที่เกี่ยวข้องกัน
และไฟล์ BUILD
แพ็กเกจนี้ยังรวมถึงไดเรกทอรีย่อยอีกด้วย ยกเว้น
รายการที่มีไฟล์ BUILD
ของตนเอง ชื่อแพ็กเกจคือเส้นทางไปยัง
BUILD
ไฟล์ที่เกี่ยวข้องกับ WORKSPACE
โปรดทราบว่าโครงสร้างลำดับชั้นของแพ็กเกจ 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
:
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 สร้าง
ของกฎนี้ ระบบจะตรวจสอบก่อนว่าเอาต์พุตของ
สร้างกฎไลบรารี 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 (พร้อมท์คำสั่ง) | dir bazel-bin\src\main |
Windows (PowerShell) | ls bazel-bin\src\main |
เรียกใช้แอป
ตอนนี้คุณสามารถทำให้แอปใช้งานได้ในอุปกรณ์ Android ที่เชื่อมต่อหรือโปรแกรมจำลองจาก
บรรทัดคำสั่งโดยใช้คำสั่ง bazel
mobile-install
คำสั่งนี้ใช้
Android Debug Bridge (adb
) เพื่อสื่อสารกับอุปกรณ์ คุณต้องตั้งค่า
อุปกรณ์ให้ใช้ adb
โดยทำตามวิธีการในการแก้ไขข้อบกพร่องของ Android
บริดจ์ก่อนการติดตั้งใช้งาน คุณ
คุณยังสามารถเลือกติดตั้งแอป
ในโปรแกรมจำลองของ Android ที่รวมอยู่ใน Android
Studio โปรดตรวจสอบว่าโปรแกรมจำลองทำงานอยู่ก่อนที่จะเรียกใช้คำสั่งด้านล่าง
ป้อนข้อมูลต่อไปนี้
bazel mobile-install //src/main:app
จากนั้นให้ค้นหาและเปิด "แอปบทแนะนำ Bazel"
รูปที่ 2 แอปบทแนะนำ Bazel
ยินดีด้วย คุณเพิ่งติดตั้งแอป Android ที่สร้าง Bazel แอปแรกของคุณ
โปรดทราบว่าคำสั่งย่อย mobile-install
ยังรองรับการเรียก
--incremental
Flag ที่สามารถใช้เพื่อ
ติดตั้งใช้งานเฉพาะส่วนของแอปที่มีการเปลี่ยนแปลงตั้งแต่การทำให้ใช้งานได้ครั้งล่าสุด
และยังรองรับ Flag --start_app
เพื่อเริ่มแอปทันทีด้วย
ติดตั้งได้เลย
อ่านเพิ่มเติม
ดูรายละเอียดเพิ่มเติมได้ที่หน้าเหล่านี้
- ปัญหาที่ยังไม่ได้รับการแก้ไขใน GitHub
- ข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งบนอุปกรณ์เคลื่อนที่
- ผสานรวมทรัพยากร Dependency ภายนอก เช่น AppCompat, Guava และ JUnit จาก Maven ที่เก็บที่ใช้ rules_jvm_external
- ทำการทดสอบ Robolectric ด้วย robolectric-bazel การผสานรวม
- การทดสอบแอปด้วยการทดสอบการใช้เครื่องมือสำหรับ Android
- การผสานรวมโค้ด C และ C++ ในแอป Android ด้วย NDK
- ดูโครงการตัวอย่างอื่นๆ ของ Bazel:
ขอให้สนุกกับการสร้าง