Membuat multi-APK untuk API level yang berbeda-beda

Jika Anda memublikasikan aplikasi ke Google Play, sebaiknya bangun dan upload Android App Bundle. Setelah Anda melakukannya, Google Play akan otomatis membuat dan menayangkan APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga pengguna hanya mendownload kode dan resource yang diperlukan untuk menjalankan aplikasi Anda. Memublikasikan multi-APK akan berguna jika Anda tidak memublikasikan aplikasi ke Google Play. Namun, Anda harus membuat, menandatangani, dan mengelola setiap APK sendiri.

Saat mengembangkan aplikasi Android untuk memanfaatkan multi-APK di Google Play, Anda harus menerapkan beberapa praktik baik dari awal, dan mencegah sakit kepala yang tidak perlu terjadi. lebih jauh ke dalam proses pengembangan. Pelajaran ini menunjukkan cara membuat multi-APK APK masing-masing mencakup rentang API level yang sedikit berbeda. Anda juga akan mendapatkan beberapa alat yang diperlukan agar pemeliharaan codebase multi-APK semudah mungkin.

Mengonfirmasi bahwa Anda memerlukan multi-APK

Saat mencoba membuat aplikasi yang berfungsi di beberapa generasi Android Anda ingin agar aplikasi memanfaatkan fitur baru di perangkat baru, tanpa mengorbankan kompatibilitas mundur. Di awal, mungkin tampak seolah-olah beberapa APK dukungan teknis adalah solusi terbaik, tetapi ini sering kali tidak sesuai harapan. Menggunakan APK Tunggal Bagian dari panduan developer multi-APK berisi beberapa informasi berguna tentang cara melakukannya dengan satu APK, termasuk penggunaan pustaka dukungan kami. Anda juga dapat mempelajari cara menulis kode yang hanya berjalan pada level API tertentu dalam satu APK, tanpa menggunakan teknik komputasi yang mahal seperti refleksi dari artikel ini.

Jika Anda dapat mengelolanya, membatasi aplikasi ke satu APK memiliki beberapa keunggulan, termasuk:

  • Publikasi dan pengujian lebih mudah
  • Hanya ada satu codebase yang harus dikelola
  • Aplikasi Anda dapat beradaptasi dengan perubahan konfigurasi perangkat
  • Pemulihan aplikasi berfungsi di seluruh perangkat
  • Anda tidak perlu mengkhawatirkan preferensi pasar, perilaku dari "upgrade" dari satu APK ke berikutnya, atau APK mana yang sesuai dengan kelas perangkat

Bagian selanjutnya dari pelajaran ini mengasumsikan bahwa Anda telah meneliti topik tersebut, mempelajari topik tersebut dengan cermat dan dalam resource yang ditautkan, dan menentukan bahwa multi-APK adalah jalur yang tepat untuk aplikasi.

Membuat diagram kebutuhan Anda

Mulailah dengan membuat diagram sederhana untuk menentukan dengan cepat berapa banyak APK yang Anda butuhkan, dan API apa rentang yang dicakup setiap APK. Untuk referensi praktis, halaman Versi Platform Situs Developer Android menyediakan data tentang jumlah relatif perangkat aktif yang menjalankan versi platform Android. Juga, meskipun awalnya terdengar mudah, melacak set mana level API yang akan ditargetkan oleh setiap APK menjadi agak cepat, terutama jika ada terjadi tumpang tindih (sering kali ada). Untungnya, mudah untuk membuat diagram persyaratan Anda dengan cepat, dengan mudah, dan memiliki referensi yang mudah untuk digunakan nanti.

Untuk membuat diagram multi-APK, mulailah dengan baris sel yang mewakili berbagai level API pada platform Android. Tampilkan sel tambahan di akhir untuk merepresentasikan masa depan untuk semua versi Android.

3 4 5 6 7 8 9 10 11 12 13 +

Sekarang warnai diagram sehingga setiap warna merepresentasikan APK. Berikut adalah satu contoh Anda dapat menerapkan setiap APK ke rentang level API tertentu.

3 4 5 6 7 8 9 10 11 12 13 +

Setelah membuat diagram ini, distribusikan ke tim Anda. Komunikasi tim pada proyek Anda menjadi lebih sederhana, karena daripada bertanya "Bagaimana APK untuk level API 3 hingga 6, Anda Android 1.x. Bagaimana statusnya?" Anda cukup ucapkan "Bagaimana APK Biru tersedia bersama?"

Memasukkan semua kode umum dan resource dalam project library

Baik Anda memodifikasi aplikasi Android yang ada atau memulai dari awal, ini adalah adalah hal pertama yang harus Anda lakukan pada codebase, dan sejauh ini yang paling penting. Semua yang masuk ke proyek perpustakaan hanya perlu diperbarui sekali (pikirkan string yang dilokalkan tema warna, bug yang diperbaiki dalam kode bersama), yang mempercepat waktu pengembangan dan mengurangi kemungkinan kesalahan yang dapat dengan mudah dihindari.

Catatan: Meskipun detail penerapan terkait cara membuat dan menyertakan proyek perpustakaan berada di luar cakupan pelajaran ini, Anda bisa mendapatkan dengan membaca Membuat Library Android.

Jika Anda mengonversi aplikasi yang sudah ada untuk menggunakan dukungan multi-APK, jelajahi codebase Anda untuk setiap file string, daftar nilai, dan tema yang dilokalkan warna, ikon menu, dan tata letak yang tidak akan berubah di APK, serta semuanya dalam proyek perpustakaan. Kode yang tidak akan banyak berubah seharusnya juga masuk ke proyek perpustakaan. Anda mungkin akan memperluasnya untuk menambahkan satu atau dua metode dari APK ke APK.

Di sisi lain, jika Anda membuat aplikasi dari awal, coba sebanyak mungkin untuk menulis kode dalam project library terlebih dahulu, lalu memindahkannya ke bawah saja ke APK individual jika diperlukan. Ini jauh lebih mudah untuk dikelola dalam jangka panjang dibandingkan menambahkannya, lalu yang lain, lalu lagi, kemudian berbulan-bulan kemudian mencoba mencari tahu apakah blob ini dapat dipindahkan ke atas ke bagian perpustakaan tanpa mengacaukan apa pun.

Membuat project APK baru

Harus ada project Android terpisah untuk setiap APK yang akan Anda rilis. Untuk kemudahan organisasi, tempatkan project library dan semua project APK terkait dalam folder induk yang sama. Ingat juga bahwa setiap APK harus memiliki nama paket yang sama, meskipun belum tentu perlu membagikan nama paket dengan perpustakaan. Jika Anda memiliki 3 APK dengan mengikuti skema yang dijelaskan sebelumnya, direktori {i> root <i}Anda mungkin terlihat seperti ini:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Setelah project dibuat, tambahkan project library sebagai referensi untuk setiap project APK. Jika memungkinkan, tentukan Aktivitas awal dalam project library, dan perluas Aktivitas tersebut dalam APK Anda proyek. Memiliki aktivitas awal yang ditentukan dalam project library memberi Anda kesempatan untuk melakukan inisialisasi aplikasi di satu tempat, sehingga setiap APK tidak perlu menerapkan kembali "universal" seperti menginisialisasi Analytics, menjalankan pemeriksaan pemberian lisensi, prosedur inisialisasi yang tidak banyak berubah dari APK ke APK.

Menyesuaikan manifes

Ketika pengguna mengunduh aplikasi yang menggunakan multi-APK melalui Google Play, APK yang akan digunakan dipilih dengan dua aturan sederhana:

  • Manifes harus menunjukkan bahwa APK tersebut memenuhi syarat
  • Dari APK yang memenuhi syarat, nomor versi tertinggi akan menang

Sebagai contoh, mari kita lihat beberapa APK yang dijelaskan sebelumnya, dan asumsikan bahwa kita belum menetapkan level API maksimum untuk setiap APK. Jika diambil satu per satu, rentang yang mungkin dari setiap APK akan akan terlihat seperti ini:

3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +

Karena APK dengan minSdkVersion yang lebih tinggi harus memiliki kode versi yang lebih tinggi, kita tahu bahwa dalam nilai versionCode, merah ≥ hijau ≥ biru. Oleh karena itu, kita dapat secara efektif menciutkan diagram agar terlihat seperti ini:

3 4 5 6 7 8 9 10 11 12 13 +

Sekarang, mari asumsikan bahwa APK Merah memiliki beberapa persyaratan yang tidak dimiliki oleh dua yang lain. Halaman Filter di Google Play dari panduan Developer Android memiliki daftar lengkap kemungkinan penyebabnya. Untuk demi contoh, anggaplah merah membutuhkan kamera depan. Faktanya, seluruh poin dari APK berwarna merah adalah menggabungkan kamera depan dengan fungsi baru yang bagus dan telah ditambahkan di API 12. Namun, ternyata, tidak semua perangkat API 11 MEMILIKI kamera depan. Tujuan horor!

Untungnya, jika pengguna menjelajahi Google Play dari salah satu perangkat tersebut, Google Play akan melihat melihat bahwa Red mencantumkan kamera depan sebagai persyaratan, dan diam-diam mengabaikannya, setelah dan menyimpulkan bahwa Red dan perangkat itu tidak cocok di dunia digital. Kemudian kita akan melihat bahwa Warna hijau tidak hanya kompatibel dengan versi baru perangkat dengan API 11 (karena tidak ada maxSdkVersion yang ditentukan), tetapi tidak peduli apakah ada kamera depan atau tidak! Aplikasi masih dapat didownload dari Google Play oleh pengguna, karena meskipun terjadi gangguan dengan kamera depan, masih ada APK yang mendukung level API tersebut.

Untuk menyimpan semua APK di "jalur" yang terpisah, penting untuk memiliki kode versi yang baik skema baru. Fitur yang direkomendasikan dapat ditemukan di area Kode Versi pada panduan developer kami. Karena contoh kumpulan APK hanya menangani salah satu dari 3 kemungkinan dimensi kustom, Anda cukup memisahkan setiap APK dengan 1000, menyetel beberapa digit pertama ke minSdkVersion untuk APK tertentu, lalu bertambah dari sana. Ini mungkin terlihat seperti:

Biru: 03001, 03002, 03003, 03004...
Hijau: 07001, 07002, 07003, 07004...
Merah:11001, 11002, 11003, 11004...

Dengan menyatukan semuanya, Manifes Android Anda mungkin akan terlihat seperti berikut:

Biru:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="03001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    ...

Hijau:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="07001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="7" />
    ...

Merah:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="11001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    ...

Meninjau checklist pra-peluncuran Anda

Sebelum mengupload ke Google Play, periksa kembali item berikut. Ingat bahwa hal ini secara khusus relevan dengan multi-APK, dan sama sekali tidak merepresentasikan checklist lengkap untuk semua aplikasi yang diupload ke Google Play.

  • Semua APK harus memiliki nama paket yang sama
  • Semua APK harus ditandatangani dengan sertifikat yang sama
  • Jika APK tumpang tindih dalam versi platform, APK dengan minSdkVersion yang lebih tinggi harus memiliki kode versi yang lebih tinggi
  • Periksa lagi filter manifes Anda untuk informasi yang konflik (APK yang hanya mendukung cupcake di layar XLARGE tidak akan terlihat oleh siapa pun)
  • Setiap manifes APK harus unik di setidaknya satu dari layar, tekstur OpenGL, atau versi platform yang didukung
  • Coba uji setiap APK pada setidaknya satu perangkat. Jika tidak, Anda juga memiliki salah satu emulator perangkat yang paling dapat disesuaikan dalam bisnis yang ada di mesin pengembangan Anda. Cobalah!

Sebaiknya periksa juga APK yang telah dikompilasi sebelum meluncurkannya ke pasar, untuk memastikan tidak kejutan apa pun yang dapat menyembunyikan aplikasi Anda di Google Play. Ini sebenarnya cukup sederhana dengan menggunakan "aapt" menyediakan alat command line gcloud. Aapt (Android Asset Packaging Tool) adalah bagian dari proses build untuk membuat dan mengemas aplikasi Android Anda, dan juga merupakan alat yang sangat berguna untuk memeriksanya.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Ketika Anda memeriksa {i>output<i} aapt, pastikan untuk memeriksa bahwa Anda tidak memiliki nilai yang bertentangan untuk Support-screens dan kompatibel-screens, dan bahwa Anda tidak memiliki "uses-feature" yang tidak diinginkan nilai-nilai yang ditambahkan karena izin yang Anda tetapkan dalam manifes. Pada contoh di atas, APK tidak akan terlihat oleh banyak perangkat.

Mengapa? Dengan menambahkan izin yang diperlukan SEND_SMS, persyaratan fitur android.hardware.telephony ditambahkan secara implisit. Karena API 11 adalah Honeycomb (versi Android yang dioptimalkan khusus untuk tablet), dan tidak ada perangkat Honeycomb yang memiliki hardware ponsel di dalamnya, Google Play akan memfilter APK dalam semua kasus, hingga perangkat di masa mendatang hadir dengan level API lebih tinggi dan disertai dengan hardware ponsel.

Untungnya, hal ini dapat diperbaiki dengan menambahkan kode berikut ke manifes:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

Persyaratan android.hardware.touchscreen juga ditambahkan secara implisit. Jika ingin APK terlihat di TV yang bukan merupakan perangkat layar sentuh, Anda harus menambahkan kode berikut ke manifes:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Setelah Anda melengkapi checklist pra-peluncuran, upload APK ke Google Play. Mungkin diperlukan beberapa saat agar aplikasi muncul saat menjelajahi Google Play. Namun saat aplikasi muncul, lakukan satu pemeriksaan terakhir. Download aplikasi ke perangkat uji apa pun yang mungkin Anda miliki untuk memastikan bahwa APK menargetkan perangkat yang dituju. Selamat, Anda sudah selesai!