본문 바로가기
추천시스템 앱 개발/오류

[Flutter/Android 오류] R8 - missing_rules

by 직_장인 2024. 1. 20.

1. 오류 내용

ERROR: Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in ~/build/app/outputs/mapping/release/missing_rules.txt.

 

R8이라는 Andorid 앱 최적화 과정에서 클래스가 누락되어 발생하는 오류이다.

 

ERROR: R8: Missing class com.google.android.gms.safetynet.SafetyNet (referenced from: void com.google.firebase.appcheck.safetynet.internal.SafetyNetAppCheckProvider.lambda$initSafetyNetClient$0(com.google.android.gms.common.GoogleApiAvailability, android.content.Context, com.google.android.gms.tasks.TaskCompletionSource))

Missing class com.google.android.gms.safetynet.SafetyNetApi$AttestationResponse (referenced from: com.google.android.gms.tasks.Task com.google.firebase.appcheck.safetynet.internal.SafetyNetAppCheckProvider.exchangeSafetyNetAttestationResponseForToken(com.google.android.gms.safetynet.SafetyNetApi$AttestationResponse) and 1 other context)

Missing class com.google.android.gms.safetynet.SafetyNetClient (referenced from: com.google.android.gms.tasks.Task com.google.firebase.appcheck.safetynet.internal.SafetyNetAppCheckProvider.getToken() and 2 other contexts)

 

이어진 오류에는 이렇게 써있었다.

 

요약하면 R8과정에서

com.google.android.gms.safetynet.SafetyNet,

com.google.android.gms.safetynet.SafetyNetApi$AttestationResponse, com.google.android.gms.safetynet.SafetyNetClient

클래스를 찾을 수 없다는 것.

 

R8은 Android 애플리케이션의 코드 축소, 난독화(애플리케이션의 코드를 해석하기 어렵게 만들어 보안을 강화) 및 최적화를 위한 도구다. ProGuard의 대안으로 개발되었으며, Android Gradle 플러그인에서 기본적으로 사용된다.
때로는 사용자가 직접 R8의 동작을 제어하기 위해 keep 규칙을 추가해야 할 수도 있다.

 

 

2. 해결방법

2-1. gradle.properties 메모리 사용량 조정

org.gradle.jvmargs=-Xms2048m -Xmx4096m

이 코드를 추가하면, Gradle 빌드 중 최소 2048MB에서 최대 4096MB까지 증가하도록 설정된다.

 

2-2. Proguard-rules.pro 수정

~/build/app/outputs/mapping/release/missing_rules.txt 경로로 들어가서 해당 파일을 열어보면,

- dontwarm ~~~ 이렇게 써있는게 보일 것이다.

이 내용을 복사한다.

그리고 andorid/app/proguard-rules.pro 파일을 찾아서 복사한 내용을 붙여넣기 한다.

 

terminal에서 Android 폴더로 경로를 맞춘 후 아래 코드로 프로젝트를 재시작한다.

./gradlew clean
./gradlew build

 

 

댓글