Langsung ke konten utama

Atasi Obfuscation Google Play di Bawah 25% pada Aplikasi Capacitor

Lolos pengecekan obfuscation 25% Google Play di aplikasi Capacitor Android dengan mengaktifkan R8, mengecilkan DEX yang tidak terpakai, dan mengirimkan App Bundle rilis.

Capgo blog graphic: Perbaiki obfuscation Google Play di bawah 25% pada aplikasi Capacitor, dengan kartu Android vitals yang menunjukkan 3% obfuscation dan R8 minifyEnabled mencapai 25 persen

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:

Peringatan Android vitals di Google Play Console menunjukkan obfuscation sebesar 3 persen, di bawah ambang batas optimasi aplikasi 25 persen, dengan batas perbaikan Februari 2027

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:

  1. minifyEnabled true adalah yang sebenarnya menjalankan R8 (shrink + obfuscate + optimize).
  2. shrinkResources true menghapus resource Android yang tidak terpakai. Ini memerlukan minification.
  3. Untuk setup R8 ini, gunakan proguard-android-optimize.txt. proguard-android.txt dikirim, -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:

  • @CapacitorPlugin class, @PluginMethod, callback permission dan activity
  • Kelas yang memperluas com.getcapacitor.Plugin
  • Legacy @NativePlugin dan 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.txt
  • app/build/outputs/mapping/release/configuration.txt
  • Pada patch terbaru AGP 8.10 atau lebih tinggi, r8.json di 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.txt jika 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:

  1. Uji dan rilis → App bundle explorer untuk versi tersebut
  2. ukuran DEX ditambah persentase obfuscation / optimization / shrinking
  3. 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.

  1. Buka Penganalisis Konfigurasi R8 jika Android Gradle Plugin Anda 9.3 atau lebih baru — assembleRelease lalu menulis configanalyzer.html di sebelah mapping.txt. Pada AGP 9.2 ke bawah, lewati file HTML tersebut dan gunakan mapping.txt, APK Analyzer, dan Play’s App bundle explorer sebagai gantinya.
  2. 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.
  3. Buka .aab di Android Studio APK Analyzer, pilih .dex file, dan aktifkan deobfuscated names (butuh mapping.txt). Package yang tetap besar dan terbaca adalah package yang harus berhenti di-keep secara keseluruhan.
  4. 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.ts tidak 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 (bukan proguard-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 .aab diunggah; 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.

Live updates untuk aplikasi Capacitor

Saat bug web-layer sudah live, kirim perbaikannya lewat Capgo alih-alih menunggu berhari-hari untuk persetujuan app store. Pengguna mendapat update di background, sementara perubahan native tetap mengikuti jalur review normal.

Terbaru dari Blog kami

Capgo memberikan insight terbaik yang Anda butuhkan untuk membuat aplikasi mobile yang benar-benar profesional.