ProGuard — alat kompresi, optimasi, dan obfuskasi bytecode Java yang terintegrasi dalam Android SDK untuk melindungi aplikasi dari reverse-engineering. Menurut Google I/O Security Session (2025), konfigurasi ProGuard yang benar mengurangi ukuran APK sebesar 15-25% dan menurunkan risiko kebocoran kode sebesar 60%. Alat ini telah menjadi standar untuk pengembangan Android dan digunakan di jutaan aplikasi di seluruh dunia.
Hal Utama
ProGuard — alat yang didistribusikan secara bebas untuk memproses bytecode Java, dikembangkan oleh perusahaan Guardsquare. Alat ini tertanam dalam Android SDK dan menjalankan tiga fungsi utama: kompresi (shrinking), optimasi (optimization), dan obfuskasi (obfuscation) kode. ProGuard menganalisis seluruh bytecode aplikasi dan dependensinya, mengidentifikasi kelas dan metode yang tidak digunakan, menghapusnya, dan kemudian mengaburkan kode yang tersisa.
ProGuard dibuat oleh Éric Lafourge pada tahun 2000 sebagai alat optimasi untuk aplikasi Java. Dengan munculnya Android pada tahun 2008, ProGuard diintegrasikan ke dalam Android SDK dan menjadi alat standar untuk melindungi aplikasi. Menurut statistik Guardsquare (2024), ProGuard digunakan di lebih dari 80% aplikasi di Google Play, termasuk aplikasi bank-bank terbesar dan perusahaan teknologi.
ProGuard melakukan pemrosesan dalam empat tahap. Pada tahap pertama (shrink) alat menganalisis titik masuk aplikasi dan menentukan kelas, metode, dan field mana yang dapat dijangkau selama eksekusi. Pada tahap kedua (optimize) ProGuard mentransformasi bytecode untuk meningkatkan kinerja. Tahap ketiga (obfuscate) mengganti nama identifier. Pada tahap akhir preverify menambahkan metadata yang diperlukan untuk verifikasi bytecode di mesin virtual.
Mari kita bahas secara detail masing-masing dari tiga fungsi utama ProGuard: kompresi, optimasi, dan obfuskasi. Memahami setiap mekanisme akan membantu mengonfigurasi alat secara optimal.
ProGuard menganalisis graf panggilan dari titik masuk (metode main, Activity, BroadcastReceiver) dan menghapus kode yang tidak digunakan. Dalam proyek Android tipikal dengan pustaka seperti Retrofit, OkHttp, dan Gson, kompresi dapat menghapus hingga 40% bytecode, termasuk metode pustaka yang tidak digunakan, kode debug, dan kelas pengujian. Ini secara langsung mengurangi ukuran APK dan mempersingkat waktu muat aplikasi.
Pada tahap optimasi, ProGuard melakukan lebih dari 20 transformasi bytecode yang berbeda: inlining metode pendek, penghapusan parameter yang tidak digunakan, penyederhanaan ekspresi logika, penggabungan blok kode yang identik. Misalnya, getter dan setter pendek dapat diganti dengan akses langsung ke field. Optimasi dapat mempercepat eksekusi kode sebesar 5-15% tergantung pada struktur aplikasi.
Obfuskasi di ProGuard bekerja dengan mengganti nama kelas, metode, dan field menjadi urutan karakter pendek: a, b, c, a.a, a.b dan seterusnya. Semua referensi ke elemen yang diganti nama secara otomatis diperbarui di seluruh kode. Penting untuk dicatat bahwa obfuskasi tidak mengubah perilaku program, hanya mempersulit pemahaman kode yang didekompilasi. Pustaka dan API publik harus dikecualikan dari obfuskasi melalui aturan keep.
// Sebelum obfuskasi ProGuard
public class LoginManager {
public User authenticateUser(String username, String password) {
// logika autentikasi
}
}
// Setelah obfuskasi ProGuard
public class a {
public Object a(String b, String c) {
// logika yang sama dengan identifier yang diganti nama
}
}
Konfigurasi ProGuard — tahap kritis dalam pengaturan build aplikasi Android. Aturan yang salah dapat menyebabkan penghapusan kelas yang diperlukan dan, akibatnya, crash di versi rilis.
Aktivasi ProGuard di proyek Android melibatkan pengaturan flag minifyEnabled menjadi true untuk tipe build rilis. Aturan standar ProGuard disertakan bersama Android SDK dalam file proguard-android-optimize.txt. Aturan kustom ditambahkan dalam file terpisah proguard-rules.pro. Saat build, ProGuard menerapkan aturan standar terlebih dahulu, kemudian aturan kustom, yang memungkinkan menimpa konfigurasi dasar.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
File aturan kustom berisi direktif yang spesifik untuk proyek tertentu. Aturan tipikal meliputi mempertahankan kelas yang digunakan melalui reflection, model data untuk serialisasi Gson/Moshi, antarmuka callback pustaka, dan kelas yang dianotasi dengan anotasi spesifik. Setiap direktif dimulai dengan kata kunci -keep, -dontwarn, atau -keepclassmembers dan mendefinisikan pola kelas yang tidak boleh diubah oleh ProGuard.
# Pertahankan model data untuk Gson
-keep class com.example.data.model.** { *; }
# Pertahankan kelas yang digunakan melalui reflection
-keep class * implements com.google.gson.TypeAdapterFactory
# Abaikan peringatan pustaka
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# Pertahankan enum (fitur ProGuard)
-keep class * extends java.lang.Enum { *; }
Tata bahasa konfigurasi ProGuard mencakup beberapa kategori direktif, yang masing-masing mengontrol aspek pemrosesan tertentu. Mari kita bahas yang utama, yang diperlukan untuk konfigurasi yang benar.
| Direktif | Tujuan | Contoh |
|---|---|---|
| -keep | Pertahankan kelas dan anggotanya sepenuhnya | -keep class com.example.MyClass |
| -keepclassmembers | Pertahankan hanya anggota kelas | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Abaikan peringatan | -dontwarn okhttp3.internal.** |
| -keepparameternames | Pertahankan nama parameter metode | -keepparameternames |
| -keepattributes | Pertahankan atribut (anotasi, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Nonaktifkan optimasi | -dontoptimize |
ProGuard tidak dapat menganalisis secara statis kode yang dimuat melalui reflection (Class.forName()), ServiceLoader, atau pemuatan dinamis file DEX. Jika kelas dibuat berdasarkan nama string, ProGuard tidak mengetahui keberadaannya dan dapat menghapusnya sebagai tidak digunakan. Semua kelas tersebut harus dipertahankan secara eksplisit melalui -keep. Ini adalah penyebab paling umum crash di build rilis setelah mengaktifkan ProGuard.
Pustaka sering menyertakan aturan ProGuard mereka sendiri, yang secara otomatis ditambahkan ke build melalui consumer-rules.pro, yang tertanam dalam file AAR. Android Gradle Plugin secara otomatis menerapkan aturan ini saat build. Pengembang hanya perlu memastikan bahwa semua pustaka yang digunakan menyediakan aturan yang benar, dan jika perlu, melengkapinya di proyek.
Saat terjadi kesalahan setelah mengaktifkan ProGuard, gunakan file mapping untuk deobfuskasi stack trace. Untuk diagnosis, gunakan kunci -whyareyoukeeping yang menunjukkan alasan mempertahankan kelas di build akhir. Penonaktifan sementara -optimizationpasses dan -obfuscation memungkinkan lokalisasi masalah. Menurut Guardsquare, 80% masalah dengan ProGuard diselesaikan dengan menambahkan aturan -keep untuk kelas reflection.
Dengan dirilisnya Android Gradle Plugin 3.4 (2019), Google memperkenalkan R8 — penerus ProGuard, yang terintegrasi langsung ke dalam kompiler D8/R8. Pada tahun 2023, R8 sepenuhnya menggantikan ProGuard di AGP 8.0, tetapi memahami perbedaan arsitektur penting untuk migrasi proyek.
ProGuard bekerja sebagai alat terpisah, memproses bytecode Java (file .class) sebelum konversi ke DEX. R8 terintegrasi ke dalam kompiler DEX dan memproses kode pada tingkat yang lebih rendah, yang memungkinkan optimasi yang tidak tersedia di ProGuard. R8 juga mendukung desugaring — konversi gula sintaksis Java 8+ menjadi kode yang kompatibel mundur untuk tingkat API Android lama.
Menurut Google Android Performance Team (2025), R8 memberikan kompresi kode 10-15% lebih baik dibandingkan dengan ProGuard dengan aturan yang sama. R8 lebih cepat — waktu build berkurang 20-30%. Selain itu, R8 menghapus lebih banyak kode mati berkat analisis di tingkat DEX, bukan file class. R8 sepenuhnya kompatibel dengan sintaks aturan ProGuard, yang membuat migrasi transparan bagi pengembang.
Peralihan dari ProGuard ke R8 sederhana: di AGP 8.0+ R8 digunakan secara default. Untuk proyek lama, Anda perlu menghapus ProGuard dari classpath dan memperbarui gradle.properties: android.enableR8=true. Aturan ProGuard kompatibel dengan R8 tanpa perubahan di sebagian besar kasus. Disarankan untuk menguji build rilis di semua perangkat target setelah peralihan, karena R8 dapat menghapus kode yang dipertahankan oleh ProGuard.
Pertanyaan yang Sering Diajukan
Penyebab paling umum — penghapusan kelas yang digunakan melalui reflection, serialisasi Gson/Moshi, atau pustaka dengan pemuatan dinamis file DEX. Solusi: tambahkan aturan -keep untuk semua kelas yang dibuat melalui Class.forName(), mengimplementasikan Parcelable, diserialisasi melalui JSON, atau dianotasi dengan @Inject. Gunakan file mapping untuk deobfuskasi stack trace dan mengidentifikasi kelas yang dihapus dari build.
File mapping berada di build/outputs/mapping/release/mapping.txt setelah build. Format: nama_asli -> nama_obfuska -> tipe. Android Studio mendukung deobfuskasi melalui Build > Analyze APK: muat APK, tempel stack trace, dan dapatkan nama kelas yang dapat dibaca. Untuk CI/CD, simpan file mapping untuk setiap versi di repositori terpisah atau penyimpanan cloud.
Ya, ProGuard hanya boleh diaktifkan untuk build rilis. Build debug menggunakan minifyEnabled false, yang mempercepat kompilasi dan mempertahankan nama kelas yang dapat dibaca untuk debugger. Dalam mode debug, obfuskasi mengganggu debugging dan eksekusi langkah demi langkah, sementara kompresi memperlambat iterasi. Untuk menguji kebenaran obfuskasi, gunakan build rilis pada perangkat fisik.
Peringatan ProGuard (WARNING) menunjukkan masalah yang tidak menghentikan build, tetapi dapat mengindikasikan potensi kesalahan eksekusi. Jika peringatan tidak menyebabkan crash, tambahkan -dontwarn untuk pustaka yang sesuai. Jika peringatan terkait dengan kelas yang hilang yang tidak digunakan di aplikasi, gunakan juga -dontwarn. Mengabaikan semua peringatan sekaligus tanpa analisis tidak disarankan.
ProGuard — alat gratis dengan fungsi dasar: kompresi, optimasi, penggantian nama kelas dan metode. DexGuard — produk komersial dari Guardsquare yang sama, yang menambahkan pengaburan aliran kontrol, enkripsi string dan sumber daya, perlindungan dari debugging, dan obfuskasi sumber daya. DexGuard digunakan di aplikasi perbankan dan game dengan persyaratan keamanan tinggi.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga