Mengurangi ukuran aplikasi Anda

Pengguna sering menghindari mendownload aplikasi yang tampaknya terlalu besar, terutama di pasar negara berkembang tempat perangkat terhubung ke jaringan 2G dan 3G yang tidak stabil atau menggunakan paket berdasarkan penggunaan per byte. Halaman ini menjelaskan cara mengurangi ukuran download aplikasi Anda, yang memungkinkan lebih banyak pengguna mendownload aplikasi Anda.

Mengupload aplikasi dengan Android App Bundle

Cara termudah untuk langsung mendapatkan penghematan ukuran aplikasi saat memublikasikan ke Google Play adalah dengan mengupload aplikasi sebagai Android App Bundle, yang merupakan format upload baru yang menyertakan semua kode dan resource yang dikompilasi aplikasi Anda, tetapi menyerahkan pembuatan dan penandatanganan APK kepada Google Play.

Model penyajian aplikasi baru Google Play, yang disebut Pengiriman Dinamis, akan menggunakan app bundle Anda untuk membuat dan menayangkan APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga pengguna hanya perlu mendownload kode dan resource yang dibutuhkan untuk menjalankan aplikasi Anda. Anda tidak perlu lagi membuat, menandatangani, dan mengelola beberapa APK untuk mendukung berbagai perangkat, dan pengguna akan mendapatkan ukuran download yang lebih kecil serta lebih dioptimalkan.

Perlu diingat, karena Google Play memberlakukan batasan ukuran download yang dikompresi sebesar 150 MB atau kurang untuk aplikasi yang dipublikasikan dengan app bundle, sebaiknya tetap ikuti pedoman yang dijelaskan di sini untuk mengurangi ukuran download aplikasi Anda sekecil mungkin.

Untuk aplikasi yang Anda publikasikan ke Google Play dengan mengupload APK yang ditandatangani, download yang dikompresi dibatasi ke 100 MB atau kurang.

Menggunakan Android Size Analyzer

Alat Android Size Analyzer memberikan cara mudah untuk mengidentifikasi dan menerapkan banyak strategi untuk mengurangi ukuran aplikasi Anda. Alat ini tersedia baik sebagai plugin Android Studio maupun sebagai JAR mandiri.

Menggunakan analyzer di Android Studio

Anda dapat mendownload plugin Android Size Analyzer menggunakan marketplace plugin di Android Studio, seperti ditunjukkan dalam gambar 1. Untuk membuka marketplace plugin dan menginstalnya, lakukan langkah berikut:

  1. Pilih File > Settings (atau di Mac, Android Studio > Preferences.)
  2. Pilih bagian Plugin di panel kiri.
  3. Klik tab Marketplace.
  4. Telusuri plugin "Android Size Analyzer".
  5. Klik tombol Install untuk plugin analyzer.

Gambar 1. Plugin Android Size Analyzer di tab Marketplace.

Setelah Anda menginstal plugin, jalankan analisis ukuran aplikasi pada project saat ini dengan memilih Analyze > Analyze App Size dari panel menu. Setelah menganalisis project Anda, jendela alat muncul dengan rekomendasi tentang cara mengurangi ukuran aplikasi Anda, seperti ditunjukkan dalam gambar 2.

Gambar 2. Jendela alat plugin Android Size Analyzer dengan rekomendasi.

Menggunakan analyzer dari command line

Anda dapat mendownload Android Size Analyzer versi terbaru, sebagai file TAR atau ZIP, dari GitHub. Setelah mengekstrak arsip, jalankan skrip size-analyzer (di Linux atau MacOS) atau skrip size-analyzer.bat (di Windows) pada project Android atau Android App Bundle menggunakan salah satu perintah berikut:

    ./size-analyzer check-bundle <path-to-aab>
    ./size-analyzer check-project <path-to-project-directory>
    

Memahami struktur APK

Sebelum membahas cara mengurangi ukuran aplikasi, sebaiknya Anda memahami struktur APK aplikasi terlebih dahulu. File APK terdiri dari arsip ZIP yang berisi semua file yang membentuk aplikasi Anda. File ini mencakup file class Java, file resource, dan file yang berisi kompilasi resource.

APK berisi direktori berikut:

  • META-INF/: Berisi file tanda tangan CERT.SF dan CERT.RSA, serta file manifes MANIFEST.MF.
  • assets/: Berisi aset aplikasi, yang dapat diambil aplikasi menggunakan objek AssetManager.
  • res/: Berisi resource yang tidak dikompilasi ke resources.arsc.
  • lib/: Berisi kompilasi kode yang dikhususkan untuk lapisan software prosesor. Direktori ini berisi subdirektori untuk setiap jenis platform, seperti armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, dan mips.

APK juga berisi beberapa file berikut. Di antara file tersebut, hanya AndroidManifest.xml yang bersifat wajib.

  • resources.arsc: Berisi kompilasi resource. File ini berisi konten XML dari semua konfigurasi folder res/values/. Alat pengemasan mengekstrak konten XML ini, mengompilasikannya ke bentuk biner, dan mengarsipkan konten. Konten ini mencakup string dan gaya bahasa, serta lokasi ke konten yang tidak disertakan secara langsung di file resources.arsc, seperti gambar dan file tata letak.
  • classes.dex: Berisi kompilasi class dalam format file DEX yang dipahami oleh mesin virtual Dalvik/ART.
  • AndroidManifest.xml: Berisi file manifes Android inti. File ini mencakup nama, versi, hak akses, dan file library referensi aplikasi. File ini menggunakan format XML biner Android.

Mengurangi jumlah dan ukuran resource

Ukuran APK Anda berpengaruh terhadap kecepatan pemuatan aplikasi, banyaknya penggunaan memori, dan banyaknya daya yang digunakan. Salah satu cara termudah untuk memperkecil ukuran APK adalah dengan mengurangi jumlah dan ukuran resource yang ada. Secara khusus, Anda dapat menghapus resource yang tidak digunakan lagi oleh aplikasi, dan dapat menggunakan objek Drawable skalabel sebagai pengganti file gambar. Bagian ini membahas metode ini serta beberapa cara lain yang dapat Anda lakukan untuk mengurangi resource di aplikasi agar dapat mengurangi keseluruhan ukuran APK.

Menghapus resource yang tidak digunakan

Alat lint, penganalisis kode statis yang disertakan di Android Studio, mendeteksi resource di folder res/ yang tidak direferensikan oleh kode Anda. Saat menemukan resource yang mungkin tidak digunakan di project Anda, alat lint akan menampilkan pesan seperti dalam contoh di bawah.

    res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
        to be unused [UnusedResources]
    

Catatan: Alat lint tidak memindai folder assets/, aset yang direferensikan melalui refleksi, atau file library yang Anda tautkan ke aplikasi Anda. Selain itu, alat ini tidak menghapus resource, tetapi hanya memberi tahu Anda keberadaannya.

Library yang Anda tambahkan ke kode dapat menyertakan resource yang tidak digunakan. Gradle dapat otomatis menghapus resource untuk Anda jika Anda mengaktifkan shrinkResources pada file build.gradle aplikasi Anda.

    android {
        // Other settings

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

Untuk menggunakan shrinkResources, Anda juga harus mengaktifkan penyingkatan kode. Selama proses build, mula-mula R8 menghapus kode yang tidak digunakan. Selanjutnya, plugin Android Gradle akan menghapus resource yang tidak digunakan.

Untuk informasi selengkapnya tentang penyingkatan kode dan resource, serta cara lain Android Studio membantu Anda mengurangi ukuran APK, lihat Menyusutkan, meng-obfuscate, dan mengoptimalkan aplikasi Anda.

Di Android Gradle Plugin 0.7 dan yang lebih tinggi, Anda dapat mendeklarasikan konfigurasi yang didukung aplikasi. Gradle meneruskan informasi ini ke sistem build menggunakan ragam resConfig dan resConfigs serta opsi defaultConfig. Lalu, sistem build mencegah resource dari konfigurasi lain yang tidak didukung agar tidak muncul di APK, mengurangi ukuran APK. Untuk mengetahui informasi selengkapnya terkait fitur ini, lihat Menghapus resource alternatif yang tidak digunakan.

Meminimalkan penggunaan resource dari library

Saat mengembangkan aplikasi Android, Anda biasanya menggunakan library eksternal untuk menyempurnakan kegunaan dan fleksibilitas aplikasi. Misalnya, Anda dapat mereferensikan Android Support Library untuk menyempurnakan pengalaman pengguna di perangkat model lama, atau Anda dapat menggunakan Layanan Google Play untuk mengambil terjemahan otomatis untuk teks dalam aplikasi Anda.

Jika library didesain untuk server atau desktop, library dapat menyertakan banyak objek dan metode yang tidak diperlukan aplikasi Anda. Untuk menyertakan bagian library yang diperlukan aplikasi saja, Anda dapat mengedit file library jika lisensinya mengizinkan Anda mengubah library. Anda juga dapat menggunakan library alternatif yang mobile-friendly untuk menambahkan fungsi tertentu ke aplikasi Anda.

Catatan: Penyingkatan kode dapat membersihkan beberapa kode yang tidak diperlukan dari library, tetapi mungkin tidak dapat menghapus dependensi internal yang berukuran besar.

Hanya mendukung kepadatan tertentu

Android mendukung serangkaian perangkat yang besar, yang mencakup berbagai jenis kepadatan layar. Di Android 4.4 (API level 19) dan yang lebih tinggi, framework mendukung berbagai kepadatan berikut: ldpi, mdpi, tvdpi, hdpi, xhdpi, xxhdpi, dan xxxhdpi. Meskipun Android mendukung semua kepadatan ini, Anda tidak perlu mengekspor aset raster ke setiap kepadatan.

Jika Anda mengetahui bahwa hanya sebagian kecil pengguna Anda yang memiliki perangkat dengan kepadatan tertentu, pertimbangkan apakah Anda perlu menggabungkan kepadatan tersebut ke dalam aplikasi Anda. Jika Anda tidak menyertakan resource untuk kepadatan layar tertentu, Android akan otomatis menskalakan resource yang ada, yang awalnya didesain untuk kepadatan layar lainnya.

Jika aplikasi Anda hanya memerlukan gambar yang diskalakan saja, Anda dapat menghemat lebih banyak ruang dengan memiliki satu varian gambar dalam drawable-nodpi/. Sebaiknya setiap aplikasi menyertakan setidaknya satu varian gambar xxhdpi.

Untuk mengetahui informasi selengkapnya terkait kepadatan layar, lihat Ukuran dan Kepadatan Layar.

Menggunakan objek yang dapat digambar

Beberapa gambar tidak memerlukan resource gambar statis. Sebagai gantinya, framework dapat membuat gambar pada waktu proses secara dinamis. Objek Drawable (<shape> dalam XML) tidak memakan banyak ruang di APK. Selain itu, objek Drawable XML menghasilkan gambar monokrom yang sesuai dengan panduan desain material.

Menggunakan kembali resource

Anda dapat menyertakan resource terpisah untuk variasi sebuah gambar, misalnya versi diwarnai, diberi bayangan, atau diputar. Namun, sebaiknya Anda menggunakan kembali kumpulan resource yang sama, menyesuaikannya sesuai kebutuhan saat waktu proses.

Android menyediakan beberapa utilitas untuk mengubah warna aset, baik menggunakan atribut android:tint dan tintMode di Android 5.0 (API level 21) dan yang lebih tinggi. Untuk versi platform yang lebih rendah, gunakan class ColorFilter.

Anda juga dapat menghilangkan resource yang setara dengan resource lain. Cuplikan kode berikut menyediakan contoh pengubahan ikon "suka" menjadi "tidak suka" dengan pemberian pivot di bagian tengah gambar dan memutarnya 180 derajat:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/ic_thumb_up"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="180" />
    

Merender dari kode

Anda juga dapat mengurangi ukuran APK dengan merender gambar secara prosedural. Perenderan prosedural mengosongkan ruang penyimpanan karena Anda tidak lagi menyimpan file gambar dalam APK.

Mengecilkan file PNG

Alat aapt dapat mengoptimalkan resource gambar yang ditempatkan di res/drawable/ dengan kompresi lossless selama proses build. Misalnya, alat aapt dapat mengonversi PNG warna asli yang tidak memerlukan lebih dari 256 warna menjadi PNG 8 bit dengan palet warna. Tindakan tersebut akan menghasilkan gambar dengan kualitas yang sama tetapi dengan footprint memori yang lebih kecil.

Perlu diingat bahwa aapt memiliki batasan berikut:

  • Alat aapt tidak memperkecil file PNG yang ada dalam folder asset/.
  • File gambar perlu menggunakan 256 warna atau lebih sedikit untuk alat aapt guna mengoptimalkannya.
  • Alat aapt dapat meng-inflate file PNG yang telah dikompresi. Untuk mencegah hal ini, Anda dapat menggunakan flag cruncherEnabled di Gradle guna menonaktifkan proses ini untuk file PNG:
    aaptOptions {
        cruncherEnabled = false
    }
    

Mengompresi file PNG dan JPEG

Anda dapat mengurangi ukuran file PNG tanpa menurunkan kualitas gambar menggunakan alat seperti pngcrush, pngquant, atau zopflipng. Semua alat ini dapat mengurangi ukuran file PNG, tetapi tetap mempertahankan ketajaman kualitas gambar.

Alat pngcrush sangat efektif: Alat ini mengiterasi filter PNG dan parameter zlib (Deflate), menggunakan setiap kombinasi filter dan parameter untuk mengompresi gambar. Lalu, Alat ini memilih konfigurasi yang menghasilkan output terkompresi yang paling kecil.

Untuk mengompresi file JPEG, Anda dapat menggunakan alat seperti packJPG dan guetzli.

Menggunakan format file WebP

Selain menggunakan file PNG atau JPEG, Anda juga dapat menggunakan format file WebP untuk gambar Anda, dengan target penggunaan di Android 3.2 (API level 13) dan yang lebih tinggi. Format WebP menyediakan kompresi lossy (seperti JPEG) serta transparansi (seperti PNG) tetapi dapat memberikan kompresi yang lebih baik daripada JPEG atau PNG.

Anda dapat mengonversi gambar BMP, JPG, PNG, atau GIF statis yang ada ke format WebP menggunakan Android Studio. Untuk mengetahui informasi selengkapnya, lihat Membuat Gambar WebP Menggunakan Android Studio.

Catatan: Google Play menerima APK hanya jika ikon peluncur menggunakan format PNG.

Menggunakan grafik vektor

Anda dapat menggunakan grafik vektor untuk membuat ikon dengan resolusi bebas dan media skalabel lainnya. Penggunaan grafik ini dapat mengurangi footprint APK Anda secara drastis. Gambar vektor direpresentasikan di Android sebagai objek VectorDrawable. Dengan objek VectorDrawable, file berukuran 100 byte dapat menghasilkan gambar yang tajam untuk layar.

Namun, perlu waktu lama agar sistem merender setiap objek VectorDrawable, dan gambar yang lebih besar memerlukan waktu yang lebih lama untuk ditampilkan di layar. Oleh karena itu, pertimbangkan untuk menggunakan grafik vektor ini hanya ketika menampilkan gambar berukuran kecil.

Untuk informasi selengkapnya tentang menangani objek VectorDrawable, lihat Menangani Drawable.

Menggunakan grafik vektor untuk gambar animasi

Jangan gunakan AnimationDrawable untuk membuat animasi frame by frame, karena Anda akan diharuskan menyertakan file bitmap terpisah untuk setiap frame animasi, yang akan memperbesar ukuran APK secara drastis.

Sebagai gantinya, sebaiknya Anda menggunakan AnimatedVectorDrawableCompat untuk membuat vektor drawable beranimasi.

Mengurangi kode Java dan native

Ada beberapa metode yang dapat Anda gunakan untuk mengurangi ukuran codebase native dan Java di aplikasi.

Menghapus kode tidak perlu yang dihasilkan

Pastikan Anda memahami footprint kode apa pun yang dihasilkan secara otomatis. Misalnya, banyak fitur buffering protokol menghasilkan terlalu banyak metode dan kelas, yang dapat memperbesar ukuran aplikasi Anda dua kali lipat bahkan lebih.

Menghindari enumerasi

Satu enum dapat menambahkan sekitar 1,0 hingga 1,4 KB ukuran file classes.dex aplikasi Anda. Penambahan ini dapat dengan cepat terakumulasi untuk sistem yang kompleks atau library bersama. Jika memungkinkan, pertimbangkan untuk menggunakan anotasi @IntDef dan penyingkatan kode untuk menghapus enumerasi dan mengubahnya menjadi bilangan bulat. Konversi jenis ini mempertahankan semua manfaat keamanan enumerasi.

Mengurangi ukuran biner native

Jika aplikasi menggunakan kode native dan Android NDK, Anda juga dapat mengurangi ukuran aplikasi versi rilis dengan mengoptimalkan kode Anda. Dua teknik ampuh ini dapat menghapus simbol debug dan tidak mengekstrak library native.

Menghapus simbol debug

Simbol debug dapat digunakan jika aplikasi sedang dalam pengembangan dan masih memerlukan proses debug. Gunakan alat arm-eabi-strip yang disediakan di Android NDK untuk menghapus simbol debug yang tidak diperlukan dari library native. Setelah itu, Anda dapat mengompilasi build rilis Anda.

Menghindari pengekstrakan library native

Saat membuat versi rilis aplikasi Anda, buat paket file .so yang tidak terkompresi di APK dengan menetapkan android:extractNativeLibs="false" di elemen <application> manifes aplikasi Anda. Menonaktifkan flag ini akan mencegah PackageManager menyalin file .so dari APK ke sistem file selama penginstalan dan memiliki manfaat tambahan berupa ukuran update aplikasi yang lebih kecil. Saat membuat aplikasi menggunakan plugin Android Gradle 3.6.0 atau yang lebih tinggi, plugin akan menetapkan properti ini ke "false" secara default.

Mengelola beberapa APK berukuran kecil

APK dapat berisi konten yang didownload oleh pengguna tetapi tidak pernah digunakan, seperti bahasa tambahan atau resource per kepadatan layar. Untuk memastikan download yang minimal bagi pengguna, sebaiknya upload aplikasi Anda ke Google Play menggunakan Android App Bundle. Dengan mengupload app bundle, Google Play dapat membuat dan menayangkan APK yang dioptimalkan untuk setiap konfigurasi perangkat pengguna, sehingga pengguna hanya mendownload kode dan resource yang diperlukan untuk menjalankan aplikasi Anda. Anda tidak perlu lagi membuat, menandatangani, dan mengelola beberapa APK untuk mendukung berbagai perangkat, dan pengguna akan mendapatkan hasil download yang lebih kecil dan lebih optimal.

Jika Anda tidak memublikasikan aplikasi ke Google Play, Anda dapat membagi aplikasi menjadi beberapa APK, yang dibedakan oleh faktor seperti ukuran layar atau dukungan tekstur GPU.

Saat pengguna mendownload aplikasi, perangkat mereka menerima APK yang tepat berdasarkan fitur dan setelan perangkat. Dengan cara ini, perangkat tidak menerima aset untuk fitur yang tidak dimiliki perangkat. Misalnya, jika pengguna memiliki perangkat hdpi, mereka tidak memerlukan resource xxxhdpi yang mungkin Anda sertakan untuk perangkat dengan tampilan yang memiliki kepadatan lebih tinggi.

Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi Pembagian APK dan Mengelola Beberapa APK.