Membuat multi-APK dengan beberapa dimensi

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

Saat mengembangkan aplikasi Android guna memanfaatkan multi-APK di Google Play, penting untuk menerapkan beberapa praktik terbaik dari awal, dan mencegah lebih banyak lagi kerumitan yang tidak perlu pada proses pengembangan. Tutorial ini menunjukkan cara membuat multi-APK aplikasi, yang masing-masing mencakup kelas ukuran layar yang berbeda. Anda juga akan mendapatkan beberapa alat yang diperlukan untuk mempermudah pemeliharaan codebase multi-APK.

Mengonfirmasi bahwa Anda memerlukan multi-APK

Saat mencoba membuat aplikasi yang berfungsi di berbagai perangkat Android yang tersedia, Anda tentu ingin agar aplikasi berjalan dengan tampilan terbaik di setiap perangkat. Anda ingin memanfaatkan ruang di layar besar namun tetap bekerja di layar kecil, atau ingin menggunakan tekstur visual atau fitur API Android baru yang tersedia di perangkat canggih namun tidak meninggalkan perangkat yang lama. Mungkin di awal akan tampak seolah-olah dukungan multi-APK adalah solusi terbaik, tetapi ini sering kali tidak sesuai harapan. Bagian Menggunakan APK Tunggal pada panduan multi-APK berisi informasi yang berguna tentang cara menyelesaikannya dengan satu APK, termasuk penggunaan support library kami, dan link ke resource di seluruh panduan Developer Android.

Jika Anda dapat mengelolanya, membatasi aplikasi ke satu APK memiliki beberapa keuntungan, 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 khawatir tentang preferensi pasar, perilaku akibat "upgrade" dari satu APK ke APK berikutnya, atau kesesuaian APK dengan tiap kelas perangkatnya

Bagian selanjutnya dari tutorial ini mengasumsikan bahwa Anda telah meneliti topik, mempelajari materi dalam referensi yang ditautkan, dan menentukan bahwa multi-APK adalah jalur yang tepat untuk aplikasi Anda.

Membuat diagram kebutuhan Anda

Mulailah dengan membuat diagram sederhana untuk menentukan dengan cepat berapa banyak APK yang Anda butuhkan, dan ukuran layar yang dicakup setiap APK. Untungnya, tidak sulit membuat diagram kebutuhan Anda secara cepat, mudah, dan memiliki referensi untuk nanti. Misalnya Anda ingin membagi APK dalam dua dimensi, API dan ukuran layar. Buat tabel dengan baris dan kolom untuk setiap kemungkinan pasangan nilai, dan warnai di beberapa "blob". Setiap warna merepresentasikan satu APK.

3 4 5 6 7 8 9 10 11 12 +
small
normal
large
xlarge

Di atas adalah contoh dengan empat APK. Biru untuk semua perangkat layar small/normal, Hijau untuk layar large, dan Merah untuk layar xlarge, semuanya dengan rentang API 3-10. Ungu adalah kasus khusus, karena diperuntukkan bagi semua ukuran layar, tetapi hanya untuk API 11 dan yang lebih baru. Yang terpenting, hanya dengan melihat diagram tersebut, Anda dapat langsung mengetahui APK yang mencakup kombinasi API/ukuran layar tertentu. Untuk boot, Anda juga memiliki namakode yang keren untuk masing-masing, karena "Sudahkah kita menguji warna merah pada ?" jauh lebih mudah untuk ditanyakan ke cubie daripada "Sudahkah kita menguji APK xlarge dengan rentang 3-10 terhadap Xoom?"Cetak diagram ini dan bagikan kepada setiap orang yang mengerjakan codebase Anda. Semua jadi jauh lebih mudah.

Memasukkan semua kode umum dan resource dalam project library

Baik Anda memodifikasi aplikasi Android yang ada atau memulai dari awal, ini adalah hal pertama yang harus Anda lakukan pada codebase, dan sejauh ini merupakan hal yang paling penting. Semua yang masuk ke project library hanya perlu diupdate sekali (pertimbangkan string yang yang dilokalkan dari segi bahasa, tema warna, bug yang diperbaiki dalam kode bersama), yang mempersingkat waktu pengembangan Anda serta mengurangi kemungkinan terjadinya kesalahan yang dapat dihindari dengan mudah.

Catatan: Meskipun detail penerapan tentang cara membuat dan menyertakan project library berada di luar cakupan tutorial ini, Anda dapat memperoleh informasi selengkapnya dengan membaca Membuat Library Android.

Jika Anda mengonversi aplikasi yang ada untuk menggunakan dukungan multi-APK, periksa codebase untuk setiap file string yang dilokalkan, daftar nilai, warna tema, tata letak dan ikon menu yang tidak akan berubah di seluruh APK, lalu masukkan semuanya dalam project library. Kode yang tidak akan banyak berubah juga harus masuk ke project library. Anda mungkin perlu memperluas class ini untuk menambahkan satu atau dua metode dari APK ke APK.

Sebaliknya, jika Anda membuat aplikasi dari awal, cobalah sebisa mungkin menulis kode dalam project library terlebih dahulu, lalu pindahkan hanya ke APK individual jika perlu. Cara ini jauh lebih mudah untuk dikelola dalam jangka panjang daripada menambahkannya ke satu library, lalu ke library lain, dan yang lainnya lagi, kemudian beberapa bulan ke depan mencoba mencari tahu apakah blob ini dapat dipindahkan ke bagian library tanpa mengacaukan apa pun.

Membuat project APK baru

Harus ada project Android terpisah untuk setiap APK yang akan Anda rilis. Untuk memudahkan pengaturan, masukkan project library dan semua project APK terkait dalam folder induk yang sama. Ingat juga bahwa setiap APK harus memiliki nama paket yang sama, meskipun tidak harus sama dengan library. Jika Anda memiliki 3 APK yang mengikuti skema yang dijelaskan sebelumnya, direktori utama Anda mungkin akan terlihat seperti berikut:

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

Setelah project dibuat, tambahkan project library sebagai referensi untuk setiap project APK. Jika dimungkinkan, tentukan Aktivitas awal Anda dalam project library, lalu perluas Aktivitas tersebut dalam project APK Anda. Dengan adanya aktivitas awal yang ditentukan dalam project library, Anda memiliki peluang untuk menempatkan semua inisialisasi aplikasi di satu tempat, sehingga setiap APK tidak harus menerapkan ulang tugas "universal" seperti menginisialisasi Analytics, menjalankan pemeriksaan pemberian lisensi, dan prosedur inisialisasi lainnya yang tidak banyak berubah dari APK ke APK.

Menyesuaikan manifes

Saat pengguna mendownload aplikasi yang menggunakan beberapa APK melalui Google Play, APK yang tepat untuk digunakan akan dipilih dengan dua aturan sederhana:

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

Contohnya, mari lihat beberapa APK yang dijelaskan sebelumnya, dan asumsikan bahwa setiap APK telah ditetapkan untuk mendukung semua ukuran layar yang lebih besar dari ukuran layar “target”. Mari lihat diagram contoh yang tadi

3 4 5 6 7 8 9 10 11 12 +
small
normal
large
xlarge

Karena cakupan boleh tumpang-tindih, kami dapat menjelaskan area yang dicakup oleh masing-masing APK seperti:

  • Biru mencakup semua layar, minSDK 3.
  • Hijau mencakup layar Large dan yang lebih tinggi, minSDK 3.
  • Merah mencakup layar XLarge (umumnya tablet), minSDK 9.
  • Ungu mencakup semua layar, minSDK 11.

Perhatikan bahwa ada banyak yang tumpang tindih dalam aturan tersebut. Misalnya, perangkat XLarge dengan API 11 mungkin dapat menjalankan salah satu dari 4 APK yang ditentukan. Namun, dengan menggunakan aturan "nomor versi tertinggi yang menang", kita dapat menetapkan urutan preferensi sebagai berikut:

Ungu ≥ Merah ≥ Hijau ≥ Biru

Mengapa mengizinkan semua tumpang tindih? Mari anggap bahwa APK Ungu memiliki beberapa persyaratan, sedangkan dua lainnya tidak. Halaman Filter di Google Play pada panduan Developer Android memiliki daftar lengkap kemungkinan penyebabnya. Sebagai contoh, anggaplah bahwa Ungu memerlukan kamera depan. Faktanya, tujuan Ungu secara keseluruhan adalah menggunakan kamera depan untuk hal-hal terkait hiburan! Namun, ternyata, tidak semua perangkat API 11+ MEMILIKI kamera depan. Mengejutkan!

Untungnya, jika pengguna menjelajahi Google Play dari salah satu perangkat tersebut, Google Play akan melihat manifes tersebut, melihat bahwa Ungu mencantumkan kamera depan sebagai persyaratan, dan diam-diam mengabaikannya, yang kemudian menentukan bahwa Ungu dan perangkat tersebut tidak berjodoh di dunia digital. Kemudian akan terlihat bahwa Merah tidak hanya kompatibel dengan perangkat xlarge, tetapi juga tidak peduli apakah ada kamera depan atau tidak. Aplikasi masih dapat didownload dari Google Play oleh pengguna, karena meskipun terjadi hal tak terduga dengan kamera depan, masih ada APK yang mendukung level API tersebut.

Untuk menyimpan semua APK di “jalur” yang terpisah, penting untuk memiliki skema kode versi yang baik. Fitur yang direkomendasikan dapat ditemukan di area Kode Versi dalam panduan developer kami. Membaca seluruh bagian adalah hal yang baik, tetapi intinya adalah kita akan menggunakan dua digit untuk merepresentasikan minSDK, dua untuk merepresentasikan ukuran layar min/maks, dan tiga untuk merepresentasikan nomor build pada kumpulan APK ini. Dengan begitu, jika perangkat diupgrade ke versi baru Android, (misalnya, dari 10 ke 11), APK mana pun yang kini memenuhi syarat dan lebih disukai daripada yang diinstal saat ini, akan terlihat oleh perangkat sebagai versi “upgrade”. Skema nomor versi, jika diterapkan ke kumpulan contoh APK, mungkin terlihat seperti:

Biru: 0304001, 0304002, 0304003...
Hijau: 0334001, 0334002, 0334003
Merah: 0344001, 0344002, 0344003...
Ungu: 1104001, 1104002, 1104003...

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

Biru:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:versionCode="0304001" android:versionName="1.0" package="com.example.foo">
        <uses-sdk android:minSdkVersion="3" />
        <supports-screens android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:xlargeScreens="true" />
        ...
    

Hijau:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:versionCode="0334001" android:versionName="1.0" package="com.example.foo">
        <uses-sdk android:minSdkVersion="3" />
        <supports-screens android:smallScreens="false"
            android:normalScreens="false"
            android:largeScreens="true"
            android:xlargeScreens="true" />
        ...
    

Merah:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:versionCode="0344001" android:versionName="1.0" package="com.example.foo">
        <uses-sdk android:minSdkVersion="3" />
        <supports-screens android:smallScreens="false"
            android:normalScreens="false"
            android:largeScreens="false"
            android:xlargeScreens="true" />
        ...
    

Ungu

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:versionCode="1104001" android:versionName="1.0" package="com.example.foo">
        <uses-sdk android:minSdkVersion="11" />
        <supports-screens android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:xlargeScreens="true" />
        ...
    

Perhatikan bahwa secara teknis, beberapa APK akan berfungsi dengan tag supports-screens, atau tag compatible-screens. Supports-screens biasanya lebih disukai, dan secara umum, menggunakan keduanya adalah ide buruk. Hal ini membuat segalanya semakin rumit, dan meningkatkan kemungkinan untuk error. Selain itu, perhatikan juga bahwa bukan lagi memanfaatkan nilai default (small dan normal selalu true secara default), tetapi manifes secara eksplisit menetapkan nilai untuk setiap ukuran layar. Hal ini dapat membuat Anda bingung dalam prosesnya. Sebagai contoh, manifes dengan SDK target < 9 akan memiliki xlarge yang ditetapkan ke false secara otomatis, karena ukuran tersebut belum ada. Jadi, harus jelas!

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
  • Setiap ukuran layar yang Anda inginkan agar mendukung APK, tetapkan ke true di manifes. Setiap ukuran layar yang ingin Anda hindari, tetapkan ke false
  • 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 ada hal tak terduga yang dapat menyembunyikan aplikasi Anda di Google Play. Penggunaan alat "aapt" sebenarnya cukup sederhana. Aapt (Android Asset Packaging Tool) adalah bagian dari proses build untuk membuat dan memaketkan 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: 'xlarge'
    supports-any-density: 'true'
    locales: '--_--'
    densities: '120' '160' '240'
    

Saat memeriksa output aapt, pastikan untuk memeriksa bahwa Anda tidak memiliki nilai yang bertentangan untuk supports-screens dan compatible-screens, serta Anda tidak memiliki nilai-nilai "uses-feature" yang tidak diinginkan yang ditambahkan sebagai akibat dari izin yang ditetapkan dalam manifes. Pada contoh di atas, APK tidak akan terlihat oleh sebagian besar perangkat, jika tidak semuanya.

Apa alasannya? Dengan menambahkan izin yang diperlukan SEND_SMS, persyaratan fitur android.hardware.telephony ditambahkan secara implisit. Karena sebagian besar (jika tidak semua) perangkat xlarge adalah tablet tanpa hardware ponsel di dalamnya, Google Play akan memfilter APK dalam kasus ini, hingga perangkat di masa mendatang akan hadir dengan ukuran yang cukup besar untuk dilaporkan sebagai ukuran layar xlarge, dan memiliki 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!