บทแนะนำนี้ครอบคลุมวิธีสร้างแอป Android ง่ายๆ โดยใช้ Bazel
Bazel รองรับการสร้างแอป Android โดยใช้กฎของ Android
บทแนะนำนี้มีไว้สำหรับผู้ใช้ Windows, macOS และ Linux และไม่จำเป็นต้องมีประสบการณ์ด้านการพัฒนาแอป Bazel หรือ Android คุณจึงไม่จำเป็นต้องเขียนโค้ด Android ในบทแนะนำนี้
สิ่งที่คุณจะได้เรียนรู้
ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีต่อไปนี้
- ตั้งค่าสภาพแวดล้อมโดยการติดตั้ง Bazel และ Android Studio แล้วดาวน์โหลดโปรเจ็กต์ตัวอย่าง
- ตั้งค่าพื้นที่ทำงาน Bazel ที่มีซอร์สโค้ดสำหรับแอปและไฟล์
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
ตั้งค่าพื้นที่ทำงาน
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_NDK_HOME
โดยค่าเริ่มต้น เช่นเดียวกับ android_sdk_repository
นอกจากนี้ยังระบุเส้นทางอย่างชัดแจ้งด้วยแอตทริบิวต์ path
ใน android_ndk_repository
ได้ด้วย
อ่านข้อมูลเพิ่มเติมได้ที่การใช้ชุดเครื่องมือพัฒนาแอปที่มาพร้อมเครื่อง Android กับ 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
รายการเขียนในภาษาชื่อ Starlark
ไฟล์ BUILD
เป็นส่วนหนึ่งของแนวคิดใน Bazel ซึ่งเรียกกันว่าลำดับชั้นของแพ็กเกจ
ลำดับชั้นแพ็กเกจเป็นโครงสร้างเชิงตรรกะที่ซ้อนทับโครงสร้างไดเรกทอรีในพื้นที่ทำงาน แพ็กเกจแต่ละรายการคือไดเรกทอรี (และไดเรกทอรีย่อย) ที่มีชุดไฟล์แหล่งที่มาที่เกี่ยวข้องและไฟล์ BUILD
แพ็กเกจยังรวมถึงไดเรกทอรีย่อยอื่นๆ ด้วย ยกเว้นรายการที่มีไฟล์ BUILD
ของตนเอง ชื่อแพ็กเกจคือเส้นทางไปยังไฟล์ BUILD
ที่สัมพันธ์กับ WORKSPACE
โปรดทราบว่าตามแนวคิดลำดับชั้นแพ็กเกจของ Bazel นั้นแตกต่างจากลำดับชั้นแพ็กเกจ Java ของไดเรกทอรีแอป Android ซึ่งมีตำแหน่งไฟล์ BUILD
แม้ว่าไดเรกทอรีอาจจัดระเบียบเหมือนกันก็ตาม
สำหรับแอป Android แบบง่ายในบทแนะนำนี้ ไฟล์ต้นฉบับใน src/main/
จะประกอบด้วยแพ็กเกจ Bazel 1 แพ็กเกจ โปรเจ็กต์ที่ซับซ้อนขึ้นอาจมีแพ็กเกจที่ฝังอยู่หลายรายการ
เพิ่มกฎ android_library
ไฟล์ BUILD
มีการประกาศหลายประเภทสำหรับ 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
คุณจะอ้างอิงกฎโดยใช้ชื่อนี้เป็นรายการที่อ้างอิงในกฎ 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
จะจัดเก็บไฟล์ต้นทางของตัวกลางที่กฎ Bazel สร้างขึ้นbazel-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 Debug Bridge ก่อนทำให้ใช้งานได้ คุณยังเลือกติดตั้งแอปในโปรแกรมจำลองของ Android ที่รวมอยู่ใน Android
Studio ได้ด้วย โปรดตรวจสอบว่าโปรแกรมจำลองทำงานอยู่ก่อนที่จะเรียกใช้คำสั่งด้านล่าง
ป้อนข้อมูลต่อไปนี้
bazel mobile-install //src/main:app
จากนั้นให้ค้นหาและเปิด "แอปบทแนะนำ Bazel"
รูปที่ 2 แอปบทแนะนำ Bazel
ยินดีด้วย คุณเพิ่งติดตั้งแอป Android ที่สร้าง Bazel แอปแรกของคุณ
โปรดทราบว่าคำสั่งย่อย mobile-install
ยังรองรับแฟล็ก --incremental
ที่สามารถใช้เพื่อติดตั้งใช้งานเฉพาะส่วนของแอปที่มีการเปลี่ยนแปลงนับตั้งแต่การทำให้ใช้งานได้ครั้งล่าสุด
และยังรองรับ Flag --start_app
เพื่อเริ่มแอปทันทีหลังจากติดตั้ง
อ่านเพิ่มเติม
ดูรายละเอียดเพิ่มเติมได้ที่หน้าเหล่านี้
- ปัญหาที่ยังไม่ได้รับการแก้ไขใน GitHub
- ข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งบนอุปกรณ์เคลื่อนที่
- ผสานรวมทรัพยากร Dependency ภายนอก เช่น AppCompat, Guava และ JUnit จากที่เก็บของ Maven โดยใช้ rules_jvm_external
- ทำการทดสอบ Robolectric ด้วยการผสานรวม robolectric-bazel
- การทดสอบแอปด้วยการทดสอบการใช้เครื่องมือสำหรับ Android
- การผสานรวมโค้ด C และ C++ ในแอป Android ด้วย NDK
- ดูโปรเจ็กต์ตัวอย่างอื่นๆ ของ Bazel
ขอให้สนุกกับการสร้าง