instal seluler bazel

Pengembangan iteratif yang cepat untuk Android

Halaman ini menjelaskan cara bazel mobile-install membuat pengembangan iteratif untuk Android jauh lebih cepat. Halaman ini menjelaskan manfaat pendekatan ini dibandingkan dengan kekurangan langkah-langkah build dan penginstalan terpisah.

Ringkasan

Untuk menginstal perubahan kecil pada aplikasi Android dengan sangat cepat, lakukan hal berikut:

  1. Temukan aturan android_binary aplikasi yang ingin Anda instal.
  2. Hubungkan perangkat Anda ke adb.
  3. Jalankan bazel mobile-install :your_target. Startup aplikasi akan sedikit lebih lambat dari biasanya.
  4. Edit kode atau resource Android.
  5. Jalankan bazel mobile-install :your_target.
  6. Nikmati penginstalan inkremental yang cepat dan minimal.

Beberapa opsi command line untuk Bazel yang mungkin berguna:

  • --adb memberi tahu Bazel biner adb mana yang akan digunakan
  • --adb_arg dapat digunakan untuk menambahkan argumen tambahan ke command line adb. Salah satu aplikasi yang berguna adalah memilih perangkat yang ingin Anda instal jika Anda memiliki beberapa perangkat yang terhubung ke workstation: bazel mobile-install :your_target -- --adb_arg=-s --adb_arg=<SERIAL>

Jika ragu, lihat contohnya, hubungi kami di Grup Google, atau ajukan masalah GitHub

Pengantar

Salah satu atribut terpenting dari toolchain developer adalah kecepatan: ada perbedaan besar antara mengubah kode dan melihatnya berjalan dalam satu detik dengan harus menunggu beberapa menit, terkadang berjam-jam, sebelum Anda mendapatkan masukan tentang apakah perubahan Anda melakukan apa yang Anda harapkan.

Sayangnya, toolchain Android tradisional untuk membuat .apk memerlukan banyak langkah monolitik dan berurutan, dan semuanya harus dilakukan untuk membuat aplikasi Android. Di Google, menunggu lima menit untuk membuat perubahan satu baris tidak jarang terjadi pada project yang lebih besar seperti Google Maps.

bazel mobile-install membuat pengembangan iteratif untuk Android jauh lebih cepat dengan menggunakan kombinasi pemangkasan perubahan, sharding pekerjaan, dan manipulasi cerdas internal Android, tanpa mengubah kode aplikasi Anda.

Masalah dengan penginstalan aplikasi tradisional

Membuat aplikasi Android memiliki beberapa masalah, termasuk:

  • Dexing. Secara default, alat Dexer (sebelumnya dx, sekarang d8 atau r8) dipanggil tepat satu kali dalam build dan tidak tahu cara menggunakan kembali pekerjaan dari build sebelumnya: alat ini melakukan dexing setiap metode lagi, meskipun hanya satu metode yang diubah.

  • Mengupload data ke perangkat. adb tidak menggunakan bandwidth penuh koneksi USB 2.0, dan aplikasi yang lebih besar dapat memerlukan banyak waktu untuk diupload. Seluruh aplikasi diupload, meskipun hanya bagian kecil yang diubah, misalnya, resource atau satu metode, sehingga hal ini dapat menjadi hambatan utama.

  • Kompilasi ke kode native. Android L memperkenalkan ART, runtime Android baru, yang mengompilasi aplikasi ahead-of-time, bukan mengompilasinya just-in-time seperti Dalvik. Hal ini membuat aplikasi jauh lebih cepat dengan biaya waktu penginstalan yang lebih lama. Hal ini merupakan kompromi yang baik bagi pengguna karena biasanya mereka menginstal aplikasi satu kali dan menggunakannya berkali-kali, tetapi menghasilkan pengembangan yang lebih lambat saat aplikasi diinstal berkali-kali dan setiap versi dijalankan paling banyak beberapa kali.

Pendekatan bazel mobile-install

bazel mobile-install membuat peningkatan berikut:

  • Desugaring dan dexing yang di-shard. Setelah membuat kode Java aplikasi, Bazel akan membagi file class menjadi bagian-bagian berukuran kira-kira sama dan memanggil d8 secara terpisah. d8 tidak dipanggil pada shard yang tidak berubah sejak build terakhir. Shard ini kemudian dikompilasi menjadi APK yang di-shard secara terpisah.

  • Transfer file inkremental. Resource Android, file .dex, dan library native dihapus dari .apk utama dan disimpan di bawah direktori mobile-install terpisah. Hal ini memungkinkan Anda mengupdate kode dan resource Android secara independen tanpa menginstal ulang seluruh aplikasi. Dengan demikian, transfer file memerlukan waktu lebih sedikit dan hanya file .dex yang telah diubah yang dikompilasi ulang di perangkat.

  • Penginstalan yang di-shard. Mobile-install menggunakan alat Android Studio's apkdeployer untuk menggabungkan APK yang di-shard di perangkat yang terhubung dan memberikan pengalaman yang kohesif.

Dexing yang Di-shard

Dexing yang di-shard cukup mudah: setelah file .jar dibuat, a alat membagi file tersebut menjadi file .jar terpisah dengan ukuran yang kira-kira sama, lalu memanggil d8 pada file yang diubah sejak build sebelumnya. Logika yang menentukan shard mana yang akan di-dex tidak khusus untuk Android: logika ini hanya menggunakan algoritma pemangkasan perubahan umum Bazel.

Versi pertama algoritma sharding hanya mengurutkan file .class menurut abjad, lalu membagi daftar menjadi bagian-bagian berukuran sama, tetapi hal ini terbukti tidak optimal: jika class ditambahkan atau dihapus (bahkan class bertingkat atau anonim), semua class setelahnya menurut abjad akan bergeser satu, sehingga shard tersebut akan di-dex lagi. Oleh karena itu, diputuskan untuk membagi paket Java, bukan class individual. Tentu saja, hal ini masih menghasilkan banyak shard yang di-dex jika paket baru ditambahkan atau dihapus, tetapi hal itu jauh lebih jarang terjadi daripada menambahkan atau menghapus satu class.

Jumlah shard dikontrol oleh konfigurasi command line, menggunakan flag --define=num_dex_shards=N. Dalam dunia yang ideal, Bazel akan otomatis menentukan jumlah shard yang terbaik, tetapi Bazel saat ini harus mengetahui kumpulan tindakan (misalnya, perintah yang akan dieksekusi selama build) sebelum mengeksekusi tindakan tersebut, sehingga Bazel tidak dapat menentukan jumlah shard yang optimal karena tidak mengetahui berapa banyak class Java yang akan ada di aplikasi pada akhirnya. Secara umum, semakin banyak shard, semakin cepat build dan penginstalan, tetapi startup aplikasi menjadi lebih lambat, karena dynamic linker harus melakukan lebih banyak pekerjaan. Titik optimal biasanya antara 10 dan 50 shard.

Deployment inkremental

Transfer dan penginstalan shard APK inkremental kini ditangani oleh utilitas apkdeployer yang dijelaskan dalam "Pendekatan mobile-install". Meskipun versi mobile-install (native) sebelumnya mengharuskan pelacakan manual penginstalan pertama kali dan menerapkan flag --incremental secara selektif pada penginstalan berikutnya, versi terbaru di rules_android telah sangat disederhanakan. Pemanggilan mobile-install yang sama dapat digunakan terlepas dari berapa kali aplikasi telah diinstal atau diinstal ulang.

Pada tingkat tinggi, alat apkdeployer adalah wrapper di sekitar berbagai sub-perintah adb. Logika titik entri utama dapat ditemukan di com.android.tools.deployer.Deployer class, dengan class utilitas lain yang ditempatkan di paket yang sama. Class Deployer menerima, antara lain, daftar jalur ke APK terpisah dan protobuf dengan informasi tentang penginstalan, serta memanfaatkan fitur deployment untuk Android App Bundle guna membuat sesi penginstalan dan men-deploy pemisahan aplikasi secara inkremental. Lihat class ApkPreInstaller dan ApkInstaller untuk mengetahui detail implementasi.

Hasil

Performa

Secara umum, bazel mobile-install menghasilkan percepatan 4x hingga 10x dalam membangun dan menginstal aplikasi besar setelah perubahan kecil.

Angka berikut dihitung untuk beberapa produk Google:

Hal ini tentu saja bergantung pada sifat perubahan: kompilasi ulang setelah mengubah library dasar memerlukan lebih banyak waktu.

Batasan

Trik yang dimainkan aplikasi stub tidak berfungsi dalam setiap kasus. Kasus berikut menunjukkan tempat aplikasi stub tidak berfungsi seperti yang diharapkan:

  • Mobile-install hanya didukung melalui aturan Starlark dari rules_android. Lihat "sejarah singkat mobile-install" untuk mengetahui detail selengkapnya.

  • Hanya perangkat yang menjalankan ART yang didukung. Mobile-install menggunakan fitur API dan runtime yang hanya ada di perangkat yang menjalankan ART, bukan Dalvik. Runtime Android yang lebih baru dari Android L (API 21+) harus kompatibel.

  • Bazel itu sendiri harus dijalankan dengan runtime Java alat dan versi bahasa 17 atau yang lebih tinggi.

  • Versi Bazel sebelum 8.4.0 harus menentukan beberapa flag tambahan untuk mobile-install. Lihat tutorial Android Bazel. Flag ini memberi tahu Bazel tempat aspek mobile-install Starlark berada dan aturan mana yang didukung.

Sejarah singkat mobile-install

Versi Bazel sebelumnya secara native menyertakan aturan build dan pengujian bawaan untuk bahasa dan ekosistem populer seperti C++, Java, dan Android. Oleh karena itu, aturan ini disebut aturan native. Bazel 8 (dirilis pada tahun 2024) menghapus dukungan untuk aturan ini karena banyak di antaranya telah dimigrasikan ke bahasa Starlark. Lihat "postingan blog Bazel 8.0 LTS" untuk mengetahui detail selengkapnya.

Aturan Android native lama juga mendukung versi native lama dari fungsi mobile-install. Hal ini sekarang disebut "mobile-install v1" atau "mobile-install native". Fungsi ini dihapus di Bazel 8, bersama dengan aturan Android bawaan.

Sekarang, semua fungsi mobile-install, serta semua aturan build dan pengujian Android, diimplementasikan di Starlark dan berada di repositori GitHub rules_android. Versi terbaru dikenal sebagai "mobile-install v3" atau "MIv3".

Catatan penamaan: Ada "mobile-install v2" yang hanya tersedia secara internal di Google pada satu waktu, tetapi tidak pernah dipublikasikan secara eksternal, dan hanya v3 terus digunakan untuk deployment rules_android internal Google dan OSS.