메인 콘텐츠로 건너뛰기

25% 이하의 구글 플레이 오버플로우를 Capacitor 앱에서 수정하세요

Capacitor 안드로이드 앱에서 R8를 활성화하고 사용하지 않는 DEX를 축소하여 릴리즈 앱 번들을 배포하여 25% 오버플로우 검사를 통과하세요.

기사 기여

마틴 도나디우

작가

발레리아

리뷰어

조던

편집자

Capacitor 앱에서 25% 이하의 Google Play 압축을 수정하십시오

Play 콘솔은 Capacitor 안드로이드 앱을 앱 최적화가 우리의 기준 이하입니다, 종종 압축 어느새 3%. Google은 최소한 25% 압축, 최적화 및 축소가 필요합니다. 시행은 2027년 2월에 시작됩니다 __CAPGO_KEEP_0__그리고 실패할 경우 가시성과 배포 옵션을 줄일 수 있습니다.

Android 비타일스에서 경고가 나타납니다.

Google Play 콘솔 Android 비타일스 경고가 3%의 암호화가 25%의 앱 최적화 임계값 아래에 있으며, 2027년 2월에 수정할 수 있습니다.

이것은 네이티브 Android DEX 문제입니다. 이것은 Vue, React, 또는 Angular 번들의 문제가 아닙니다. Capgo Capgo에 PR을 제출하는 경우

실시간 업데이트도 이 점수를 변경하지 않습니다. Android Gradle 릴리즈 빌드에서 수정한 후 새로운 앱 번들을 업로드해야 합니다.

Google Play가 측정하는 것은 무엇입니까? Google Play가 검사하는 것은 무엇입니까? in your Android App Bundle: compiled Java and Kotlin, including Capacitor, plugins, and AndroidX. From February 2027, apps with more than Android 앱 번들에 포함된 컴파일된 Java 및 Kotlin, __CAPGO_KEEP_0__ 포함, 플러그인, AndroidX, 2027년 2월 이후 10MB 이상의 DEX가 있는 앱은 __CAPGO_KEEP_0__ 25% 모두 세 가지에 대해:

지표 그것이 무엇을 의미하는지 낮은 점수를 받는 Capacitor의 일반적인 원인
가치가 감추어진다 클래스, 필드 및 메서드 이름이 짧은 이름으로 이름이 바뀌는 것 minifyEnabled 아직도 false
최적화 R8는 바이트코드를 인라인, 병합 및 재작성합니다 기본 proguard-android.txt 포함 -dontoptimize
축소 사용되지 않는 클래스와 메서드 제거 리소스/code 압축이 절대 안되게 설정되어 있습니다.

플레이가 읽는 r8.json 최신 안드로이드 그레이들 플러그인 8.10 이상 버전으로 빌드할 때 사용됩니다. 그렇지 않으면 mapping.txtDEX 힙틱스 사용합니다. Capacitor 앱은 압축이 꺼져 있는 경우 거의 매핑 파일이 없기 때문에 플레이가 읽을 수 있는 이름을 보고 몇 퍼센트의 압축을 보고합니다 (이미 압축된 라이브러리 AAR에서 남아 있는 경우가 많습니다). 그게 3% 체력 점수와 일치합니다.

공식 정책: 플레이 콘솔 기술 품질 요구 사항Implementation detail: DEX code 최적화 그리고 앱 최적화에 R8를 사용하도록 활성화합니다..

왜 Capacitor 앱이 이 검사를 통과하지 못하는가

Capacitor Android 템플릿은 여전히 릴리즈 빌드를 배포한다 without R8:

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

그것은 android-template/app/build.gradle에서 기본 설정이다 . 디버그 빌드는 그대로 두어야 하지만, 릴리즈 빌드는 Play에 배포할 경우 그렇지 않아야 한다JavaScript는 이미 Vite 또는 webpack으로 미니파이팅되어 있다. Play는 그것을 고려하지 않는다. native DEX 이름, 사용되지 않는 native __CAPGO_KEEP_0__, R8 최적화만 고려한다

Your JavaScript is already minified by Vite or webpack. Play does not count that. Only native DEX names, unused native code, and R8 optimizations count.

Open

(Groovy는 __CAPGO_KEEP_0__ 기본 설정이다)와 릴리즈를 변경하라 android/app/build.gradle Capacitor __CAPGO_KEEP_0__ block:

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

Kotlin DSL을 사용하는 모듈이면 세 가지 사항이 중요합니다:build.gradle.kts):

buildTypes {
    getByName("release") {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}

실제로 R8(R8 shrink + obfuscate + optimize)를 실행하는 것은 무엇인지

  1. minifyEnabled true Android 리소스 중 사용하지 않는 것을 제거합니다. 최소화가 필요합니다.
  2. shrinkResources true 이 R8 설정을 위해 사용하세요
  3. ships proguard-android-optimize.txt. proguard-android.txt R8 최적화를 차단하고 AGP 9에서 오류를 발생시킵니다. Play는 shrinker를 허용합니다. __CAPGO_KEEP_0__ 앱은 R8에 최적화 기본값을 사용해야 합니다. __CAPGO_KEEP_0__ Plugin AGP 9 Build Error Fix -dontoptimizeCapacitor 플러그인에 오래된 파일을 참조하는 경우 Capacitor Plugin AGP 9 Build Error Fix on

Do not set minifyEnabled true on debug. Release-only local runs speed up and stack traces are readable.

Step 2 — R8 full mode를 비활성화하지 마세요.

열기 android/gradle.properties 그리고 이 라인이 존재하는 경우 제거하세요:

android.enableR8.fullMode=false

AGP 8+ 이미 전체 모드를 활성화하고 있습니다. 그 플래그를 남겨두면 최적화가 제한됩니다.

또한 (그리고 추가적인) android/app/proguard-rules.pro 파일들)에서: -include 이 규칙들은 Play 점수를 낮추어 주며, __CAPGO_KEEP_0__ 플러그인 활성화 후에도 낮추어 주세요.

-dontobfuscate
-dontoptimize
-dontshrink
-keep class ** { *; }

Step 3 — __CAPGO_KEEP_0__ 플러그인만 유지하세요, 앱 전체는 제거하세요. minifyEnabledR8는 reflection metadata를 사용합니다. __CAPGO_KEEP_0__ 플러그인은 어노테이션을 통해 발견되므로, keep 규칙이 필요합니다.

Step 3 — Keep Capacitor plugins, not the whole app

R8 uses reflection metadata. Capacitor plugins are discovered by annotations, so they need keep rules. 일반적으로 그들을 직접 추가하지 않습니다. Capacitor 3.2.3 이후로 @capacitor/android 배송 소비자용 ProGuard 규칙 그것들을 유지하는 규칙

  • @CapacitorPlugin 클래스 @PluginMethod, 권한 및 활동 콜백
  • Legacy 클래스와 Cordova 플러그인 클래스를 상속하는 클래스 com.getcapacitor.Plugin
  • 현재 __CAPGO_KEEP_0__ 6/7/8 라인에 머물러 소비자 규칙이 적용되도록 합니다. @NativePlugin 추가 규칙을 추가합니다.

Capacitor

__CAPGO_KEEP_0__ android/app/proguard-rules.pro only release 빌드에서 재현할 수 있는 충돌만

# Good: one misbehaving plugin package
-keep class com.mycompany.myplugin.** { *; }

# Bad: this will tank obfuscation and shrinking
-keep class com.getcapacitor.** { *; }
-keep class ** { *; }

좁은 것이 넓은 것보다 낫다: Capgo plugin directory__CAPGO_KEEP_0__ 플러그인 디렉토리 Capgo Consulting __CAPGO_KEEP_0__ Consulting

Official Capacitor notes: Official __CAPGO_KEEP_0__ notes:.

Using ProGuard

Step 4 — Build a real release bundle

Debug APKs will still show ~0% obfuscation. Play only grades what you upload.

npm run build
npx cap sync android
cd android
./gradlew bundleRelease

Google Play의 암호화 release Without a .aabsigningConfig, 이 작업은 성공하지만 unsigned

을 내보냅니다. Android Studio에서 Play 업로드 전에 이 파일을 암호화하세요. Install a 릴리즈 APK./gradlew assembleRelease를 기기 ( app/build/outputs/apk/release/)에 설치하세요. 그 다음 .aab 의 APK는 Play 업로드 형식이 아니라, npx cap run android 로 설치합니다. 네이티브 플러그인 (카메라, 푸시, 파일, 결제, 인증)을 실행하세요. R8 버그는

디버그 세션에서 나타나지 않습니다. android/Gradle 명령어를 위에 수행한 후 (이제

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • On AGP 8.10 이상의 최신 패치에서, r8.json 앱 번들 내부에

그것들 release 폴더는 기본 Capacitor 버전입니다. 제품 플래버와 함께 매핑은 버전 이름 (mapping/freeRelease/) 아래에 있습니다. APK는 apk/<flavor>/release/ (예를 들어 apk/free/release/).

이것이 없으면 잘못된 버전 폴더에 있습니다. CI가 assemble한 mapping.txt 또는 R8가 debug로 실행한 경우입니다. 다시 확인하시고 -dontobfuscate와 규칙이 오버플로를 비활성화하지 않도록 하세요. minifyEnabled true on release and

5단계 — 충돌 보고서의 가독성을 유지하세요

압축된 스택 추적은 매핑 파일이 없으면 쓸모가 없습니다. mapping.txt 각 Play 버전마다

  • Play 콘솔: 테스트 및 출시 → 앱 번들 탐색기 → 다운로드 → 자산그 다음 업로드 mapping.txt 이미 첨부되어 있지 않다면
  • Firebase Crashlytics / Sentry: CI에서 동일한 매핑을 업로드하세요.

Android Studio / AGP는 매핑을 자산 탭에 종종 포함합니다. .aab그래도 최적화된 첫 번째 업로드 후에 자산 탭을 확인하세요.

6단계 — Play에 업로드 및 재 확인

새로운 .aab Google Play의 암호화 (obfuscation) - Capacitor Android

  1. Test 및 배포 → 앱 번들 탐색기 해당 버전
  2. DEX 크기와 암호화 / 최적화 / 축소율
  3. 모니터링 및 개선 → Android 비타리얼 새로운 버전이 Play에서 분석하는 것이 바로 그것입니다.

필요한 것은 각각 25% 세 가지 지표 중에서 암호화만이 아니라. proguard-android-optimize.txt R8를 활성화하면 일반적으로 Capacitor 앱이 단일 자릿수의 암호화에서 25% 이상의 모든 세 가지 지표로 뛰어올립니다.

Play에서만 강제합니다. DEX 크기가 10MB를 넘는 앱 (게임은 50MB) 에서 25%의 바닥을 생각합니다. 그 아래 바닥보다도 그만큼 중요합니다: 더 작은 DEX, 더 적은 메모리, 더 빠른 시작.

25% 이하의 경우 여전히 적용됩니다.

R8이 켜져 있지만 Play (또는 로컬 분석기)가 약한 점수를 보여주고 있습니다. 일반적으로 남아 있는 broaden keep 규칙입니다.

  1. 열기 R8 구성 분석기 Android Gradle Plugin이 9.3 이상인 경우 — assembleRelease 그런 다음 writes configanalyzer.html 다음에 mapping.txt9.2 미만의 AGP 버전의 경우 HTML 파일을 건너뛰고 대신 mapping.txtAPK 분석기, Play의 앱 번들 탐색기
  2. keep 규칙을 앱이 얼어붙이는 정도로 정렬합니다. 라이브러리 소비자 규칙은 편집할 수 없습니다. 앱 수준은 그렇지 않습니다. -keep class com.foo.** { *; } 열기
  3. Android Studio APK 분석기 열기 .aab Android Studio APK 분석기에서 대형 .dex Android Studio APK 분석기에서 대형 파일을 선택하고, 해제된 이름을 토글합니다 (해제된 이름이 필요합니다). mapping.txt패키지 크기가 여전히 큰 패키지는 전량 폐기해야 합니다.
  4. 업데이트 플러그인에서 여전히 참조하는 proguard-android.txt이 파일은 AGP 9에서 최적화에 장애를 일으키며, 이전 플러그인에서 경고를 표시합니다.

DEX를 minifyEnabled false 와 희소성 알고리즘을 사용하여 축소하는 것은 점수를 낮추는 것입니다. Play는 축소, 최적화 및 을 원합니다. 이것은

을 대체하지 않습니다.

  • 이것은 자바스크립트 압축을 대체하지 않습니다. in vite.config.ts 이 메트릭이 움직이지 않습니다.
  • Capgo 실시간 업데이트 __CAPGO_KEEP_0__ HTML/JS/CSS를 배달합니다. DEX를 재구성하지 않습니다. 스토어 바이너리에 R8이 활성화된 후, 여전히 오버어어 항공 JS 수정을 배달할 수 있습니다. 오버플로 체크 자체는 1개의 네이티브 플레이 업로드가 필요합니다.
  • 16 KB 페이지 크기 이것은 별도의 플레이 네이티브 요구 사항입니다. Android 16 KB 페이지 크기.

이미 Android를 다음으로 빌드하고 있다면 Capgo 빌드, android/app/build.gradle 리포지토리에 있는 GitHub Actions Android 빌드: workflow를 구성해야 합니다. 릴리스, 디버그가 아닙니다.

FAQ

R8를 활성화하면 Capacitor 플러그인을 깨뜨릴까요?

그렇다면, 플러그인이 reflection을 사용하고 consumer keep 규칙을 제공하지 않는다면 그렇습니다. Core Capacitor는 이미 플러그인 클래스를 유지합니다. 릴리스 빌드를 테스트하세요. 플러그인이 깨지는 패키지에 대해 narrow keep 규칙만 추가하세요. 플러그인이 유지보수가 되지 않는다면, Capacitor Consulting은 이를 fork하고 유지할 수 있습니다. narrow 플러그인이 유지보수가 되지 않는다면, __CAPGO_KEEP_0__ Consulting은 이를 fork하고 유지할 수 있습니다. Capgo Consulting 릴리스 빌드에 대한 확인을 통과했는지 증명할 수 있나요?

FAQ npx cap run FAQ

아니요. 그 명령은 R8이 꺼져 있는 디버그 빌드로 사용합니다. bundleRelease / signed Play 업로드를 사용하세요.

우리는 이미 minifyEnabled true 를 설정했는데도 불구하고 3%를 보게 됩니다. 왜일까요?

에서 -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false를 검색하세요. -keep 규칙을 확인하세요. CI가 최소화된 AAB를 업로드했는지, 아니면 이전 버전의 아티팩트를 업로드했는지 확인하세요.

R8 대신 ProGuard가 필요합니까?

아니요. R8은 Android Gradle Plugin shrinker입니다. ProGuard-style 규칙 파일을 읽습니다. Google의 Play 문서에서는 어떤 shrinker도 허용합니다. R8은 Capacitor 앱이 사용해야 하는 shrinker입니다.

체크리스트

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt (아니요 proguard-android.txt)
  • 아니요 -dontobfuscate / -dontoptimize / 앱 전체 -keep class **
  • Capacitor 3.2.3+ 소 플러그인 소비자 규칙이 적용됩니다.
  • 릴리즈 빌드가 생성합니다. mapping.txt
  • 릴리즈 설치에 테스트 된 네이티브 플러그인
  • 새로운 .aab 페이지/영역: Live updates 제품 페이지. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. 메시지 키 `live_update_lts_electron_new` (Live Update Lts Electron New).
  • 업로드 된 매핑이 앱 번들 탐색기에서 첨부됩니다.

That is the whole Play Console warning: Capacitor left R8 off, Play started scoring DEX, and a one-line release Gradle change plus a store upload is the fix.

그것이 바로 플레이 콘솔 경고입니다: Capacitor이 R8을 비활성화하고 플레이가 DEX 점수를 시작했으며 한 줄의 릴리즈 그라드 변경과 스토어 업로드가 해결책입니다.

__CAPGO_KEEP_0__ 앱에서 25% 이하의 플레이 오브프ュ전션을 수정하는 방법을 계속 진행하세요. Capacitor 앱에서 25% 이하의 플레이 오브프ュ전션을 수정하는 방법을 계속 진행하세요. __CAPGO_KEEP_0__ 앱에서 25% 이하의 플레이 오브프ュ전션을 수정하는 방법을 계속 진행하세요. Capgo Native Builds 릴리즈 앱 번들에 대해 Capgo CI/CD 업로드 PIPELINE에 대해 CI/CD 통합 implementation detail에 대해 자동 Capacitor Android 빌드와 GitHub 액션 자체 호스팅 PIPELINE에 대해, 그리고 Capgo 컨설팅 R8가 활성화된 후 플러그인이 깨질 경우

Capacitor 앱의 Google Play 오류를 25% 이하로 유지하세요. 다음 단계로 진행하세요.

Capgo 대신에 앱 스토어 승인 대기 없이 Capgo을 통해 버그를 수정하세요. 사용자는 배경에서 업데이트를 받으며 네이티브 변경 사항은 일반적인 검토 경로에 남습니다.

마틴의 인간 지원

시작하기

최신 블로그

Capgo은 전문적인 모바일 앱을 만들기 위해 필요한 최고의 통찰력을 제공합니다.