Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Ringkasan Play Feature Delivery

Model penyajian aplikasi Google Play menggunakan Android App Bundle untuk membuat dan melayani APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga pengguna hanya perlu mendownload kode dan resource yang dibutuhkan untuk menjalankan aplikasi Anda.

Play Feature Delivery menggunakan kemampuan app bundle tingkat lanjut, sehingga memungkinkan fitur tertentu aplikasi Anda untuk dikirim secara kondisional atau didownload secara on demand.

Menggunakan modul fitur untuk pengiriman kustom

Manfaat unik dari modul fitur adalah kemampuan untuk menyesuaikan bagaimana dan kapan berbagai fitur aplikasi didownload ke perangkat yang menjalankan Android 5.0 (API level 21) atau yang lebih tinggi. Misalnya, untuk mengurangi ukuran download awal aplikasi, Anda dapat mengonfigurasi fitur tertentu untuk didownload secara on demand atau hanya oleh perangkat yang mendukung kemampuan tertentu, seperti kemampuan mengambil gambar atau mendukung fitur augmented reality.

Meskipun Anda mendapatkan download yang sangat optimal secara default saat mengupload aplikasi Anda sebagai app bundle, opsi pengiriman fitur yang lebih canggih dan dapat disesuaikan memerlukan konfigurasi tambahan dan modularisasi fitur aplikasi Anda menggunakan modul fitur. Artinya, modul fitur menyediakan elemen dasar untuk membuat fitur modular yang dapat Anda konfigurasi untuk didownload sesuai kebutuhan.

Pertimbangkan aplikasi yang memungkinkan pengguna Anda membeli dan menjual barang di marketplace. Anda dapat memodularisasi masing-masing fungsi aplikasi berikut ke dalam modul fitur yang terpisah:

  • Login dan pembuatan akun
  • Penjelajahan marketplace
  • Penempatan item untuk dijual
  • Pemrosesan pembayaran

Tabel di bawah ini menjelaskan berbagai opsi pengiriman yang didukung modul fitur, dana bagaimana opsi tersebut dapat digunakan untuk mengoptimalkan ukuran download awal dari aplikasi marketplace contoh.

Opsi pengiriman Perilaku Contoh kasus penggunaan Memulai
Pengiriman saat penginstalan Modul fitur yang tidak mengonfigurasi salah satu opsi pengiriman yang dijelaskan di atas, akan didownload saat penginstalan aplikasi. Ini adalah perilaku penting karena artinya Anda dapat mengadopsi opsi pengiriman tingkat lanjut secara bertahap. Misalnya, Anda dapat memanfaatkan modularisasi fitur aplikasi dan mengaktifkan pengiriman on demand hanya setelah Anda sepenuhnya menerapkan download permintaan menggunakan Play Core Library.

Selain itu, aplikasi Anda dapat meminta untuk meng-uninstal fitur di lain waktu. Jadi, jika Anda memerlukan fitur tertentu saat penginstalan aplikasi, tetapi bukan setelahnya, Anda dapat mengurangi ukuran penginstalan dengan meminta penghapusan fitur dari perangkat.

Jika aplikasi memiliki aktivitas pelatihan tertentu, seperti panduan interaktif tentang cara membeli dan menjual barang di marketplace, Anda dapat memasukkan fitur tersebut saat penginstalan aplikasi, secara default.

Namun, untuk mengurangi ukuran penginstalan, aplikasi dapat meminta penghapusan fitur setelah pengguna menyelesaikan pelatihan.

Lakukan modularisasi aplikasi Anda menggunakan modul fitur yang tidak mengonfigurasi opsi pengiriman lanjutan.

Untuk mempelajari cara mengurangi ukuran aplikasi yang terinstal dengan menghapus modul fitur tertentu yang mungkin tidak diperlukan lagi oleh pengguna, baca Mengelola modul terinstal.

Pengiriman on demand Mengizinkan aplikasi Anda meminta dan mendownload modul fitur sesuai kebutuhan. Jika hanya 20% dari pengguna aplikasi marketplace memposting barang untuk dijual, strategi yang baik untuk mengurangi ukuran download awal bagi sebagian besar pengguna adalah menjadikan fungsi pengambilan gambar, termasuk deskripsi barang, dan penempatan barang yang akan dijual sebagai download on demand. Artinya, Anda dapat mengonfigurasi modul fitur untuk fungsi penjualan aplikasi, yang hanya akan didownload saat pengguna menunjukkan minat menempatkan barang untuk dijual ke marketplace.

Selain itu, jika pengguna berhenti menjual barang setelah periode waktu tertentu, aplikasi dapat mengurangi ukuran penginstalannya dengan meminta untuk menguninstal fitur tersebut.

Buat modul fitur dan konfigurasi pengiriman on demand. Aplikasi Anda kemudian dapat menggunakan Play Core library untuk meminta download modul on demand.
Pengiriman bersyarat Memungkinkan Anda menentukan persyaratan perangkat pengguna tertentu, seperti fitur hardware, lokal, dan level API minimum untuk menentukan apakah fitur termodularisasi didownload saat penginstalan aplikasi. Jika aplikasi marketplace memiliki jangkauan global, Anda mungkin perlu mendukung metode pembayaran yang hanya populer di wilayah atau penduduk lokal tertentu. Untuk mengurangi ukuran download aplikasi awal, Anda dapat membuat modul fitur yang terpisah untuk memproses jenis metode pembayaran tertentu dan menginstalnya secara kondisional pada perangkat pengguna berdasarkan lokal yang terdaftar. Buat modul fitur dan konfigurasi pengiriman bersyarat.
Pengiriman instan Google Play Instan memungkinkan pengguna untuk berinteraksi dengan aplikasi Anda tanpa perlu menginstal APK di perangkat mereka. Sebaliknya, pengguna dapat mencoba aplikasi Anda melalui tombol "Coba Sekarang" di Google Play Store atau URL yang Anda buat. Format pengiriman konten ini memudahkan Anda meningkatkan interaksi pengguna dengan aplikasi Anda.

Dengan pengiriman instan, Anda dapat menggunakan Google Play Instan untuk mengizinkan pengguna langsung mencoba fitur tertentu dari aplikasi Anda tanpa perlu menginstalnya.

Pertimbangkan game yang menyertakan beberapa level awal game dalam modul fitur ringan. Anda dapat mengaktifkan langsung modul tersebut sehingga pengguna dapat langsung mencoba game melalui link URL atau tombol “Coba Sekarang", tanpa menginstal aplikasi. Buat modul fitur dan konfigurasi pengiriman instan. Aplikasi Anda kemudian dapat menggunakan Play Core Library untuk meminta download modul on demand.

Ingat, modularisasi fitur aplikasi menggunakan modul fitur hanyalah langkah pertama. Untuk mendukung Google Play Instan, ukuran download modul dasar aplikasi Anda dan fitur aktif instan yang diberikan harus memenuhi batasan ukuran yang ketat. Untuk mempelajari lebih lanjut, baca Mengaktifkan pengalaman instan dengan mengurangi ukuran aplikasi atau game.

Modularisasi untuk aplikasi Anda

Modularisasi aplikasi Anda adalah proses pemisahan komponen logis dari project aplikasi Anda menjadi modul yang berlainan (diskret).

Pengaturan ulang fungsi aplikasi ke dalam komponen terpisah ini memerlukan pertimbangan dan waktu yang cermat. Namun, modularisasi memberikan manfaat berikut untuk project Anda:

  • Pengembangan secara paralel: Dengan memisahkan komponen logis dari aplikasi Anda ke dalam modul, tim atau individu lain di dalam organisasi Anda dapat mengambil kepemilikan setiap modul dan mengerjakannya dengan potensi konflik atau gangguan terhadap tim lain yang lebih kecil. Selain itu, jika Anda memiliki logika yang digunakan di berbagai bagian aplikasi, Anda dapat menggunakan modul library untuk mempromosikan penggunaan ulang kode dan enkapsulasi.
  • Penyempurnaan waktu build: Sistem build, seperti sistem build Android Studio menggunakan Gradle, dioptimalkan untuk project yang diatur dalam modul. Misalnya, jika Anda mengaktifkan optimasi eksekusi project paralel Gradle di workstation termasuk prosesor multi-core, sistem build dapat mem-build beberapa modul secara paralel dan dapat mengurangi waktu build secara signifikan. Makin modular project Anda, makin signifikan peningkatan performa build-nya.
  • Menyesuaikan pengiriman fitur: Fitur aplikasi Anda harus dimodularkan agar dapat memanfaatkan opsi pengiriman khusus, seperti pengiriman on demand, bersyarat, dan instan. Untuk membuat fitur on demand, Anda memerlukan upaya lebih banyak dan mungkin perlu melakukan pemfaktoran ulang pada aplikasi. Jadi, pertimbangkan baik-baik fitur aplikasi mana yang paling diuntungkan jika dimodularkan ke modul fitur dan yang paling merasakan manfaat dari opsi pengiriman khusus.

Proses memodularkan project berdasarkan fitur aplikasi dapat membutuhkan waktu dan pertimbangan matang agar dapat dilakukan dengan benar. Jika Anda memutuskan untuk mulai memodularkan aplikasi, Anda harus terlebih dahulu mengonfigurasi modul dasar Anda dengan properti yang diperlukan untuk mendukung fitur modular. Kemudian, Anda dapat memodularisasi fitur aplikasi secara bertahap tanpa mengubah perilaku aplikasi saat ini dengan mengonfigurasi modul fitur untuk dikirim saat aplikasi diinstal.

Manifes modul fitur

Saat membuat modul fitur baru menggunakan Android Studio, IDE menyertakan sebagian besar atribut manifes yang dibutuhkan modul untuk berperilaku seperti modul fitur. Selain itu, beberapa atribut diinjeksikan oleh sistem build pada waktu kompilasi, jadi Anda tidak perlu menentukan atau memodifikasinya sendiri. Tabel berikut menjelaskan atribut manifes yang penting untuk modul fitur.

Atribut Deskripsi
<manifest
...
Ini adalah blok <manifest> standar Anda.
xmlns:dist="http://schemas.android.com/apk/distribution" Menentukan namespace XML dist: baru yang dijelaskan lebih lanjut di bawah.
split="split_name" Saat Android Studio mem-build app bundle Anda, atribut ini juga termasuk. Jadi, Anda tidak boleh menyertakan atau memodifikasi sendiri atribut ini.

Menentukan nama modul, yang ditentukan aplikasi Anda saat meminta modul on demand menggunakan Play Core Library.

Cara Gradle menentukan nilai untuk atribut ini:

Secara default, jika Anda membuat modul fitur menggunakan Android Studio, IDE akan menggunakan apa yang Anda tentukan sebagai Module name untuk mengidentifikasi modul sebagai subproject Gradle dalam file setelan Gradle Anda.

Jika Anda mem-build app bundle, Gradle akan menggunakan elemen terakhir dari jalur subproject untuk memasukkan atribut manifes dalam manifes modul tersebut. Misalnya, jika Anda membuat modul fitur baru di direktori MyAppProject/features/ dan menentukan "dynamic_feature1" sebagai Module name, IDE akan menambahkan ':features:dynamic_feature1' sebagai subproject di file settings.gradle. Saat mem-build app bundle, Gradle akan memasukkan <manifest split="dynamic_feature1"> ke manifes modul.

android:isFeatureSplit="true | false"> Saat Android Studio mem-build app bundle Anda, atribut ini juga termasuk. Jadi, Anda tidak boleh menyertakan atau memodifikasi atribut ini secara manual.

Menentukan bahwa modul ini adalah modul fitur. Manifes dalam modul dasar dan APK konfigurasi menghapus atribut ini atau menyetelnya ke false.

<dist:module Elemen XML baru ini mendefinisikan atribut yang menentukan cara modul dikemas dan didistribusikan sebagai APK.
dist:instant="true | false" Menentukan apakah modul harus tersedia melalui Google Play Instan sebagai pengalaman instan.

Jika aplikasi Anda menyertakan satu atau beberapa modul fitur yang diaktifkan secara instan, Anda juga harus mengaktifkan modul dasar secara instan. Saat menggunakan Android Studio 3.5 atau yang lebih tinggi, IDE melakukan cara ini saat Anda membuat modul fitur yang diaktifkan secara instan.

Anda tidak dapat menyetel elemen XML ini ke true dengan menyetelnya juga ke <dist:on-demand/>. Namun, Anda masih dapat meminta download on demand atas modul fitur aktif instan Anda sebagai pengalaman instan menggunakan Play Core Library. Jika pengguna mendownload dan menginstal aplikasi Anda, perangkat akan mendownload dan menginstal modul fitur aplikasi instan Anda, bersama dengan APK dasar, secara default.

dist:title="@string/feature_name" Menentukan judul modul yang dilihat pengguna. Misalnya, perangkat dapat menampilkan judul ini ketika meminta konfirmasi download.

Anda perlu menyertakan resource string untuk judul ini dalam file module_root/src/source_set/res/values/strings.xml modul dasar.

<dist:fusing dist:include="true | false" />
</dist:module>
Menentukan apakah modul akan disertakan dalam multi-APK yang menargetkan perangkat yang menjalankan Android 4.4 (API level 20) dan lebih rendah.

Selain itu, jika Anda menggunakan bundletool untuk membuat APK dari app bundle, hanya modul fitur yang menyetel properti ini ke true yang akan disertakan dalam APK universal—Modul tersebut merupakan APK monolitik yang mencakup kode dan resource untuk semua konfigurasi perangkat yang didukung oleh aplikasi Anda.

<dist:delivery> Opsi enkapsulasi yang menyesuaikan pengiriman modul, seperti yang ditampilkan di bawah ini. Perlu diingat, setiap modul fitur hanya boleh mengonfigurasi satu jenis opsi pengiriman khusus ini.
<dist:install-time> Menentukan apakah modul harus tersedia pada waktu penginstalan. Ini adalah perilaku default untuk modul fitur yang tidak menentukan jenis opsi pengiriman khusus lainnya.

Untuk mempelajari download saat penginstalan lebih lanjut, baca Mengonfigurasi pengiriman saat penginstalan.

Node ini juga dapat menentukan kondisi yang membatasi modul ke perangkat yang memenuhi persyaratan tertentu, seperti fitur perangkat, negara pengguna, atau API level minimum. Untuk mempelajari lebih lanjut, baca Mengonfigurasi pengiriman bersyarat.

<dist:removable value="true | false" />

Jika tidak disetel atau disetel ke false, bundletool akan menggabungkan modul waktu penginstalan dengan modul dasar saat membuat APK terpisah dari bundle. Karena hanya akan ada sedikit APK terpisah sebagai hasil dari penggabungan, setelan ini dapat meningkatkan performa aplikasi Anda.

Jika removable disetel ke true: modul waktu penginstalan tidak akan digabungkan ke modul dasar. Setel ke true jika Anda ingin meng-uninstal modul di masa mendatang. Namun, mengonfigurasi terlalu banyak modul agar dapat dihapus bisa menambah waktu penginstalan aplikasi Anda.

Default-nya adalah false. Anda hanya perlu menyetel nilai ini di manifes jika ingin menonaktifkan penggabungan untuk modul fitur.

Catatan: Fitur ini hanya tersedia saat menggunakan plugin Android Gradle 4.2 atau saat menggunakan bundletool v1.0 dari command line.

</dist:install-time>  
<dist:on-demand/> Menentukan apakah modul harus tersedia sebagai download on demand. Artinya, modul tidak akan tersedia pada waktu penginstalan, tetapi aplikasi Anda dapat meminta untuk mendownloadnya nanti.

Untuk mempelajari download on demand lebih lanjut, baca Mengonfigurasi pengiriman on demand.

</dist:delivery>
<application
android:hasCode="true | false">
...
</application>
Jika modul fitur tidak menghasilkan file DEX—artinya, tidak berisi kode yang dikompilasi ke dalam format file DEX—Anda harus melakukan langkah-langkah berikut (jika tidak, Anda dapat mengalami error waktu proses):
  1. Setel android:hasCode ke "false" di manifes modul fitur dinamis.
  2. Tambahkan kode berikut ke manifes modul dasar Anda:
    
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
    

Menguji Play Feature Delivery

Cara terbaik untuk menguji Play Feature Delivery adalah melalui Google Play Store. Itu karena banyak manfaat dari Play Feature Delivery yang bergantung pada penangguhan pembuatan APK optimal, penandatanganan, dan penyajian pada Play Store. Jadi, terlepas apakah mengupload app bundle atau mengonfigurasi opsi pengiriman lanjutan lainnya, Anda harus menggunakan metode berikut untuk menguji aplikasi.

  • Membagikan aplikasi Anda menggunakan URL. Ini adalah cara tercepat untuk mengupload app bundle Anda dan membagikan aplikasi Anda sebagai link Google Play Store dengan penguji tepercaya. Selain itu, ini adalah cara tercepat untuk menguji opsi pengiriman kustom, seperti mendownload fitur on demand.
  • Menyiapkan uji terbuka, tertutup, atau internal. Metode ini menyediakan saluran uji terstruktur dan merupakan cara yang baik untuk menguji versi rilis final aplikasi Anda sebelum diluncurkan ke pengguna eksternal.

Membuat URI untuk resource

Jika Anda ingin mengakses resource yang disimpan di modul fitur menggunakan URI, berikut cara membuat URI resource modul fitur menggunakan Uri.Builder():

Kotlin

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build()

Java

String uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build().toString();

Setiap bagian jalur menuju resource dibuat pada waktu proses, yang memastikan bahwa namespace yang benar dibuat setelah APK terpisah dimuat.

Sebagai contoh cara pembuatan URI, asumsikan Anda memiliki aplikasi dan modul fitur dengan nama berikut:

  • Nama paket aplikasi: com.example.my_app_package
  • Nama paket resource pada fitur: com.example.my_app_package.my_dynamic_feature

Jika resId dalam cuplikan kode di atas merujuk pada resource file mentah bernama “my_video” di modul fitur, kode Uri.Builder() di atas akan menampilkan hal berikut:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

URI ini kemudian dapat digunakan oleh aplikasi Anda untuk mengakses resource pada modul fitur.

Untuk memvalidasi jalur di URI, Anda dapat menggunakan APK Analyzer guna memeriksa APK modul fitur dan menentukan nama paketnya:

Screenshot APK Analyzer yang memeriksa kompilasi konten file resource.

Gambar 2. Gunakan APK Analyzer untuk memeriksa nama paket dalam kompilasi file resource.

Pertimbangan untuk modul fitur

Jika Anda ingin memublikasikan aplikasi yang menyertakan modul fitur ke jalur produksi, perhatikan pertimbangan berikut:

  • Menginstal 50 modul fitur atau lebih pada satu perangkat dapat menyebabkan masalah performa. Untuk menghindari hal ini, pertimbangkan penggunaan Play Core Library untuk menguninstal modul yang tidak lagi diperlukan pengguna.
  • Batasi jumlah modul yang dikonfigurasi sebagai dapat dilepas untuk pengiriman saat penginstalan menjadi 10 modul atau kurang. Jika tidak, waktu download dan penginstalan aplikasi akan bertambah.
  • Hanya perangkat yang menjalankan Android 5.0 (API level 21) dan dukungan yang lebih tinggi yang dapat mendownload dan menginstal fitur on demand. Untuk menyediakan fitur pada versi Android sebelumnya, pastikan Anda telah mengaktifkan Fusing saat membuat modul fitur.
  • Pastikan Anda mengaktifkan SplitCompat, sehingga aplikasi memiliki akses ke modul fitur yang didownload.
  • Jika download untuk fitur berukuran besar, aplikasi Anda perlu mendapatkan konfirmasi pengguna sebelum dapat mendownload modul fitur ke perangkat.
  • Modul fitur seharusnya tidak menentukan aktivitas dalam manifesnya dengan android:exported yang disetel ke true. Ini karena tidak adanya jaminan bahwa perangkat mendownload modul fitur saat aplikasi lain mencoba meluncurkan aktivitas. Selain itu, aplikasi Anda harus mengonfirmasi bahwa fitur telah didownload sebelum mencoba mengakses kode dan resourcenya. Untuk mempelajari lebih lanjut, baca Mengelola modul terinstal.
  • Karena Play Feature Delivery mengharuskan Anda memublikasikan aplikasi menggunakan app bundle, pastikan Anda mengetahui masalah umum pada app bundle.

Referensi lainnya

Untuk mempelajari penggunaan Play Feature Delivery pendukung lebih lanjut, baca referensi berikut.

Contoh

  • Contoh PlayCore API, yang menunjukkan penggunaan PlayCore API untuk meminta dan mendownload modul fitur.
  • Contoh pemuatan kode dinamis, yang menunjukkan tiga pendekatan berbeda untuk mengakses kode dengan aman dari modul fitur yang diinstal.

Codelab

  • Android App Bundle Pertama Anda, codelab yang membahas prinsip-prinsip dasar Android App Bundle dan menunjukkan cara cepat untuk mulai mem-build aplikasi Anda sendiri menggunakan Android Studio. Codelab ini juga menjelaskan cara menguji app bundle Anda menggunakan bundletool.
  • Modul on demand, yang membantu Anda membuat aplikasi yang mendownload dan menginstal modul fitur on demand.

Postingan blog

Video