Bagaimana cara mengecilkan APK?

abangkis p
7 min readAug 27, 2016

--

Mungkin kamu pernah mengalami hal seperti ini. Kamu mendownload dua aplikasi dari Google Play, yang satu besarnya beberapa MB, tetapi yang satunya lagi besarnya puluhan MB. Kok bisa padahal jenis aplikasi sama dan fiturnya pun mirip-mirip.

Sebagai developer mungkin kamu terkadang tidak memikirkan hal seperti ini, karena yg penting fiturnya jalan dulu dan bisa di upload ke Google Play. Tapi kalau kamu melepas topi developer kamu dan bertindak sebagai pengguna, tentu kamu langsung menyadari bahwa besarnya apk bisa jadi penentu seseorang menginstall sebuah aplikasi atau tidak.

Ada beberapa hal yang bisa kamu lakukan untuk mengecilkan ukuran file APK kamu.

1. Image

Image bawaan biasanya adalah hal utama yang menjadi penyebab besarnya sebuah APK. Untuk itu perhatikanlah besar Image yg kamu masukkan ke APK kamu. Ada image-image yg memang perlu dimasukkan ke APK, tapi mungkin ada banyak image lain yg bisa kita download saat aplikasi berjalan.

Selain image, cara lain untuk mengurangi besarnya gambar yg kita masukkan ke APK kita adalah dengan mengganti format icon yang kita pakai ke SVG. Jangan khawatir, jika kamu sudah terbiasa mempergunakan icon dari material design, caranya mudah sekali.

Di Android studio kamu cukup memilih menu File > new Vector Asset.

Lalu dari dialog yg tampil kamu bisa memilih mau membuat vector asset dari material icon yg disediakan, atau dari file svg buatan kamu sendiri. Untuk memilih jenis icon dari library material design yg ada, click gambar icon di dialog. Kamu juga bisa mengubah ukuran icon sesuai keinginan kamu.

Jika semua sudah selesai. Klik finish dan icon akan tersedia di folder res/drawable dan siap untuk kamu pakai di aplikasi kamu. Jika kamu perhatikan, icon material design ini besarnya hanya 1kb saja, dan memiliki tingkat ketajaman yg sama baik dari ldpi, hdpi hingga xxhdpi.

Selain icon memilih image, menentukan format gambar yang tepat juga bisa membantu mengurangi besaran APK kamu. Umumnya file gambar yang kita gunakan telah terkompresi. Ada dua tipe jenis kompresi, lossy compression (dimana kita kehilangan sebagian info dari gambar yg kita kompresi) dan lossles compression (file gambar bisa kita kembalikan ke bentuk semula).

Ada 3 format gambar yg umum digunakan:

  • GIF
  • JPEG
  • PNG

Masing-masing format gambar memiliki kelebihan dan kekurangannya. GIF adalah format gambar yang mendukung lossles compression. Keterbatasannya ia hanya bisa menampilkan 256 warna saja. Kelebihan lainnya format GIF bisa menampilkan gambar bergerak dan juga mempertahankan transparansi gambar. Sehingga format GIF bagus utk dipergunakan utk menampilkan text, logo atau ilustrasi sederhana.

JPEG adalah format gambar dengan lossy compression. JPEG mendukung tipe warna CYMK, RGB, dan Gray Scale. Hal ini membuat JPEG sebagai format yang paling bagus utk menyimpan gambar dengan rentang warna yang tinggi (seperti foto) dengan ukurang yg relatif kecil.

Yang perlu diperhatikan adalah, kita tidak bisa mengembalikan gambar 100% ke file sumber. Dan juga JPEG tidak mempertahankan transparansi gambar.

PNG sendiri sebetulnya ada dua jenis PNG-8 bit dan PNG-24 bit. PNG-8 menawarkan hal yang sama seperti format GIF. Tapi karena PNG-8 tidak mendukung animasi, maka ukuran file gambar yang dihasilkan bisa lebih kecil dari format GIF. Sehingga baik utk dipergunakan sebagai format logo, terutama yg memiliki transparansi.

PNG-24 Menawarkan hal yang serupa dengan format JPEG. PNG-24 mendukung hingga 16 Juta warna. Tetapi karena PNG sifatnya loosless compression maka file yang dihasilkan akan lebih besar daripada format JPEG. Yang perlu diperhatikan adalah PNG mendukung transparansi dgn batasan yg halus, sedangkan JPEG tidak.

Jika kamu banyak mempergunakan format PNG, kita bahkan bisa melakukan manual optimization terhadap file PNG yang kita include di APK kita. Ada sesi khusus di Google I/O 2016 yang membahas hal ini, silahkan ditonton di link berikut:

Saat melakukan manual optimization jangan lupa untuk mematikan option cruncher enable di konfigurasi aapt. Kalau tidak file PNG yg telah kita optimasi akan tertimpa hasil optimasi dari aapt.

aaptOptions{
cruncherEnabled = False
}

Selain dari ketiga format umum di atas, terdapat satu format gambar baru yang saat ini sedang didorong adopsinya oleh google, WebP.

WebP mendukung kedua tipe kompresi, loosless dan lossy compression. Kelebihan WebP adalah dengan kualitas yg hampir sama, besar file yang dihasilkan jauh lebih kecil.

  • Format lossless WebP 26% lebih kecil dari PNGs
  • Format lossy WebP 25% — 34% lebih kecil dari JPEG
  • Selain itu WebP juga mendukung transparansi

Kelemahan terbesar WebP adalah adopsi standar. Walaupun Google Chrome dan Opera sudah mendukung format ini out of the box, browser-browser lain belum menujukkan komitmen terhadap format ini.

Jadi jika gambar kamu hanya dipergunakan di Android. Maka hanya dengan mengganti format gambar ke WebP, kamu langsung bisa mengurangi besar apk kamu hingga 25%.

Di Android sendiri, format WebP sudah didukung semenjak versi 4.0. (Loosless & Transparance semenjak versi 4.2.1)

Library

Hal lain yang menjadi faktor utama besarnya sebuah APK adalah library bawaan. Ada dua hal yang perlu dicermati

  1. Besarnya library itu sendiri. Sebagai contoh mempergunakan library joda time, gson dan okhttp akan menambahkan 417, 208 dan 323 KB ke APK kita

Untuk melihat besar sebuah file jar yang kita include di project kita. Ubah explorer pane ke tipe project > pilih bagian external library > expand library yg ingin kita lihat besarnya > klik kanan di file jar > show in explorer

2. Library dependency. Bagi yg belum terbiasa mempergunakan dependency manager seperti maven & ivy, mungkin tidak sadar jika kita memasukkan sebuah library ke project kita, bukan berarti bahwa hanya file jar dari library itu saja. Tapi terkadang mereka juga membawa dependency, yaitu file-file jar yg dibutuhkan oleh library itu agar dapat bekerja.

Sebagai contoh mari kita lihat dependency dari OkHttp. Untuk menampilkan daftar dependency kita kita bisa mempergunakan gradle dependencies task

$>gradlew app:dependencies

Berdasarkan diagram depencies gradle, terlihat bahwa teryata OkHttp memiliki dependencies ke okio library. Jika kita pergunakan cara yang sama seperti sebelumnya maka kita ketahui bahwa okio memiliki besar 65 KB.

Jadi kalau sebelumnya kita menduga bahwa kita hanya menambahkan 323 KB saat kita menambahkan OkHttp library, tapi ternyata sebenarnya APK kita bertambah besar 388 KB saat mempergunakan library ini.

Sebagai contoh ekstrim kita bisa melihat depency dari Google Mobile Services. Developer pemula biasanya hanya menambahkan satu baris ini jika mempergunakan GMS di aplikasinya

compile 'com.google.android.gms:play-services:9.4.0'

Jika kita melihat dependencies graph-nya, agak seram-seram menakjubkan :)

Bahkan satu halaman monitor tidak cukup utk menampilkan keseluruhan depency graph dari GMS. Berapa KB atau MB APK kamu akan membesar dengan penambahan satu baris dependency tersebut?

Oleh karena ini Google telah memecah GMS menjadi depencency kecil yg bisa kamu include secara terpisah.

Dari dua hal di atas kita bisa melihat betapa pemilihan library ikut mempengaruhi ukuran APK aplikasi kita. Dengan memasukkan library dari sana-sini tanpa memikirkan ukuran, tentu APK aplikasi kita besarnya akan meningkat dengan cepat.

Berikut beberapa pertimbangan dalam memasukkan sebuah library ke dalam aplikasi kita:

  • Seberapa sulit dan waktu yang dibutuhkan untuk menerapkan fitur yang kita inginkan dari library tersebut.
  • Berapa besar perubahan ukuran APK dengan menginclude library tersebut
  • Apakah fitur yg diberikan oleh library tersebut crucial bagi aplikasi kita
  • Apakah library tersebut memiliki tingkat adopsi dan dimaintain dengan baik?
  • Apakah perlu kita menginclude keseluruhan library, atau mungkin kita bisa mengambil kelas/method tertentu saja? Ingat, dengan pendekatan ini berarti ada cost extra jika library yg kita pergunakan melakukan update.

Lalu bagaimana jika library tersebut memang benar-benar kita butuhkan. Tidak ada kah cara untuk mengurangi ukurannya? Atau terima saja nasib :D

Ada, Obfuscate!

Obfuscation selain berfungsi untuk menghambat pihak lain untuk memahami hasil decompile aplikasi kita, dapat berguna juga untuk mengecilkan file APK kita.

Proguard (Obfuscator bawaan android) bekerja dengan cara mendeteksi dan menghapus class, field, method dan attribut yang tidak dipergunakan. Selain itu proguard juga mengubah nama class, field dan method menjadi nama yg pendek dan tidak bermakna(obfuscation) sehingga byte code yg dihasilkan pun lebih kecil.

Sebagai perbandingan berikut data salah satu aplikasi kami sebelum dan sesudah obfuscate

APK hasil obfuscate hanya 66% dari ukuran awal. Jangan lupa untuk meng-enable kan flag minifyEnable dan shrinkResources saat melakukan obfuscate dengan Proguard

buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-release.pro'

zipAlignEnabled true
}
}

Multiple APK

Jika cara-cara tersebut masih kurang berhasil dalam mengecilkan APK sesuai keinginan kamu, ada satu jalan lagi yang bisa ditempuh, multiple APK.

Dengan Multiple APK maka kita memecah resource-resource yg kita masukkan ke APK kita sesuai dengan konfigurasi alat target. Jadi kita cukup memasukkan gambar-gambar yang sesuai dengan resolusi alat tersebut. Tapi perlu diingat, solusi ini akan meningkatkan usaya yang dibutuhkan untuk me-maintain apk kita secara eksponensial dibandingkan dengam menggunakan single apk.

Untuk menerapkan Multiple APK silahkan lihat tautan berikut:

https://developer.android.com/google/play/publishing/multiple-apks.html

--

--

abangkis p
abangkis p

Written by abangkis p

Founder of MReunion Labs. Senior Developer Id-Android. Take a chance! Click that follow button.

Responses (2)