Play Console kini menandai aplikasi Capacitor Android karena Optimasi aplikasi di bawah ambang batas kami, sering kali dengan Obfuscation masih ada 3%. Google mewajibkan minimal 25% obfuscation, optimization, dan shrinking. Aturan ini berlaku mulai Februari 2027, dan jika tidak dipenuhi, visibilitas serta opsi publikasi bisa berkurang.
Peringatan di Android vitals terlihat seperti ini:

Ini adalah masalah native Android DEX. Ini bukan masalah pada bundle Vue, React, atau Angular Anda. Capgo Live Update juga tidak akan mengubah skor ini. Anda harus memperbaikinya di Android Gradle release build, lalu upload App Bundle yang baru.
Apa yang diukur Google
Google Play memeriksa DEX di Android App Bundle Anda: Java dan Kotlin yang sudah dikompilasi, termasuk Capacitor, plugin, dan AndroidX. Mulai Februari 2027, aplikasi dengan lebih dari 10 MB dari DEX harus mencapai 25% pada ketiga poin ini:
| Metrik | Apa artinya | Penyebab umum skor rendah pada Capacitor |
|---|---|---|
| Obfuscation | Nama class, field, dan method diubah menjadi nama pendek | minifyEnabled masih false |
| Optimization | R8 melakukan inline, merge, dan rewrite bytecode | Default proguard-android.txt mencakup -dontoptimize |
| Shrinking | Class dan method yang tidak terpakai dihapus | Shrinking Resource/code tidak pernah diaktifkan |
Play membaca r8.json saat Anda build dengan patch terbaru Android Gradle Plugin 8.10 atau lebih tinggi. Jika tidak, ia menggunakan mapping.txt, lalu heuristik DEX. App Capacitor yang dirilis dengan minification mati hampir tidak punya mapping file, sehingga Play melihat nama yang terbaca dan melaporkan persentase obfuscation rendah (seringkali sisa dari library AAR yang sudah di-obfuscate). Hal ini sesuai dengan 3% skor vitals.
Kebijakan resmi: Persyaratan kualitas teknis Play Console. Detail implementasi: Optimasi DEX code dan aktifkan optimasi aplikasi dengan R8.
Why Capacitor apps fail this check
Template Android Capacitor masih mengirimkan release build tanpa R8:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Itu adalah default di android-template/app/build.gradle. Debug build harus tetap seperti ini. Release build tidak boleh, jika Anda mempublikasikannya ke Play.
JavaScript Anda sudah di-minify oleh Vite atau webpack. Play tidak menghitung itu. Hanya nama native DEX, code native yang tidak terpakai, dan optimasi R8 yang dihitung.
Langkah 1 — Aktifkan R8 untuk release
Buka android/app/build.gradle (Groovy adalah Capacitor default) dan ubah bagian release block:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Jika modul menggunakan Kotlin DSL ("build.gradle.kts):
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
Tiga detail ini penting:
minifyEnabled trueadalah yang sebenarnya menjalankan R8 (shrink + obfuscate + optimize).shrinkResources truemenghapus resource Android yang tidak terpakai. Ini memerlukan minification.- Untuk setup R8 ini, gunakan
proguard-android-optimize.txt.proguard-android.txtdikirim,-dontoptimizeyang memblokir optimasi R8 dan menyebabkan AGP 9 gagal. Play mengizinkan shrinker apa pun; aplikasi Capacitor sebaiknya menggunakan R8 dengan default optimize. Lihat Fix Error Build Plugin AGP 9 di Capacitor apakah plugin masih mereferensikan file lama tersebut.
Jangan atur minifyEnabled true aktif debug. Mode release-only menjaga kecepatan run lokal dan stack trace tetap mudah dibaca.
Langkah 2 — Jangan matikan R8 full mode
Buka android/gradle.properties dan hapus baris ini jika ada:
android.enableR8.fullMode=false
AGP 8+ sudah mengaktifkan full mode. Membiarkan flag tersebut justru membatasi optimasi.
Cari juga android/app/proguard-rules.pro (dan file tambahan -include lainnya) untuk:
-dontobfuscate
-dontoptimize
-dontshrink
-keep class ** { *; }
Aturan tersebut akan membuat skor Play tetap rendah meski Anda sudah mengubah minifyEnabled. Hapus aturan tersebut kecuali Anda punya alasan sementara yang terdokumentasi.
Langkah 3 — Pertahankan plugin Capacitor, bukan seluruh app
R8 menggunakan metadata refleksi. Plugin Capacitor dideteksi melalui anotasi, jadi butuh keep rules. Biasanya Anda tidak perlu menambahkannya sendiri. Sejak Capacitor 3.2.3, @capacitor/android ships aturan ProGuard consumer untuk menjaga:
@CapacitorPluginclass,@PluginMethod, callback permission dan activity- Kelas yang memperluas
com.getcapacitor.Plugin - Legacy
@NativePlugindan kelas plugin Cordova
Tetap gunakan Capacitor 6/7/8 agar aturan consumer tersebut tetap diterapkan.
Tambahkan aturan ekstra di android/app/proguard-rules.pro saja untuk crash yang bisa direproduksi di release build. Lebih spesifik lebih baik:
# Good: one misbehaving plugin package
-keep class com.mycompany.myplugin.** { *; }
# Bad: this will tank obfuscation and shrinking
-keep class com.getcapacitor.** { *; }
-keep class ** { *; }
Jika plugin pihak ketiga masih crash setelah menerapkan aturan keep tertentu, perbarui plugin tersebut, lalu pertimbangkan alternatif yang lebih terawat dari direktori plugin Capgo, atau tanyakan Konsultasi Capgo untuk memperbaikinya.
Catatan resmi Capacitor: Menggunakan ProGuard.
Langkah 4 — Build bundle release yang sebenarnya
APK Debug akan tetap menunjukkan ~0% obfuscation. Play hanya menilai apa yang Anda upload.
Dari root proyek:
npm run build
npx cap sync android
cd android
./gradlew bundleRelease
Tanpa release signingConfig, task ini tetap berhasil tetapi menghasilkan file unsigned .aab. Sign file tersebut di Android Studio sebelum upload ke Play.
Instal rilis APK pada perangkat (./gradlew assembleRelease, lalu APK ada di bawah app/build/outputs/apk/release/). Sebuah .aab adalah format upload Play, bukan untuk sideload. Tes plugin native (camera, push, file, billing, auth). Bug R8 tidak akan muncul di npx cap run android sesi debug.
Setelah perintah Gradle di atas (Anda berada di android/), pastikan R8 benar-benar berjalan:
app/build/outputs/mapping/release/mapping.txtapp/build/outputs/mapping/release/configuration.txt- Pada patch terbaru AGP 8.10 atau lebih tinggi,
r8.jsondi dalam App Bundle
Folder-folder release adalah varian Capacitor default. Dengan product flavors, mapping ada di bawah nama varian ("mapping/freeRelease/"). APK ada di bawah apk/<flavor>/release/ (contohnya apk/free/release/).
Jika mapping.txt hilang, Anda berada di folder varian yang salah, CI merakit debug, atau R8 dijalankan dengan -dontobfuscate. Periksa kembali minifyEnabled true aktif release dan pastikan aturan keep tidak menonaktifkan obfuscation.
Langkah 5 — Jaga crash report tetap terbaca
Stack trace yang terobfuskasi tidak berguna tanpa file mapping. Simpan mapping.txt untuk setiap versi Play:
- Play Console: Uji dan rilis → App bundle explorer → Downloads → Assets, lalu upload
mapping.txtjika belum terpasang. - Firebase Crashlytics / Sentry: upload mapping yang sama sebagai bagian dari CI.
Android Studio / AGP sering kali menyematkan mapping di dalam .aab. Tetap verifikasi tab Assets setelah upload optimasi pertama.
Langkah 6 — Upload dan cek ulang di Play
Upload yang baru .aab ke track pengujian internal (tidak perlu ke production untuk memperbarui skor). Buka:
- Uji dan rilis → App bundle explorer untuk versi tersebut
- ukuran DEX ditambah persentase obfuscation / optimization / shrinking
- Pantau dan tingkatkan → Android vitals setelah versi baru dianalisis oleh Play
Anda perlu 25% on each dari ketiga metrik, bukan hanya obfuscation. Mengaktifkan R8 dengan proguard-android-optimize.txt biasanya melonjakkan aplikasi Capacitor dari obfuscation satu digit menjadi jauh di atas 25% pada ketiganya.
Hanya Play menerapkan batas minimum 25% saat DEX di atas 10 MB untuk aplikasi (50 MB untuk game). Meski di bawah batas itu, memperbaikinya tetap layak: DEX lebih kecil, hemat memori, startup lebih cepat.
Jika Anda masih di bawah 25%
R8 sudah aktif, tapi Play (atau analyzer lokal) masih menunjukkan skor rendah. Aturan keep yang terlalu luas biasanya jadi penyebabnya.
- Buka Penganalisis Konfigurasi R8 jika Android Gradle Plugin Anda 9.3 atau lebih baru —
assembleReleaselalu menulisconfiganalyzer.htmldi sebelahmapping.txt. Pada AGP 9.2 ke bawah, lewati file HTML tersebut dan gunakanmapping.txt, APK Analyzer, dan Play’s App bundle explorer sebagai gantinya. - Urutkan aturan keep berdasarkan seberapa banyak bagian app yang dibekukan. Aturan library consumer yang tidak bisa diedit itu normal. Aturan level app
-keep class com.foo.** { *; }tidak normal. - Buka
.aabdi Android Studio APK Analyzer, pilih.dexfile, dan aktifkan deobfuscated names (butuhmapping.txt). Package yang tetap besar dan terbaca adalah package yang harus berhenti di-keep secara keseluruhan. - Update plugin yang masih mereferensikan
proguard-android.txt. File tersebut menghambat optimasi pada AGP 9 dan menjadi tanda bahaya pada plugin lama.
Jangan "perbaiki" skor rendah dengan memperkecil DEX menggunakan minifyEnabled false dan berharap heuristiknya berubah. Play menginginkan pengecilan ukuran dan optimasi, dan obfuskasi.
Yang tidak digantikan oleh ini
- Minifikasi JavaScript di
vite.config.tstidak akan mengubah metrik ini. - Live updates Capgo mengirim HTML/JS/CSS. Mereka tidak membangun ulang DEX. Setelah R8 aktif pada biner di store, Anda tetap bisa mengirim perbaikan JS via Live Update. Pengecekan obfuscation itu sendiri memerlukan satu kali upload native Play.
- Ukuran halaman 16 KB adalah persyaratan native Play yang terpisah. Lihat Ukuran page 16 KB Android.
Jika Anda sudah build Android dengan Build Capgo, ubah android/app/build.gradle di repo. Cloud build berikutnya akan memakai R8. Anda tidak perlu pipeline Play yang berbeda, cukup binary release yang di-build dengan minification aktif. Sama halnya jika Anda tetap menggunakan GitHub Actions build Android: workflow harus meng-assemble release, bukan debug.
FAQ
Apakah mengaktifkan R8 akan merusak plugin Capacitor saya?
Bisa saja, jika plugin menggunakan reflection dan tidak menyertakan consumer keep rules. Core Capacitor sudah mempertahankan class plugin. Uji release build. Tambahkan persempit pertahankan rule hanya untuk package yang crash. Jika plugin tidak di-maintain, Konsultasi Capgo bisa fork dan pastikan tetap bisa di-build.
Apakah npx cap run membuktikan saya lolos pengecekan?
Tidak. Perintah itu menggunakan debug build dengan R8 nonaktif. Gunakan bundleRelease / upload Play yang sudah di-sign.
Kami sudah mengatur minifyEnabled true dan masih melihat 3%. Mengapa?
Cari -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false, dan menyeluruh -keep rules. Pastikan CI mengunggah AAB yang sudah di-minify, bukan artefak lama.
Apakah kita butuh ProGuard alih-alih R8?
Tidak. R8 adalah shrinker Android Gradle Plugin. Ia membaca file rule gaya ProGuard. Dokumentasi Play Google mengizinkan shrinker apa pun; R8 adalah yang sebaiknya digunakan aplikasi Capacitor.
Checklist
-
release { minifyEnabled true; shrinkResources true } -
proguard-android-optimize.txt(bukanproguard-android.txt) - Tidak
-dontobfuscate/-dontoptimize/ seluruh aplikasi-keep class ** - Capacitor 3.2.3+ agar rule consumer plugin berlaku
- Release build menghasilkan
mapping.txt - Plugin Native sudah dites pada instalasi release
- Baru
.aabdiunggah; mapping terlampir di App bundle explorer - Obfuscation, optimasi, dan shrinking masing-masing 25%+
Itulah isi peringatan Play Console: Capacitor mematikan R8, Play mulai menghitung DEX, dan solusinya cukup ubah satu baris Gradle lalu upload ulang ke store.
Lanjutkan dari Cara Mengatasi Obfuscation Google Play di Bawah 25% pada Capacitor Apps
Jika Anda menggunakan Atasi Obfuscation Google Play di Bawah 25% pada Aplikasi Capacitor untuk merencanakan rilis Android store, hubungkan dengan Capgo Native Build untuk rilis App Bundles, CI/CD Capgo untuk pipeline upload, Integrasi CI/CD untuk detail implementasi, Build Android Capacitor otomatis dengan GitHub Actions untuk pipeline self-hosted, dan Konsultasi Capgo jika ada plugin yang error setelah R8 diaktifkan.