Tutorial Bazel: Mem-build Aplikasi Android

Laporkan masalah Lihat sumber Per Malam · 7,2 · 7,1 · 7,0 · 6,5 · 6,4 Catatan: Ada batasan umum pada penggunaan Bazel untuk membangun aplikasi Android. Kunjungi hotlist tim-Android GitHub untuk melihat daftar masalah umum. Meskipun tim Bazel dan kontributor Open Source Software (OSS) bekerja secara aktif untuk mengatasi masalah umum, pengguna harus mengetahui bahwa Android Studio tidak mendukung project Bazel secara resmi.

Tutorial ini membahas cara membuat aplikasi Android sederhana menggunakan Bazel.

Bazel mendukung pembuatan aplikasi Android menggunakan Aturan Android.

Tutorial ini ditujukan untuk pengguna Windows, macOS, dan Linux serta tidak memerlukan pengalaman dengan pengembangan aplikasi Android atau Bazel. Anda tidak perlu menulis kode Android dalam tutorial ini.

Yang akan Anda pelajari

Dalam tutorial ini, Anda akan mempelajari cara:

  • Menyiapkan lingkungan Anda dengan menginstal Bazel dan Android Studio, serta mendownload contoh project.
  • Siapkan ruang kerja Bazel yang berisi kode sumber untuk aplikasi dan file WORKSPACE yang mengidentifikasi tingkat atas Workspace.
  • Perbarui file WORKSPACE agar berisi referensi ke yang diperlukan dependensi eksternal, seperti Android SDK.
  • Buat file BUILD.
  • Bangun aplikasi dengan Bazel.
  • Men-deploy dan menjalankan aplikasi di emulator Android atau perangkat fisik.

Sebelum memulai

Instal Bazel

Sebelum memulai tutorial, instal software berikut:

  • Bazel. Untuk menginstal, ikuti petunjuk penginstalan.
  • Android Studio. Untuk menginstal, ikuti langkah-langkah untuk mendownload Android Studio. Jalankan wizard penyiapan untuk mendownload SDK dan mengonfigurasi lingkungan Anda.
  • (Opsional) Git. Gunakan git untuk mendownload project aplikasi Android.

Mendapatkan contoh project

Untuk project contoh, gunakan project aplikasi Android dasar di Repositori contoh Bazel.

Aplikasi ini memiliki satu tombol yang mencetak ucapan saat diklik:

Sambutan tombol

Gambar 1. Sambutan tombol aplikasi Android.

Clone repositori dengan git (atau download file ZIP secara langsung):

git clone https://github.com/bazelbuild/examples

Project contoh untuk tutorial ini ada dalam examples/android/tutorial. Sebagai sisa tutorial, Anda akan mengeksekusi perintah dalam direktori ini.

Meninjau file sumber

Lihat file sumber untuk aplikasi.

.
├── 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

File dan direktori utama adalah:

Nama Lokasi
File manifes Android src/main/AndroidManifest.xml dan src/main/java/com/example/bazel/AndroidManifest.xml
File sumber Android src/main/java/com/example/bazel/MainActivity.java dan Greeter.java
Direktori file resource src/main/java/com/example/bazel/res/

Membangun dengan Bazel

Menyiapkan ruang kerja

Ruang kerja adalah direktori yang berisi untuk satu atau beberapa project software, dan memiliki file WORKSPACE di di {i>root<i}.

File WORKSPACE mungkin kosong atau berisi referensi ke file eksternal dependensi yang diperlukan untuk membangun project Anda.

Pertama, jalankan perintah berikut untuk membuat file WORKSPACE kosong:

OS Perintah
Linux, macOS touch WORKSPACE
Windows (Command Prompt) type nul > WORKSPACE
Windows (PowerShell) New-Item WORKSPACE -ItemType file

Bazel Lari

Sekarang Anda dapat memeriksa apakah Bazel berjalan dengan benar menggunakan perintah:

bazel info workspace

Jika Bazel mencetak jalur direktori saat ini, Anda siap! Jika File WORKSPACE tidak ada, Anda mungkin melihat pesan error seperti:

ERROR: The 'info' command is only supported from within a workspace.

Mengintegrasikan dengan Android SDK

Bazel perlu menjalankan Android SDK alat build untuk membangun aplikasi. Ini berarti Anda perlu menambahkan beberapa informasi ke WORKSPACE sehingga Bazel tahu di mana menemukannya.

Tambahkan baris berikut ke file WORKSPACE Anda:

android_sdk_repository(name = "androidsdk")

Tindakan ini akan menggunakan Android SDK di jalur yang dirujuk oleh ANDROID_HOME variabel lingkungan, dan otomatis mendeteksi API level tertinggi dan versi terbaru yang diinstal di lokasi tersebut.

Anda dapat menetapkan variabel ANDROID_HOME ke lokasi Android SDK. Find (Menemukan) jalur ke SDK yang diinstal menggunakan SDK Android Studio Pengelola. Dengan asumsi bahwa SDK diinstal ke lokasi default, Anda dapat menggunakan untuk menetapkan variabel ANDROID_HOME:

OS Perintah
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"

Perintah di atas menetapkan variabel hanya untuk sesi shell saat ini. Untuk membuat secara permanen, jalankan perintah berikut:

OS Perintah
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)

Anda juga bisa secara eksplisit menentukan jalur absolut Android SDK, level API, dan versi alat build yang akan digunakan dengan menyertakan path, Atribut api_level, dan build_tools_version. Jika api_level dan build_tools_version tidak ditentukan, aturan android_sdk_repository akan menggunakan versi terbaru masing-masing yang tersedia di SDK. Anda dapat menentukan kombinasi atribut ini, selama atribut tersebut ada di SDK, untuk contoh:

android_sdk_repository(
    name = "androidsdk",
    path = "/path/to/Android/sdk",
    api_level = 25,
    build_tools_version = "30.0.3"
)

Di Windows, perhatikan bahwa atribut path harus menggunakan jalur gaya campuran, yang adalah, jalur Windows dengan garis miring ke depan:

android_sdk_repository(
    name = "androidsdk",
    path = "c:/path/to/Android/sdk",
)

Opsional: Jika ingin mengompilasi kode native ke aplikasi Android, Anda Anda juga perlu mengunduh paket Android NDK dan beri tahu Bazel tempat menemukannya dengan menambahkan baris berikut ke file WORKSPACE Anda:

android_ndk_repository(name = "androidndk")

Serupa dengan android_sdk_repository, jalur ke Android NDK disimpulkan dari variabel lingkungan ANDROID_NDK_HOME secara default. Jalur ini juga bisa ditentukan secara eksplisit dengan atribut path di android_ndk_repository.

Untuk informasi selengkapnya, baca Menggunakan Android Native Development Kit dengan Bazel.

api_level adalah versi Android API yang digunakan SDK dan NDK target - misalnya, 23 untuk Android 6.0 dan 25 untuk Android 7.1. Jika tidak disetel secara eksplisit, api_level ditetapkan secara default ke level API tertinggi yang tersedia untuk android_sdk_repository dan android_ndk_repository.

Anda tidak perlu menyetel API level ke nilai yang sama untuk SDK dan NDK. Halaman ini berisi peta dari rilis Android ke API level yang didukung NDK.

Membuat file BUILD

File BUILD menjelaskan hubungan di antara serangkaian output build, seperti kompilasi resource Android dari aapt atau dari javac, dan dependensinya. Ketergantungan ini mungkin (Java, C++) di ruang kerja Anda atau output build lainnya. BUILD file ditulis dalam bahasa yang disebut Starlark.

File BUILD adalah bagian dari konsep di Bazel yang dikenal sebagai hierarki paket. Hierarki paket adalah struktur logis yang menempatkan direktori di ruang kerja Anda. Setiap paket adalah direktori (dan subdirektorinya) yang berisi kumpulan file sumber terkait dan file BUILD. Paket ini juga menyertakan subdirektori apa pun, kecuali yang berisi file BUILD-nya sendiri. package name adalah jalur ke File BUILD relatif terhadap WORKSPACE.

Perhatikan, hierarki paket Bazel secara konseptual berbeda dari paket Java hierarki paket direktori Aplikasi Android tempat file BUILD berada terletak, meskipun direktori mungkin diatur secara identik.

Untuk aplikasi Android sederhana dalam tutorial ini, file sumber di src/main/ terdiri dari satu paket Bazel. Proyek yang lebih kompleks mungkin memiliki banyak paket.

Menambahkan aturan android_library

File BUILD berisi beberapa jenis deklarasi yang berbeda untuk Bazel. Tujuan jenis data yang paling penting adalah aturan build, yang memberi tahu Bazel cara membangun {i>output<i} perangkat lunak menengah atau akhir dari satu set sumber file atau dependensi lainnya. Bazel menyediakan dua aturan build, android_library dan android_binary, yang dapat Anda gunakan untuk membuat aplikasi Android.

Untuk tutorial ini, pertama-tama Anda akan menggunakan Aturan android_library untuk memberi tahu Bazel agar membuat library Android modul dari kode sumber aplikasi dan file resource. Anda kemudian akan menggunakan Aturan android_binary untuk memberi tahu Bazel cara membuat paket aplikasi Android.

Buat file BUILD baru di direktori src/main/java/com/example/bazel, dan mendeklarasikan target android_library baru:

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/**"]),
)

Aturan build android_library berisi kumpulan atribut yang menentukan informasi yang dibutuhkan Bazel untuk membangun modul {i>library<i} dari file sumber. Perhatikan juga bahwa nama aturannya adalah greeter_activity. Anda akan mereferensikan menggunakan nama ini sebagai dependensi dalam aturan android_binary.

Menambahkan aturan android_binary

Aturan android_binary dibuat paket aplikasi Android (file .apk) untuk aplikasi Anda.

Buat file BUILD baru di direktori src/main/, dan mendeklarasikan target android_binary baru:

src/main/BUILD:

android_binary(
    name = "app",
    manifest = "AndroidManifest.xml",
    deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)

Di sini, atribut deps mereferensikan output aturan greeter_activity yang Anda tambahkan ke file BUILD di atas. Ini berarti bahwa ketika Bazel membuat {i>output<i} dari aturan ini akan memeriksa terlebih dahulu untuk melihat apakah {i>output<i} dari Aturan library greeter_activity telah dibuat dan terbaru. Jika tidak, Bazel membangunnya dan kemudian menggunakan {i>output<i} tersebut untuk membangun file paket aplikasi.

Sekarang, simpan dan tutup {i>file<i}.

Membangun aplikasi

Coba buat aplikasi Jalankan perintah berikut untuk membuat Target android_binary:

bazel build //src/main:app

Subperintah build menginstruksikan Bazel untuk membangun target yang mengikutinya. Target ditetapkan sebagai nama aturan build di dalam file BUILD, beserta jalur paket yang terkait dengan ruang kerja Anda saat ini. Untuk contoh ini, targetnya adalah app dan jalur paketnya adalah //src/main/.

Perhatikan bahwa terkadang Anda dapat menghilangkan jalur paket atau nama target, bergantung pada direktori kerja Anda saat ini pada baris perintah dan nama target. Untuk mengetahui detail selengkapnya tentang label dan jalur target, lihat Label.

Bazel akan mulai membangun aplikasi contoh. Selama proses build, output-nya akan tampak seperti berikut ini:

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

Menemukan output build

Bazel menempatkan output operasi build perantara dan akhir dalam satu set direktori {i>output<i} per pengguna dan per ruang kerja. Direktori ini di-symlink dari lokasi berikut di tingkat teratas direktori proyek, di mana WORKSPACE adalah:

  • bazel-bin menyimpan file biner yang dapat dieksekusi dan output build lainnya yang dapat dijalankan
  • bazel-genfiles menyimpan file sumber perantara yang dihasilkan oleh Aturan bazel
  • bazel-out menyimpan jenis output build lainnya

Bazel menyimpan file .apk Android yang dihasilkan menggunakan aturan android_binary di direktori bazel-bin/src/main, dengan nama subdirektori src/main berasal dari nama paket Bazel.

Di command prompt, tampilkan isi direktori ini dan temukan app.apk file:

OS Perintah
Linux, macOS ls bazel-bin/src/main
Windows (Command Prompt) dir bazel-bin\src\main
Windows (PowerShell) ls bazel-bin\src\main

Menjalankan aplikasi

Kini Anda dapat men-deploy aplikasi ke perangkat Android atau emulator yang terhubung dari command line menggunakan perintah bazel mobile-install. Perintah ini menggunakan Android Debug Bridge (adb) untuk berkomunikasi dengan perangkat. Anda harus menyiapkan perangkat Anda untuk menggunakan adb dengan mengikuti petunjuk di Android Debug Hubungkan sebelum deployment. Anda juga dapat memilih untuk menginstal aplikasi pada emulator Android yang disertakan dalam Android di Studio. Pastikan emulator berjalan sebelum menjalankan perintah di bawah.

Masukkan:

bazel mobile-install //src/main:app

Selanjutnya, cari dan luncurkan "Aplikasi Tutorial Bazel":

Aplikasi tutorial Bazel

Gambar 2. Aplikasi tutorial Bazel.

Selamat! Anda baru saja menginstal aplikasi Android pertama yang dibuat oleh Bazel.

Perhatikan bahwa subperintah mobile-install juga mendukung Flag --incremental yang dapat digunakan untuk hanya deploy bagian aplikasi yang telah berubah sejak deployment terakhir.

Ini juga mendukung flag --start_app untuk memulai aplikasi langsung setelah menginstalnya.

Bacaan lebih lanjut

Untuk detail selengkapnya, lihat halaman ini:

Selamat membangun!