Skip to content

[GMSS-326]release 빌드에 R8 난독화 적용 - #76

Merged
seunghee17 merged 2 commits into
developfrom
fix/enable-r8-obfuscation-GMSS-326
Nov 3, 2026
Merged

seunghee17 merged 2 commits into
developfrom
fix/enable-r8-obfuscation-GMSS-326

Conversation

@soyeonLee126

Copy link
Copy Markdown
Collaborator

작업 개요

Play Console에서 "DEX 코드 최적화가 기준점 미만입니다. 난독화(3%)" 경고를 받았습니다. 난독화 비율이 25% 미만이면 앱 공개 상태와 게시 기능이 영향을 받을 수 있고, 해결 기한은 2027년 2월입니다.
release buildType이 isMinifyEnabled = false로 설정되어 있어 R8이 전혀 적용되지 않은 것이 원인이었습니다. release에 R8 축소와 난독화를 켜고, 실기기 검증 중 확인된 문제에 필요한 keep 규칙을 추가했습니다.

작업 유형

  • feat: 새 기능
  • fix: 버그 수정
  • refactor: 리팩토링 (동작 변경 없음)
  • build: 빌드/의존성 설정
  • chore: 기타 (문서, 설정 등)
  • test: 테스트 추가/수정

변경 사항

  • app/build.gradle.kts: release에 isMinifyEnabled, isShrinkResources, proguardFiles(proguard-android-optimize.txt, proguard-rules.pro)를 설정했습니다.
  • app/proguard-rules.pro를 추가했습니다.
    • SourceFile, LineNumberTable을 유지해 Crashlytics 스택트레이스를 mapping으로 복원할 수 있게 했습니다.
    • -keep class * extends androidx.room.RoomDatabase { <init>(); }: WorkManager 2.9.1이 함께 가져오는 Room 2.5의 consumer rule은 생성자를 지정하지 않습니다. 그래서 R8 full mode에서 WorkDatabase_Impl.<init>()이 제거되고, 앱 시작 시 Failed to create an instance of class androidx.work.impl.WorkDatabase 크래시가 났습니다. 앱 DB는 room3이라 이 규칙의 대상이 아닙니다.
    • ai.onnxruntime.**, org.tensorflow.lite.** 전체 keep: 두 라이브러리는 네이티브 코드가 JNI로 자바 클래스를 이름으로 찾습니다. onnxruntime-android에는 consumer rule이 없고 LiteRT는 @UsedByReflection 대상만 유지해서, 규칙이 없으면 OrtException, OnnxJavaType, Tensor 등의 이름이 바뀝니다.
  • internal buildType은 initWith(release)라서 R8 축소가 함께 적용됩니다. isDebuggable = true라 R8이 DEBUG 모드로 동작해 이름 난독화는 대부분 적용되지 않습니다. 테스터 빌드를 배포본과 가깝게 유지하려고 그대로 두었습니다. Crashlytics mapping 업로드 태스크(uploadCrashlyticsMappingFileInternal)가 실행되는 것을 확인했습니다.

관련 이슈

  • 없음

관련 작업 (Notion)

스크린샷 / 동작 화면

없음

난독화 비율 (로컬 :app:bundleRelease 결과물의 mapping 기준)

기준 비율
전체 클래스 86.1% (7,945/9,226)
앱 코드(com.gamss) 클래스 99.4% (789/794)
메서드 74.8%

Play Console이 계산하는 단위는 공개되어 있지 않아 콘솔 수치와 같다고 보장할 수는 없습니다. 다만 어느 기준으로도 25%를 넘습니다. mapping은 AAB의 BUNDLE-METADATA/com.android.tools.build.obfuscation/proguard.map에 포함됩니다.

실기기 검증 (SM-S937N, Android 16)

release와 같은 R8 조건(isDebuggable = false)으로 만든 internal APK를 설치해 확인했습니다. Google 로그인을 위해 검증 빌드에서만 applicationId를 .dev로 바꿨습니다.

  • 앱 시작, Google 로그인(Credential Manager), 홈 화면
  • 대화 전송과 캐릭터 응답(Retrofit, kotlinx.serialization)
  • 감정 분류(LiteRT): libLiteRt.so 로드, Interpreter와 XNNPACK delegate 생성, 분류 결과로 카드 캐릭터 결정
  • 일기 요약(onnxruntime): libonnxruntime4j_jni.so 로드, 요약 결과로 카드 생성
  • 보관함 탭에서 프로세스를 종료한 뒤 최근 앱에서 복귀했을 때 보관함 탭으로 복원(Navigation3 NavKey 복원)

전 과정에서 크래시는 없었습니다.

체크리스트

  • base 브랜치가 develop으로 설정되어 있다
  • 로컬 빌드 및 실행을 확인했다
  • 커밋 메시지가 컨벤션(feat:, fix: 등)을 따른다
  • 불필요한 로그/주석/디버그 코드를 제거했다
  • 리뷰어가 이해할 수 있도록 설명을 작성했다

리뷰 요청 사항

아래 경로는 R8 적용 상태로 확인하지 못했습니다. 머지 후 첫 release 빌드에서 확인이 필요합니다.

  • release의 Play Asset Delivery 모델 다운로드 경로. internal은 모델을 APK assets에 넣어서 이 경로를 거치지 않습니다. Play 내부 테스트 트랙에서 모델 다운로드와 추론을 한 번 확인해 주시면 좋겠습니다.
  • 앱이 백그라운드일 때 FCM notification 페이로드로 표시되는 알림. 서버가 아이콘이나 사운드를 리소스 이름으로 보내면 shrinkResources로 제거될 수 있습니다. 서버 페이로드는 확인하지 못했습니다.
  • PR CI(assembleRelease assembleInternal)에서 R8이 두 번 실행되어 빌드 시간이 늘어납니다.

@seunghee17
seunghee17 merged commit e2102f7 into develop Nov 3, 2026
6 checks passed
@seunghee17
seunghee17 deleted the fix/enable-r8-obfuscation-GMSS-326 branch November 3, 2026 09:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants