Ditulis oleh Andrew Hayden, Software Engineer di Google Play

Pengguna Android mengunduh puluhan juta aplikasi dan game di Google Play. Kami juga memperhatikan para developer sering memperbarui aplikasi mereka agar pengguna memperoleh konten terbaik, meningkatkan keamanan, dan menyempurnakan pengalaman pengguna secara keseluruhan. Dibutuhkan banyak data untuk mengunduh pembaruan ini dan kami tahu pengguna peduli tentang besarnya data yang digunakan perangkat mereka. Di awal tahun ini, kami mengumumkan bahwa kami mulai menggunakan algoritme bsdiff (oleh Colin Percival). Dengan menggunakan bsdiff, kami mampu mengurangi ukuran pembaruan aplikasi rata-rata sebesar 47% dibandingkan dengan ukuran APK utuh.

Saat ini, kami dengan senang menyampaikan sebuah pendekatan baru yang lebih baik yaitu patching File-by-File. Pembaruan Aplikasi yang menggunakan patching File-by-File, rata-rata, 65% lebih kecil daripada aplikasi utuh, dan seringkali 90% lebih kecil, atau lebih.

Penghematan per harinya, dibandingkan dengan pendekatan sebelumnya, meningkat hingga 6 petabyte data pengguna yang disimpan per hari!

Untuk mendapatkan versi aplikasi terbaru, Google Play mengirimkan patch ke perangkat Anda yang menjelaskan perbedaan antara aplikasi versi lama dan baru.

Bayangkan jika Anda adalah seorang penulis sebuah buku yang akan segera diterbitkan, dan ingin mengubah satu kalimat - tentu jauh lebih mudah untuk memberi tahu editor tentang kalimat yang akan diubah dan apa yang harus diubah, daripada mengirim sebuah buku yang sama sekali baru. Dengan cara yang sama, patch jauh lebih kecil dan lebih cepat untuk diunduh dari pada APK secara utuh.

Teknik yang digunakan dalam patching File-by-File

Aplikasi Android dikemas sebagai APK, yang merupakan file ZIP dengan konvensi khusus. Sebagian besar materi dalam file ZIP (dan APK) dikompresi dengan menggunakan teknologi yang disebut Deflate. Deflate sangat baik mengkompresi data namun memiliki kelemahan: sangat sulit mengidentifikasi perubahan dalam materi asli (tanpa kompresi). Bahkan perubahan kecil terhadap materi asli (seperti mengubah satu kata dalam sebuah buku) dapat membuat output terkompresi oleh deflate terlihat sama sekali berbeda. Menjelaskan perbedaan antara materi asli itu mudah, tetapi menjelaskan perbedaan antara materi yang dikompresi itu sangat sulit sehingga bisa menyebabkan patch yang tidak efisien.

Perhatikan betapa banyaknya teks terkompresi di sisi kanan telah berubah dengan satu huruf dalam teks yang tidak dikompresi di sebelah kiri:

Oleh karenanya, File-by-File didasarkan pada mendeteksi perubahan dalam data yang tidak dikompresi. Untuk menghasilkan sebuah patch, kami terlebih dahulu melakukan dekompresi file lama dan baru sebelum komputasi delta (kami masih menggunakan bsdiff di sini). Lalu untuk menerapkan patch, kami melakukan dekompresi pada file lama, menerapkan delta ke materi tanpa kompresi dan kemudian mengkompresi ulang file baru. Dalam melakukannya, kami harus memastikan bahwa APK pada perangkat Anda adalah pasangan yang sesuai, di setiap byte-nya, dengan APK yang ada di Play Store (lihat APK Signature Schema v2 untuk mengetahui sebabnya).

Ketika mengkompresi ulang file baru, kami menjumpai dua komplikasi. Pertama, Deflate memiliki sejumlah setelan yang memengaruhi hasil; dan kami tidak tahu setelan mana yang digunakan pertama kali. Kedua, banyak versi deflate yang ada dan kami harus mengetahui apakah versi pada perangkat Anda sesuai.

Untungnya, setelah analisis aplikasi di Play Store, kami telah menemukan bahwa versi deflate terbaru dan kompatibel didasarkan pada akun zlib (pustaka deflate terpopuler) untuk hampir semua materi terkompresi di Play Store. Selain itu, setelan default (level=6) dan setelan kompresi maksimum (level=9) adalah satu-satunya setelan yang sebenarnya kami jumpai.

Dengan mengetahui hal ini, kita dapat mendeteksi dan mereka ulang setelan deflate awal. Hal ini memungkinkan pemekaran data, penerapan patch, dan kemudian pengompresian ulang data kembali ke byte yang persis sama dengan yang pertama kali diunggah.

Namun, ada satu hal yang dibutuhkan; daya pemrosesan tambahan pada perangkat. Pada perangkat modern (mis. dari tahun 2015), kompresi ulang memerlukan lebih dari satu detik per megabyte dan pada perangkat yang lebih kuno atau kurang canggih, waktu ini bisa lebih lama lagi. Analisis sejauh ini menunjukkan bahwa rata-rata, jika ukuran patch menjadi setengahnya maka waktu yang dihabiskan untuk menerapkan patch (yang untuk File-by-File meliputi kompresi ulang) menjadi dua kali lipat.

Untuk saat ini, kami membatasi penggunaan teknologi patching baru ini untuk pembaruan otomatis saja, yaitu pembaruan yang berlangsung di latar belakang, biasanya pada malam hari ketika ponsel Anda terhubung ke listrik dan Anda kemungkinan tidak sedang menggunakannya. Ini memastikan bahwa pengguna tidak perlu menunggu lebih lama dari biasanya sampai pembaruan selesai ketika sedang memperbarui aplikasi secara manual.

Seberapa efektifkah Patching File-by-File?

Berikut adalah contoh dari pembaruan aplikasi yang sudah menggunakan Patching File-by-File:

Aplikasi
Ukuran Awal
Ukuran Patch (BSDiff) Sebelumnya
(% vs awal)
Ukuran Patch File-by-File (% vs awal)
71,1 MB
13,4 MB (-81%)
8,0 MB (-89%)
32,7 MB
17,5 MB (-46%)
9,6 MB (-71%)
17,8 MB
7,6 MB (-57%)
7,3 MB (-59%)
18,9 MB
17,2 MB (-9%)
13,1 MB (-31%)
52,4 MB
19,1 MB (-64%)
8,4 MB (-84%)
16,2 MB
7,7 MB (-52%)
1,2 MB (-92%)

Peringatan: jika anda melihat ukuran patch yang berbeda ketika Anda menekan "pembaruan" secara manual, itu karena kami saat ini tidak sedang menggunakan File-by-file untuk pembaruan interaktif, melainkan hanya pembaruan yang dilakukan di latar belakang.

Menyimpan data dan membuat pengguna kami (& developer!) senang

Perubahan ini dirancang untuk memastikan komunitas kami yaitu lebih dari satu miliar pengguna Android menggunakan data sesedikit mungkin untuk pembaruan reguler aplikasi. Hal terbaiknya adalah bahwa sebagai developer Anda tidak perlu melakukan apa pun. Anda mendapatkan pengurangan terhadap ukuran pembaruan Anda ini secara gratis!

Jika Anda ingin tahu lebih banyak tentang patching File-by-File, termasuk rincian teknisnya, masuklah ke proyek Archive Patcher GitHub tempat Anda bisa memperoleh informasi, termasuk kode sumbernya. Ya, patching File-by-File benar-benar sumber terbuka!

Sebagai developer, jika Anda masih tertarik dalam mengurangi ukuran APK, berikut beberapa tips umum tentang cara mengurangi ukuran APK.