Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Menganalisis build dengan Penganalisis APK

Android Studio menyertakan Penganalisis APK yang memberikan insight langsung tentang komposisi APK Anda setelah proses build selesai. Penggunaan Penganalisis APK dapat mengurangi waktu yang diperlukan untuk men-debug masalah terkait file DEX dan resource dalam aplikasi Anda, serta membantu mengurangi ukuran APK Anda. Fitur ini juga tersedia dari command line dengan apkanalyzer.

Dengan Penganalisis APK, Anda dapat:

  • Melihat ukuran absolut dan relatif file dalam APK, seperti file resource DEX dan Android.
  • Memahami komposisi file DEX.
  • Melihat versi final file dalam APK dengan cepat, seperti file AndroidManifest.xml.
  • Membandingkan dua APK secara berdampingan.

Ada tiga cara untuk mengakses Penganalisis APK saat sebuah project terbuka:

  • Tarik APK ke jendela Editor Android Studio.
  • Beralihlah ke tampilan Project pada jendela Project, lalu klik dua kali APK di direktori build/output/apks/ default.
  • Pilih Build > Analyze APK di panel menu, lalu pilih APK Anda.

Penting: Saat menganalisis build debug, gunakan APK yang dibuat dengan memilih Build > Build APK atau dari perintah Gradle. Mengklik Run di toolbar akan menghasilkan APK yang mendukung Instant Run, yang tidak boleh digunakan dengan Penganalisis APK untuk tugas-tugas pengoptimalan, karena APK jenis ini hanya digunakan untuk pengembangan dan memuat sebagian besar resource secara dinamis. Anda dapat mengidentifikasi APK Instan Run melalui keberadaan file instant-run.zip yang disematkan dalam APK.

Melihat informasi file dan ukuran

APK adalah file yang mengikuti format file ZIP. Penganalisis APK menampilkan setiap file atau folder sebagai entity dengan fungsionalitas ekspansi yang disediakan untuk mengakses folder. Hierarki entity ini mencerminkan struktur file dan folder dalam file APK tersebut.

Penganalisis APK menunjukkan nilai ukuran file mentah dan ukuran file download untuk setiap entity, seperti ditunjukkan pada gambar 1. Raw File Size menunjukkan ukuran entity yang telah diekstrak pada disk, sedangkan Download Size menunjukkan perkiraan ukuran terkompresi entity sebagaimana yang akan dikirim oleh Google Play. % of Total Download Size menunjukkan persentase total ukuran download APK yang ditunjukkan entity.

Gambar 1. Ukuran file di Penganalisis APK

Melihat AndroidManifest.xml

Jika project Anda menyertakan beberapa file AndroidManifest.xml (misalnya untuk ragam produk), atau menyertakan library yang juga menyediakan file manifes, file-file tersebut akan digabung menjadi satu dalam APK Anda. File manifes ini biasanya berupa file biner di dalam APK, tetapi saat dipilih dalam Penganalisis APK, format XML entity ini akan direkonstruksi dan ditampilkan. Dengan penampil ini, Anda akan dapat memahami setiap perubahan yang mungkin telah dibuat pada aplikasi Anda selama proses build. Misalnya, Anda dapat melihat bagaimana file AndroidManifest.xml dari library yang menjadi dependensi aplikasi Anda digabungkan ke dalam file AndroidManifest.xml akhir.

Selain itu, penampil ini menyediakan beberapa kapabilitas lint, dan peringatan atau error ditampilkan di sudut kanan atas. Gambar 2 menunjukkan error yang dilaporkan untuk file manifes yang dipilih.

Gambar 2. Ikon error muncul di margin kanan untuk file manifes yang dipilih

Melihat file DEX

Penampil file DEX pada Penganalisis APK memberi Anda akses langsung ke informasi pokok dalam file DEX aplikasi Anda. Class, paket, referensi total, dan jumlah deklarasi disediakan dalam penampil, yang dapat membantu dalam memutuskan apakah akan menggunakan multidex atau tidak, atau cara menghapus dependensi untuk mendapatkan ukuran di bawah batas 64K DEX.

Gambar 3 menunjukkan aplikasi berukuran sedang yang berada di bawah batas 64k DEX. Setiap paket, class, dan metode di dalam file DEX mencantumkan jumlah di kolom Defined Method dan Referenced Methods. Kolom Referenced Methods menghitung semua metode yang direferensikan oleh file DEX. Jumlah ini biasanya mencakup metode yang ditentukan dalam kode Anda, library dependensi, dan metode yang ditentukan dalam paket Java dan Android standar yang digunakan oleh kode tersebut—ini adalah metode yang memengaruhi batas metode 64k di setiap file DEX. Kolom Defined Methods hanya menghitung metode yang ditentukan dalam salah satu file DEX Anda, jadi angka ini menunjukkan sebagian Referenced Methods. Perhatikan bahwa saat Anda mengemas sebuah dependensi ke dalam APK, metode yang ditentukan dalam dependensi itu akan ditambahkan ke kedua jumlah metode. Perhatikan juga bahwa minifikasi dan penyusutan Proguard masing-masing juga dapat mengubah isi file DEX secara signifikan setelah kode sumber dikompilasi.

Gambar 3. Aplikasi berukuran sedang

Memfilter tampilan hierarki file DEX

Tepat di atas daftar Class, Penganalisis APK menyediakan filter untuk melihat isi file DEX yang dipilih.

Gambar 4. Filter DEX diatur untuk menampilkan kolom dan metode untuk BuildConfig

Untuk menggunakan filter guna menampilkan semua metode dan kolom dalam sebuah class, lakukan langkah berikut:

  1. Dalam daftar File, pilih file classes.dex.
  2. Dalam daftar Class, buka dan pilih sebuah class.
  3. Luaskan class yang Anda pilih.
  4. Klik Show fields untuk menampilkan atau menyembunyikan kolom class.
  5. Klik Show methods untuk menampilkan atau menyembunyikan metode class.
  6. Klik Show all referenced methods or fields untuk menampilkan atau menyembunyikan paket, class, metode, dan kolom yang direferensikan. Dalam tampilan hierarki, node yang dicetak miring adalah referensi yang tidak memiliki definisi dalam file DEX yang dipilih.

    File DEX dapat mereferensikan metode dan kolom yang ditentukan dalam file berbeda. Misalnya System.out.println() adalah referensi ke metode println() dalam framework Android.

Memuat pemetaan Proguard

Di samping ikon pemfilteran terdapat ikon pemetaan Proguard. Ikon ini berwarna abu-abu sampai Anda memuat sekumpulan file pemetaan Proguard yang menambahkan fungsionalitas ke penampil DEX, seperti men-deobfuscate nama (mapping.txt), menampilkan node yang telah dihapus (usage.txt), dan menunjukkan node yang tidak dapat dihapus (seeds.txt). File pemetaan Proguard berlaku pada APK yang dibuat dengan Proguard yang diaktifkan, dan harus berasal dari build yang sama dengan yang menghasilkan APK.

Gambar 5. Memuat pemetaan Proguard

Untuk memuat file pemetaan Proguard, lakukan langkah berikut:

  1. Klik Load Proguard Mappings.
  2. Buka folder project yang berisi file pemetaan dan muat semua file, kombinasi apa pun dari file tersebut, atau folder yang berisi file tersebut.

    File pemetaan biasanya terletak di project/app/build/outputs/mappings/release/. Alat pilih file didefaultkan ke folder release jika struktur project ini terdeteksi. Pertama-tama, alat pilih file akan memeriksa apakah ada nama file yang sama persis dengan mapping.txt, seeds.txt, dan usage.txt. Selanjutnya, alat pilih file akan memeriksa apakah ada nama file yang berisi teks mapping, usage, atau seeds di mana saja dan yang berakhiran .txt. Misalnya, release-seeds-1.10.15.txt merupakan sebuah kecocokan.

Daftar berikut ini menjelaskan file pemetaan:

  • seeds.txt: Node yang dicegah konfigurasi Proguard agar tidak terhapus selama penyusutan ditunjukkan dengan huruf tebal.
  • mapping.txt: Mengaktifkan Deobfuscate names sehingga Anda dapat memulihkan nama asli node yang di-obfuscate oleh Proguard. Misalnya, Anda dapat memulihkan nama node yang di-obfuscate seperti a, b, c ke MyClass, MainActivity, dan myMethod().
  • usage.txt: Mengaktifkan Show removed nodes agar Anda dapat menampilkan class, metode, dan kolom yang telah dihapus oleh Proguard selama penyusutan. Node yang dipulihkan ditampilkan dengan dicoret.

    Untuk informasi selengkapnya tentang menggunakan Proguard untuk meng-obfuscate dan meminimalkan kode Anda, baca Menyusutkan kode dan resource.

Menampilkan bytecode, menemukan penggunaan, dan membuat aturan Keep

Node dalam tampilan daftar Class memiliki menu konteks dengan opsi berikut yang memungkinkan Anda melihat bytecode, menemukan penggunaan, dan menampilkan dialog yang menunjukkan aturan Proguard yang dapat Anda salin dan tempel untuk node yang dipilih. Klik kanan node apa pun dalam tampilan daftar Class untuk menampilkan menu konteksnya.

Show bytecode: Men-dekompilasi class, metode, atau kolom yang dipilih dan menampilkan representasi bytecode smali (bukan kode Java) dalam sebuah dialog, sebagai berikut:

Gambar 6. Kode byte DEX untuk metode init

Find usages: Menunjukkan bagian lain mana dari kode DEX yang memiliki referensi ke class atau metode yang dipilih (gambar 7). Jika Anda telah memuat seeds.txt, node yang ditampilkan dalam huruf tebal menunjukkan bahwa konfigurasi Proguard mencegah dihapusnya node tersebut selama penyusutan:

Gambar 7. Referensi ke MyClass

Generate Proguard Keep rule: Menunjukkan aturan Proguard yang dapat Anda salin dan tempel ke dalam file konfigurasi Proguard project Anda agar paket, class, metode, atau kolom tertentu dipertahankan selama fase penyusutan Proguard (gambar 8). Untuk informasi selengkapnya, lihat Menyesuaikan kode yang perlu dipertahankan.

Gambar 8. Aturan Proguard yang dapat Anda salin dari dialog ke dalam file konfigurasi Proguard

Melihat entity kode dan resource

Berbagai tugas build mengubah entity akhir dalam sebuah file APK. Misalnya, aturan penyusutan Proguard dapat mengubah kode akhir Anda, dan resource image dapat diganti oleh resource dalam ragam produk. Versi akhir file Anda dapat dilihat dengan mudah melalui Penganalisis APK: Klik entity yang diinginkan, dan pratinjau untuk entity teks atau gambar akan ditampilkan di bawahnya, seperti ditunjukkan pada gambar 9.

Gambar 9. Pratinjau resource gambar akhir

Penganalisis APK juga dapat menampilkan berbagai file teks dan biner. Misalnya, penampil entity resources.arsc memungkinkan Anda melihat nilai untuk konfigurasi tertentu seperti terjemahan bahasa untuk resource string. Pada Gambar 10, Anda dapat melihat terjemahan untuk setiap resource string.

Gambar 10. Pratinjau resource string yang telah diterjemahkan

Membandingkan file APK

Penganalisis APK dapat membandingkan ukuran entity dalam dua file APK berbeda. Hal ini akan membantu saat Anda perlu memahami mengapa ukuran aplikasi Anda meningkat dibandingkan rilis sebelumnya. Sebelum memublikasikan APK yang telah diperbarui, lakukan langkah berikut:

  1. Muat versi APK yang akan Anda publikasikan ke Penganalisis APK.
  2. Di sudut kanan atas Penganalisis APK, klik Compare With.
  3. Dalam dialog pemilihan, temukan APK yang terakhir dipublikasikan ke pengguna Anda, lalu klik OK.

    Dialog yang mirip dengan yang ditampilkan pada gambar 11 akan muncul untuk membantu Anda menilai dampak update terhadap pengguna.

Gambar 11 menunjukkan perbedaan antara build debug dan build rilis untuk aplikasi tertentu. Opsi build yang berbeda digunakan dalam kedua jenis build ini, yang mengubah entity pokok dengan cara yang berbeda pula.

Gambar 11. Perbedaan antara debug dan rilis APK