Ringkasan Play Feature Delivery

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

Play Feature Delivery menggunakan kemampuan app bundle tingkat lanjut, sehingga memungkinkan fitur tertentu pada aplikasi Anda dikirim secara kondisional atau didownload secara on demand. Untuk melakukannya, pertama-tama Anda perlu memisahkan fitur ini dari aplikasi dasar ke dalam modul fitur.

Konfigurasi build modul fitur

Saat Anda membuat modul fitur baru menggunakan Android Studio, IDE akan menerapkan plugin Gradle berikut ke file modul build.gradle.

// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.

apply plugin: 'com.android.dynamic-feature'

Banyak properti yang tersedia untuk plugin aplikasi standar juga tersedia untuk modul fitur. Bagian berikut ini menjelaskan properti yang boleh dan tidak boleh Anda sertakan dalam konfigurasi build modul fitur.

Yang tidak disertakan dalam konfigurasi build modul fitur

Karena setiap modul fitur bergantung pada modul dasar, modul fitur ini juga mewarisi konfigurasi tertentu. Jadi, Anda harus menghapus hal berikut dalam file build.gradle modul fitur:

  • Konfigurasi penandatanganan: App bundle ditandatangani menggunakan konfigurasi penandatanganan yang Anda tetapkan dalam modul dasar.
  • Properti minifyEnabled: Anda dapat mengaktifkan penyingkatan kode untuk seluruh project aplikasi hanya dari konfigurasi build modul dasar. Jadi, Anda harus menghapus properti ini dari modul fitur. Namun, Anda dapat menetapkan aturan ProGuard tambahan untuk setiap modul fitur.
  • versionCode dan versionName: Saat membuat app bundle, Gradle menggunakan informasi versi aplikasi yang disediakan modul dasar. Anda harus menghapus properti ini dari file build.gradle modul fitur Anda.

Menetapkan hubungan ke modul dasar

Saat membuat modul fitur, Android Studio akan membuatnya terlihat di modul dasar dengan menambahkan properti android.dynamicFeatures ke file build.gradle modul dasar, seperti yang ditunjukkan di bawah ini:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

Selain itu, Android Studio menyertakan modul dasar sebagai dependensi modul fitur, seperti yang ditunjukkan di bawah ini:

// In the feature module’s build.gradle file:
...
dependencies {
    ...
    // Declares a dependency on the base module, ':app'.
    implementation project(':app')
}

Menentukan aturan ProGuard tambahan

Meski hanya konfigurasi build modul dasar yang dapat mengaktifkan penyingkatan kode untuk project aplikasi, Anda dapat memberikan aturan ProGuard khusus dengan setiap modul fitur menggunakan properti proguardFiles, seperti ditunjukkan di bawah ini.

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

Perhatikan bahwa aturan ProGuard ini akan digabung dengan aturan dari modul lain (termasuk modul dasar) pada waktu build. Jadi, meskipun setiap modul fitur dapat menetapkan sekumpulan aturan baru, aturan tersebut berlaku untuk semua modul dalam project aplikasi.

Men-deploy aplikasi

Saat mengembangkan aplikasi yang mendukung modul fitur, Anda dapat men-deploy aplikasi Anda ke perangkat yang terhubung seperti biasanya dengan memilih Run > Run dari panel menu (atau dengan mengklik Run di toolbar).

Jika project aplikasi Anda menyertakan satu atau beberapa modul fitur, Anda dapat memilih fitur yang akan disertakan saat men-deploy aplikasi dengan mengubah konfigurasi run/debug yang ada sebagai berikut:

  1. Dari panel menu, pilih Run > Edit Configurations.
  2. Dari panel kiri dialog Run/Debug Configurations, pilih konfigurasi Android App yang Anda inginkan.
  3. Di bagian Dynamic features to deploy di tab General, centang kotak di samping setiap modul fitur yang ingin Anda sertakan saat men-deploy aplikasi.
  4. Klik OK.

Secara default, Android Studio tidak men-deploy aplikasi Anda menggunakan app bundle. Sebaliknya, IDE membuat dan menginstal APK ke perangkat Anda yang dioptimalkan untuk kecepatan deploy, bukan ukuran APK. Untuk mengonfigurasi Android Studio agar dapat membuat dan men-deploy APK dan pengalaman instan dari app bundle, modifikasi konfigurasi run/debug Anda.

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 meng-uninstal 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 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 secara instan 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.

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

Dengan modul fitur, Anda dapat meningkatkan kecepatan build dan kecepatan teknis, serta menyesuaikan pengiriman fitur aplikasi secara ekstensif untuk mengurangi ukuran aplikasi. Namun, ada beberapa batasan dan kasus ekstrem yang perlu diingat saat menggunakan modul fitur:

  • Menginstal 50 modul fitur atau lebih pada satu perangkat, melalui pengiriman bersyarat atau on demand, dapat menyebabkan masalah performa. Modul saat penginstalan, yang tidak dikonfigurasi sebagai dapat dilepas, otomatis disertakan dalam modul dasar dan hanya dihitung sebagai satu modul fitur pada setiap perangkat.
  • Batasi jumlah modul yang Anda konfigurasi sebagai dapat dilepas untuk pengiriman saat penginstalan menjadi 10 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. Agar fitur Anda tersedia untuk Android versi sebelumnya, aktifkan Fusing saat membuat modul fitur.
  • Aktifkan SplitCompat, sehingga aplikasi Anda memiliki akses ke modul fitur yang didownload yang ditayangkan on demand.
  • 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 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 dist: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>
    

Referensi tambahan

Untuk mempelajari lebih lanjut cara menggunakan modul fitur, lihat referensi berikut.

Postingan blog

Video