아티클 목록으로 가기

R8 모드와 안드로이드 애플리케이션에 미치는 영향

skydovesJaewoong Eum (skydoves)||5분 소요

R8 모드와 안드로이드 애플리케이션에 미치는 영향

R8은 안드로이드 애플리케이션의 기본 코드 축소기(code shrinker)이자 최적화기, 난독화 도구입니다. APK 크기를 줄이고 런타임 성능을 높이는 데 핵심적인 역할을 합니다. R8은 ProGuard의 드롭인 대체품(drop-in replacement)으로 설계되었지만, 한층 강화된 최적화로 인해 미묘한 동작 변화가 발생할 수 있습니다. 이를 관리하기 위해 R8은 **호환 모드(compatibility mode)**와 풀 모드(full mode) 두 가지 모드로 운영됩니다.

이 글에서는 두 모드 사이의 차이점을 살펴보겠습니다. 특히 풀 모드의 공격적 최적화와, Gson이나 Retrofit처럼 리플렉션에 크게 의존하는 라이브러리를 사용할 때 반드시 수행해야 하는 설정 조정에 초점을 맞춥니다. 실제 프로젝트에서 R8 풀 모드를 활성화한 뒤 런타임 크래시를 경험해 보신 분이라면, 이 글에서 다루는 문제 해결 패턴이 도움이 되실 것입니다.

R8 호환 모드: 안전한 기본 설정

기본적으로 Android Gradle Plugin은 R8을 호환 모드로 실행합니다. 이 모드는 ProGuard에서 원활하게 전환할 수 있도록 설계되었습니다. 보수적인 최적화 세트를 적용하며, R8의 보다 공격적인 기능 일부를 의도적으로 비활성화하여 기존 ProGuard 설정이 깨질 위험을 최소화합니다. 호환 모드의 핵심 목표는 ProGuard에서 정상적으로 동작하던 코드가 R8에서도 최소한의 변경만으로 그대로 동작하도록 보장하는 것입니다. 덕분에 가파른 학습 곡선 없이도 성능 개선과 코드 크기 감소라는 즉각적인 이점을 누릴 수 있습니다.

기존 ProGuard 규칙을 대량으로 보유한 대규모 프로젝트에서는 이 호환 모드가 안정적인 출발점이 됩니다. 기존 규칙을 일일이 재검토하지 않아도 R8으로 마이그레이션할 수 있기 때문입니다.

R8 풀 모드: 공격적 최적화

R8의 최대 이점을 활용하려면 gradle.properties 파일에 android.enableR8.fullMode=true를 추가하여 풀 모드를 활성화할 수 있습니다. 이 모드에서는 R8의 가장 강력한 최적화가 적용되지만, 런타임에 코드가 어떻게 사용될지에 대해 더 적은 가정을 합니다. 결과적으로 더 작고 빠른 앱을 만들 수 있지만, R8이 사용되고 있음을 증명할 수 없는 코드는 모두 제거하기 때문에 더 명시적이고 정밀한 -keep 규칙이 필요합니다.

이 아티클은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 아티클의 전체 내용을 볼 수 있습니다.

구독하기
아티클 목록으로 가기