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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หมายเหตุ: การใช้ 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 จะเก็บไฟล์ต้นฉบับตัวกลางซึ่งสร้างขึ้นโดย กฎ 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 บริดจ์ก่อนการติดตั้งใช้งาน คุณ คุณยังสามารถเลือกติดตั้งแอป ในโปรแกรมจำลองของ Android ที่รวมอยู่ใน Android Studio โปรดตรวจสอบว่าโปรแกรมจำลองทำงานอยู่ก่อนที่จะเรียกใช้คำสั่งด้านล่าง

ป้อนข้อมูลต่อไปนี้

bazel mobile-install //src/main:app

จากนั้นให้ค้นหาและเปิด "แอปบทแนะนำ Bazel"

แอปบทแนะนำ Bazel

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

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

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

และยังรองรับ Flag --start_app เพื่อเริ่มแอปทันทีด้วย ติดตั้งได้เลย

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

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

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