Memasang berkas .aab di ponsel/emulator Android

 

Sejak tahun lalu, Google meluncurkan format anyar untuk berkas instalasi Android: Android app bundle. Format baru ini diklaim lebih baik dibandingkan format sebelumnya, apk.

Salah satu keunggulan yang ditawarkan format aab adalah dalam hal besar berkas yang akan diunduh pengguna yang diklaim menjadi lebih kecil. Dengan demikian, berkas yang diunduh benar-benar sesuai dengan kondisi ponsel pengguna. Untuk keterangan lebih lanjut mengenai format aab, silakan baca ulasannya di sini.

Masalahnya adalah, kadang-kadang kita sebagai pengembang masih membutuhkan berkas apk versi rilis untuk dicoba manual di ponsel testing (atau ponsel sendiri karena tida ada ponsel lain yang bisa digunakan untuk testing~). Kan tidak elok ketika sudah capek-capek buat aplikasi Android, dan ketika pada versi debug dipastikan tidak ada kutu, eh pas dirilis di playstore ternyata ada error yang sangat fatal (true story).

Untuk itu tidak ada salahnya untuk mengetes berkas aab sebelum diunggah ke playstore (apalagi bagi kami yang tidak membikin sistem tes otomatis hehe). Tapi bagaimana caranya? Tentu saja selalu ada jalan.

Untuk membongkar berkas aab sehingga bisa dipasang di ponsel, kita membutuhkan alat bernama bundletool. Sependek pengetahuan saya, aplikasi kecil ini tidak sepaket dengan Android SDK, sehingga perlu diunduh manual. Karena itu silakan unduh berkasnya, dan simpan di tempat yang bisa dijangkau sama terminal/konsol favorit anda.

Misalnya kita simpan di ~/bin/bundletool. Untuk membongkar aab menjadi berkas yang bisa diinstal, jalankan perintah berikut (pastikan anda berada di direktori app.aab berada):

“`java -jar ~/bin/bundletool build-apks –bundle=app.aab –output=app.apks“`

Dari perintah di atas, dapat dilihat bahwa keluarannya bukan berkas .apk, namun .apks. Karena itu, berkas ini masih belum bisa dipasang di ponsel melalui adb shell pm install. Untuk memasang berkas .apks tersebut, gunakan lagi bundletool:

“`java -jar ~/bin/bundletool install-apks –apks=app.apks“`

Berhasil? Harusnya tidak, ya. Sesuai slogannya, berkas aab akan disesuaikan dengan ponsel pengguna ketika aplikasi tersebut dipasang. Karena itu, mari kita ulangi langkahnya dari awal.

Misalkan anda sudah membuat berkas .aab yang sudah ditandatangani (alias .aab yang siap diunggah ke playstore). Berkas tersebut ditandatangani oleh berkas android.jks dengan password dan alias yang sudah anda siapkan. Untuk membuat berkas .apks, gunakan perintah berikut:

“`java -jar ~/bin/bundletool build-apks –bundle=app.aab –output=app.apks –ks=~/path/keystore/anda/android.jks –ks-pass=pass:passWordNyaApa –ks-key-alias=iniAliasnyaApa –key-pass=pass:passwordAliasnyaAPA –connected-device –adb=”$(which adb)”“`

Di perintah di atas, selain memasukkan keterangan keystore beserta alias dan passwordnya, saya juga menambahkan opsi –connected-device –adb=”$(which adb). Opsi ini bertujuan membuat berkas .apks yang disesuaikan dengan perangkat yang terkoneksi dengan adb. Pastikan yang terkoneksi cuma satu device ya. Entah itu emulator saja atau ponsel saja. Jika perintah tersebut dijalankan, nanti ada pesan warning seperti berikut:

“`WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.protobuf.UnsafeUtil (file:/home/namauser/bin/bundletool) to field java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of com.google.protobuf.UnsafeUtil
WARNING: Use –illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release“`

Meski ada warning, selama tidak ada error, harusnya berkas app.apks berhasil dibuat. Silakan cek di direktori tempat berkas app.aab berada. Jika ada, mari kita pasang berkas itu ke perangkat yang terhubung dengan komputer:

“`java -jar ~/bin/bundletool install-apks –apks=app.apks –adb=”$(which adb)”“`

Seperti biasa, nanti ada pesan warning:

“`WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.protobuf.UnsafeUtil (file:/home/namauser/bin/bundletool) to field java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of com.google.protobuf.UnsafeUtil WARNING: Use –illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release The APKs have been extracted in the directory: /var/folders/xf/d16xyl5945g6d0f9_yj0w3fw0000gn/T/temp18074911140929199415“`

Khusus untuk ponsel Xiaomi, biasanya ketika pertama kali kita pasang aplikasi via adb atau bundletool, ada pop up yang minta persetujuan pengguna untuk memasang aplikasi. Jika pengguna tidak mengizinkan, nanti ada error seperti ini:

“`12:22:48 E/SplitApkInstaller: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.nama.aplikasi.kamu signatures do not match the previously installed version; ignoring!
[BT:0.8.0] Error: Installation of the app failed.
com.android.tools.build.bundletool.model.exceptions.InstallationException: Installation of the app failed.
at com.android.tools.build.bundletool.model.exceptions.InstallationException$Builder.build(InstallationException.java:47)
at com.android.tools.build.bundletool.model.exceptions.InstallationException$Builder.build(InstallationException.java:41)
at com.android.tools.build.bundletool.device.DdmlibDevice.installApks(DdmlibDevice.java:122)
at com.android.tools.build.bundletool.device.ApksInstaller.installOnDevice(ApksInstaller.java:94)
at com.android.tools.build.bundletool.device.ApksInstaller.installApks(ApksInstaller.java:82)
at com.android.tools.build.bundletool.device.ApksInstaller.installApks(ApksInstaller.java:44)
at com.android.tools.build.bundletool.commands.InstallApksCommand.lambda$execute$3(InstallApksCommand.java:166)
at com.android.tools.build.bundletool.io.TempFiles.lambda$withTempDirectory$0(TempFiles.java:68)
at com.android.tools.build.bundletool.io.TempFiles.withTempDirectoryReturning(TempFiles.java:52)
at com.android.tools.build.bundletool.io.TempFiles.withTempDirectory(TempFiles.java:71)
at com.android.tools.build.bundletool.commands.InstallApksCommand.execute(InstallApksCommand.java:144)
at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:88)
at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:46)
Caused by: com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package id.infokes.app signatures do not match the previously installed version; ignoring!
at com.android.ddmlib.SplitApkInstaller.install(SplitApkInstaller.java:91)
at com.android.ddmlib.Device.installPackages(Device.java:928)
at com.android.tools.build.bundletool.device.DdmlibDevice.installApks(DdmlibDevice.java:106)
… 10 more“`

Jika anda menemukan error macam itu, silakan izinkan dahulu agar bundletool bisa memasang aplikasinya. Kalau sudah diizinkan, silakan ulangi langkah terakhir.

Demikian. Selamat mencoba. Tabik.

1 Thought.

  1. Pingback: Ketika sebuah proyek opensource ditinggalkan pemiliknya – Cacatan Kecil

Ada komentar?

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: