บทแนะนำ Bazel: สร้างแอป Android

หมายเหตุ: การใช้ Bazel เพื่อสร้างแอป Android มีข้อจำกัดที่ทราบ โปรดไปที่รายการปัญหาที่ทราบของทีม Android ใน Github เพื่อดูรายการปัญหาที่ทราบ แม้ว่าทีม Bazel และผู้มีส่วนร่วมในซอฟต์แวร์โอเพนซอร์ส (OSS) จะทำงานอย่างแข็งขันเพื่อแก้ไขปัญหาที่ทราบ แต่ผู้ใช้ควรทราบว่า Android Studio ไม่รองรับโปรเจ็กต์ Bazel อย่างเป็นทางการ

บทแนะนำนี้จะครอบคลุมวิธีสร้างแอป 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.5.1")

การดำเนินการนี้จะใช้ 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.2")

ดูข้อมูลเพิ่มเติมได้ที่ การใช้ 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:

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 จะวางเอาต์พุตของการดำเนินการสร้างทั้งระดับกลางและขั้นสุดท้ายไว้ในชุดไดเรกทอรีเอาต์พุตต่อผู้ใช้ต่อพื้นที่ทำงาน ไดเรกทอรีเหล่านี้จะมีการสร้างลิงก์สัญลักษณ์จากตำแหน่งต่อไปนี้ที่ระดับบนสุดของไดเรกทอรีโปรเจ็กต์ ซึ่งเป็นตำแหน่งที่ไฟล์ MODULE.bazel อยู่

  • bazel-bin จัดเก็บไฟล์ปฏิบัติการไบนารีและเอาต์พุตบิลด์ที่เรียกใช้ได้อื่นๆ
  • bazel-genfiles จัดเก็บไฟล์ต้นฉบับระดับกลางที่สร้างขึ้นโดยกฎ Bazel
  • bazel-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

จากนั้นค้นหาและเปิดใช้ "Bazel Tutorial App"

แอปบทแนะนำ Bazel

รูปที่ 2 แอปบทแนะนำ Bazel

ยินดีด้วย คุณเพิ่งติดตั้งแอป Android แอปแรกที่สร้างด้วย Bazel

โปรดทราบว่าคำสั่งย่อย mobile-install ยังรองรับแฟล็ก --incremental ที่ใช้เพื่อ ติดตั้งใช้งานเฉพาะส่วนของแอปที่มีการเปลี่ยนแปลงตั้งแต่การติดตั้งใช้งานครั้งล่าสุด

นอกจากนี้ยังรองรับแฟล็ก --start_app เพื่อเริ่มแอปทันทีที่ติดตั้ง

อ่านเพิ่มเติม

ดูรายละเอียดเพิ่มเติมได้ในหน้าต่อไปนี้

ขอให้สนุกกับการสร้าง