Q30) R8 최적화
R8 최적화란 무엇인가요?
R8은 Android 빌드 프로세스에서 사용되는 코드 축소 및 최적화 도구로, APK 또는 AAB의 크기를 줄이고 런타임 성능을 향상시킵니다.
R8은 이전의 ProGuard 도구를 대체하며, Android 빌드 시스템에 원활하게 통합되어 코드 축소, 최적화, 난독화 및 리소스 관리를 위한 고급 기능을 제공합니다.
R8 작동 방식
R8은 빌드 단계에서 애플리케이션의 코드를 처리하여 다음을 수행합니다:
코드 축소: 애플리케이션의 코드베이스에서 사용되지 않는 클래스, 메서드, 필드 및 속성을 제거하여 최종 APK 또는 AAB 크기를 줄입니다.
최적화: 런타임 성능을 개선하기 위해 코드를 단순화하고 재구성합니다. 여기에는 메서드 인라인, 중복 코드 제거, 중복 코드 블록 병합 등이 포함됩니다.
난독화: 클래스, 메서드 및 필드의 이름을 변경하여 원래 이름을 모호하게 만들어 역엔지니어링을 더 어렵게 만듭니다.
리소스 최적화: 사용되지 않는 리소스(예: 레이아웃, 드로어블, 문자열)를 제거하여 앱의 설치 공간을 더욱 최소화합니다.
R8 최적화의 주요 기능
데드 코드 제거: R8은 코드베이스를 분석하여 앱에서 접근하거나 사용되지 않는 코드를 식별하고 제거합니다.
인라인화: 짧은 메서드나 함수는 호출하는 코드에 직접 인라인되어 메서드 호출 오버헤드를 줄이고 런타임 성능을 향상시킵니다.
클래스 병합: 유사한 클래스 또는 인터페이스를 하나로 결합하여 메모리 사용량을 줄이고 효율성을 개선합니다.
접근 불가능한 코드 제거: 절대 실행되지 않는 코드 경로는 완전히 제거됩니다.
상수 접기 및 전파: 가능한 모든 곳에서 표현식을 단순화하고 변수를 상수 값으로 대체합니다.
난독화: R8은 코드의 의미 있는 이름을 더 짧고 덜 설명적인 이름으로 대체하여 앱 크기를 줄이고 역엔지니어링을 어렵게 만듭니다.
R8 구성
R8은 ProGuard 규칙을 사용하여 구성됩니다. 코드의 어떤 부분이 축소, 난독화 또는 최적화에서 제외되어야 하는지 지정할 수 있습니다. 일반적인 사용 사례는 다음과 같습니다:
리플렉션을 위한 코드 보존: 리플렉션을 통해 접근되는 클래스 또는 메서드는 ProGuard 규칙에 명시적으로
keep되어야 합니다.서드 파티 라이브러리 제외: 일부 라이브러리는 기능 손상을 방지하기 위해 특정 규칙이 필요할 수 있습니다.
클래스를 keep하기 위한 ProGuard 규칙 예시:
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작업을 한 번에 수행함으로써 빌드 속도 향상, 최적화 및 앱 크기 감소, 향상된 코틀린 지원, 완벽한 하위 호환성 등의 강력한 이점을 제공합니다.