Bagikan melalui


File Ekspansi APK

Beberapa aplikasi (beberapa game, misalnya) memerlukan lebih banyak sumber daya dan aset daripada yang dapat disediakan dalam batas ukuran aplikasi Android maksimum yang diberlakukan oleh Google Play. Batas ini tergantung pada versi Android yang ditargetkan APK Anda untuk:

  • 100MB untuk APK yang menargetkan Android 4.0 atau yang lebih tinggi (API level 14 atau lebih tinggi).
  • 50MB untuk APK yang menargetkan Android 3.2 atau yang lebih rendah (API level 13 atau lebih tinggi).

Untuk mengatasi batasan ini, Google Play akan menghosting dan mendistribusikan dua file ekspansi untuk digunakan bersama dengan APK, memungkinkan aplikasi untuk secara tidak langsung melebihi batas ini.

Di sebagian besar perangkat, ketika aplikasi diinstal, file ekspansi akan diunduh bersama dengan APK dan akan disimpan ke lokasi penyimpanan bersama (kartu SD atau partisi yang dapat dipasang USB) pada perangkat. Pada beberapa perangkat yang lebih lama, file ekspansi mungkin tidak diinstal secara otomatis dengan APK. Dalam situasi ini, aplikasi perlu berisi kode yang akan mengunduh file ekspansi ketika pengguna pertama kali menjalankan aplikasi.

File ekspansi diperlakukan sebagai blob biner buram (obb) dan mungkin berukuran hingga 2GB. Android tidak melakukan pemrosesan khusus pada file-file ini setelah diunduh - file dapat dalam format apa pun yang sesuai untuk aplikasi. Secara konseptual, pendekatan yang direkomendasikan untuk file ekspansi adalah sebagai berikut:

  • Ekspansi utama - File ini adalah file ekspansi utama untuk sumber daya dan aset yang tidak akan sesuai dengan batas ukuran APK. File ekspansi utama harus berisi aset utama yang dibutuhkan aplikasi dan jarang harus diperbarui.
  • Perluasan patch - Ini ditujukan untuk pembaruan kecil untuk file ekspansi utama. File ini dapat diperbarui. Adalah tanggung jawab aplikasi untuk melakukan patch atau pembaruan yang diperlukan dari file ini.

File ekspansi harus diunggah pada saat yang sama saat APK diunggah. Google play tidak mengizinkan file ekspansi diunggah ke APK yang ada atau untuk APK yang ada untuk diperbarui. Jika perlu memperbarui file ekspansi, maka APK baru harus diunggah dengan yang versionCode diperbarui.

Penyimpanan File Ekspansi

Saat file diunduh ke perangkat, file akan disimpan di shared-store/Android/obb/package-name:

  • shared-store – Ini adalah direktori yang ditentukan oleh Android.OS.Environment.ExternalStorageDirectory .
  • package-name – Ini adalah nama paket gaya Java aplikasi.

Setelah diunduh, file ekspansi tidak boleh dipindahkan, diubah, diganti namanya, atau dihapus dari lokasinya di perangkat. Untuk melakukannya akan menyebabkan file ekspansi diunduh lagi, dan file lama akan dihapus. Selain itu, direktori file ekspansi hanya boleh berisi file paket ekspansi.

File ekspansi tidak menawarkan keamanan atau perlindungan di sekitar konten mereka - aplikasi atau pengguna lain dapat mengakses file apa pun yang disimpan di penyimpanan bersama.

Jika perlu untuk membuka kemasan file ekspansi, file yang tidak dikemas harus disimpan dalam direktori terpisah, seperti di Android.OS.Environment.ExternalStorageDirectory.

Alternatif untuk mengekstrak file dari file ekspansi adalah membaca aset atau sumber daya langsung dari file ekspansi. File ekspansi tidak lebih dari file zip yang dapat digunakan dengan file yang sesuai ContentProvider. Android.Play.ExpansionLibrary berisi rakitan, System.IO.Compression.Zip, yang mencakup ContentProvider yang akan memungkinkan akses file langsung ke beberapa file media. Jika file media sedang dikemas ke dalam file zip, panggilan pemutaran media dapat secara langsung menggunakan file dalam zip tanpa harus membuka kemasan file zip. File media tidak boleh dikompresi ketika ditambahkan ke file zip.

FileName Format

Saat file ekspansi diunduh, Google Play akan menggunakan skema berikut untuk memberi nama ekspansi:

[main|patch].<expansion-version>.<package-name>.obb

Tiga komponen skema ini adalah:

  • main atau patch – Ini menentukan apakah ini adalah file ekspansi utama atau patch. Hanya ada satu dari masing-masing.
  • <expansion-version> – Ini adalah bilangan bulat yang cocok versionCode dengan APK yang pertama kali dikaitkan dengan file.
  • <package-name> – Ini adalah nama paket gaya Java aplikasi.

Misalnya, jika versi APK adalah 21, dan nama paketnya adalah mono.samples.helloworld, file ekspansi utama akan diberi nama main.21.mono.samples.helloworld.

Proses Pengunduhan

Ketika aplikasi diinstal dari Google Play, file ekspansi harus diunduh dan disimpan bersama dengan APK. Dalam situasi tertentu, ini mungkin tidak terjadi, atau file ekspansi dapat dihapus. Untuk menangani kondisi ini, aplikasi perlu memeriksa untuk melihat apakah file ekspansi ada lalu mengunduhnya, jika perlu. Diagram alur berikut menampilkan alur kerja yang direkomendasikan dari proses ini:

APK expansion flowchart

Ketika aplikasi dimulai, aplikasi harus memeriksa untuk melihat apakah file ekspansi yang sesuai ada di perangkat saat ini. Jika tidak, aplikasi harus membuat permintaan dari Lisensi Aplikasi Google Play. Pemeriksaan ini dilakukan dengan menggunakan Pustaka Verifikasi Lisensi (LVL), dan harus dibuat untuk aplikasi gratis dan berlisensi. LVL terutama digunakan oleh aplikasi berbayar untuk memberlakukan pembatasan lisensi. Namun, Google telah memperluas LVL sehingga dapat digunakan dengan pustaka ekspansi juga. Aplikasi gratis harus melakukan pemeriksaan LVL, tetapi dapat mengabaikan pembatasan lisensi. Permintaan LVL bertanggung jawab untuk memberikan informasi berikut tentang file ekspansi yang diperlukan aplikasi:

  • Ukuran File – Ukuran file dari file ekspansi digunakan sebagai bagian dari pemeriksaan yang menentukan apakah file ekspansi yang benar telah diunduh atau belum.
  • Nama file – Ini adalah nama file (pada perangkat saat ini) tempat paket ekspansi harus disimpan.
  • URL untuk Unduh – URL yang harus digunakan untuk mengunduh paket ekspansi. Ini unik untuk setiap unduhan dan akan kedaluwarsa segera setelah disediakan.

Setelah pemeriksaan LVL dilakukan, aplikasi harus mengunduh file ekspansi, dengan mempertimbangkan poin-poin berikut sebagai bagian dari unduhan:

  • Perangkat mungkin tidak memiliki cukup ruang untuk menyimpan file ekspansi.
  • Jika Wi-Fi tidak tersedia, maka pengguna harus diizinkan untuk menjeda atau membatalkan unduhan untuk mencegah biaya data yang tidak diinginkan.
  • File ekspansi diunduh di latar belakang untuk menghindari pemblokiran interaksi pengguna.
  • Saat unduhan terjadi di latar belakang, indikator kemajuan harus ditampilkan.
  • Kesalahan yang terjadi selama pengunduhan ditangani dengan baik dan dapat dipulihkan.

Gambaran Umum Arsitektur

Ketika aktivitas utama dimulai, ia memeriksa untuk melihat apakah file ekspansi diunduh. Jika file diunduh, file harus diperiksa validitasnya.

Jika file ekspansi belum diunduh atau jika file saat ini tidak valid, maka file ekspansi baru harus diunduh. Layanan terikat dibuat sebagai bagian dari aplikasi. Ketika aktivitas utama aplikasi dimulai, aplikasi menggunakan layanan terikat untuk melakukan pemeriksaan terhadap layanan Google Licensing untuk mengetahui nama file ekspansi dan URL file yang akan diunduh. Layanan terikat kemudian akan mengunduh file pada utas latar belakang.

Untuk memudahkan upaya yang diperlukan untuk mengintegrasikan file ekspansi ke dalam aplikasi, Google membuat beberapa pustaka di Java. Pustaka yang dimaksud adalah:

  • Pustaka Pengunduh – Ini adalah pustaka yang mengurangi upaya yang diperlukan untuk mengintegrasikan file ekspansi dalam aplikasi. Pustaka akan mengunduh file ekspansi di layanan latar belakang, menampilkan pemberitahuan pengguna, menangani masalah konektivitas jaringan, melanjutkan unduhan, dll.
  • Pustaka Verifikasi Lisensi (LVL) – Pustaka untuk membuat dan memproses panggilan ke layanan Lisensi Aplikasi. Ini juga dapat digunakan untuk melakukan pemeriksaan lisensi, untuk melihat apakah aplikasi diotorisasi untuk digunakan pada perangkat.
  • APK Expansion Zip Library (opsional) – Jika file ekspansi berada dalam file zip, pustaka ini akan bertindak sebagai penyedia konten dan memungkinkan aplikasi untuk membaca sumber daya dan aset langsung dari file zip tanpa harus memperluas file zip.

Pustaka ini telah di-port ke C# dan tersedia di bawah lisensi Apache 2.0. Untuk mengintegrasikan file ekspansi dengan cepat ke dalam aplikasi yang ada, pustaka ini dapat ditambahkan ke aplikasi Xamarin.Android yang ada. Kode ini tersedia di Android.Play.ExpansionLibrary di GitHub.