ckgod.github Help

Q30) R8 최적화

R8 최적화란 무엇인가요?

R8은 Android 빌드 프로세스에서 사용되는 코드 축소 및 최적화 도구로, APK 또는 AAB의 크기를 줄이고 런타임 성능을 향상시킵니다.

R8은 이전의 ProGuard 도구를 대체하며, Android 빌드 시스템에 원활하게 통합되어 코드 축소, 최적화, 난독화리소스 관리를 위한 고급 기능을 제공합니다.

R8 작동 방식

R8은 빌드 단계에서 애플리케이션의 코드를 처리하여 다음을 수행합니다:

  • 코드 축소: 애플리케이션의 코드베이스에서 사용되지 않는 클래스, 메서드, 필드 및 속성을 제거하여 최종 APK 또는 AAB 크기를 줄입니다.

  • 최적화: 런타임 성능을 개선하기 위해 코드를 단순화하고 재구성합니다. 여기에는 메서드 인라인, 중복 코드 제거, 중복 코드 블록 병합 등이 포함됩니다.

  • 난독화: 클래스, 메서드 및 필드의 이름을 변경하여 원래 이름을 모호하게 만들어 역엔지니어링을 더 어렵게 만듭니다.

  • 리소스 최적화: 사용되지 않는 리소스(예: 레이아웃, 드로어블, 문자열)를 제거하여 앱의 설치 공간을 더욱 최소화합니다.

R8 최적화의 주요 기능

  • 데드 코드 제거: R8은 코드베이스를 분석하여 앱에서 접근하거나 사용되지 않는 코드를 식별하고 제거합니다.

  • 인라인화: 짧은 메서드나 함수는 호출하는 코드에 직접 인라인되어 메서드 호출 오버헤드를 줄이고 런타임 성능을 향상시킵니다.

  • 클래스 병합: 유사한 클래스 또는 인터페이스를 하나로 결합하여 메모리 사용량을 줄이고 효율성을 개선합니다.

  • 접근 불가능한 코드 제거: 절대 실행되지 않는 코드 경로는 완전히 제거됩니다.

  • 상수 접기 및 전파: 가능한 모든 곳에서 표현식을 단순화하고 변수를 상수 값으로 대체합니다.

  • 난독화: R8은 코드의 의미 있는 이름을 더 짧고 덜 설명적인 이름으로 대체하여 앱 크기를 줄이고 역엔지니어링을 어렵게 만듭니다.

R8 구성

R8은 ProGuard 규칙을 사용하여 구성됩니다. 코드의 어떤 부분이 축소, 난독화 또는 최적화에서 제외되어야 하는지 지정할 수 있습니다. 일반적인 사용 사례는 다음과 같습니다:

  • 리플렉션을 위한 코드 보존: 리플렉션을 통해 접근되는 클래스 또는 메서드는 ProGuard 규칙에 명시적으로 keep되어야 합니다.

  • 서드 파티 라이브러리 제외: 일부 라이브러리는 기능 손상을 방지하기 위해 특정 규칙이 필요할 수 있습니다.

클래스를 keep하기 위한 ProGuard 규칙 예시:

# proguard-rules.pro -keep class com.example.myapp.MyClass { *; }

R8의 장점

  • 긴밀한 통합: R8은 Android 빌드 시스템에 내장되어 있어 일반적인 ProGuard 규칙 외에 추가 설정이 필요하지 않습니다.

  • 향상된 효율성: 축소, 최적화 및 난독화를 단일 패스로 결합하여 ProGuard보다 빠르고 효율적입니다.

  • 앱 크기 감소: 사용되지 않는 코드와 리소스를 제거하여 최종 APK 또는 AAB 크기를 크게 줄입니다.

  • 보안 강화: 난독화는 공격자가 앱을 역엔지니어링하기 어렵게 만들어 지적 재산을 보호합니다.

R8의 한계

  • 과도한 축소 위험: 제대로 구성되지 않으면 R8이 간접적으로 참조되는 코드나 리소스를 제거하여 런타임 오류를 유발할 수 있습니다.

  • 복잡한 구성: 복잡한 프로젝트, 특히 리플렉션이나 동적 클래스 로딩을 사용하는 프로젝트의 ProGuard 규칙 작성은 어려울 수 있습니다.

  • 디버깅 문제: 난독화로 인해 스택 트레이스에 난독화된 이름이 포함될 수 있으므로 디버깅이 더 어려워질 수 있습니다.

요약

R8은 현대 Android 개발에서 필수적인 도구로, 포괄적인 코드 축소, 최적화 및 난독화 기능을 제공합니다.

앱 크기를 줄이고 런타임 성능을 개선하며 보안을 강화함으로써 R8은 개발자가 효율적이고 컴팩트한 애플리케이션을 제공하도록 돕습니다.

필요한 코드의 의도하지 않은 제거를 방지하고 원활한 앱 기능을 보장하려면 ProGuard 규칙을 사용한 적절한 구성이 중요합니다.

자세한 내용은 Jake Wharton의 글, R8 Optimization: Staticization을 참조하십시오.

Q) R8 최적화는 앱 성능을 어떻게 개선하고 APK/AAB 크기를 줄이나요?
Q) R8은 ProGuard와 어떻게 다르며, 어떤 장점을 제공하나요?

R8은 ProGuard와 D8(Dex 컴파일러)을 하나로 통합한 코드 축소 및 최적화 도구입니다.

가장 큰 차이점은 ProGuard가 코드 최적화만 담당했다면, R8은 최적화와 .dex 파일 변환을 한 번에 처리한다는 것입니다.

R8이 ProGuard보다 나은 점은 빌드 프로세스를 보면 명확히 알 수 있습니다.

  • ProGuard: 코드(.class) -> 축소/난독화 -> 최적화된 .class -> [D8] Dex 변환 -> DEX 파일 (코드를 최적화하는 단계와 DEX파일로 변환하는 단계가 분리되어 2단계로 실행)

  • R8: 코드(.class) -> 축소/난독화 + 최적화 + Dex 변환 -> DEX파일

R8은 ProGuard와 D8작업을 한 번에 수행함으로써 빌드 속도 향상, 최적화 및 앱 크기 감소, 향상된 코틀린 지원, 완벽한 하위 호환성 등의 강력한 이점을 제공합니다.

26 January 2026