R8은 앱 전체에서 R8의 최적화를 수정하거나 모든 유지 규칙에 영향을 미치는 전역 옵션을 제공합니다. 이러한 옵션은 보관 규칙과 함께 proguard-rules.pro
파일에 유지됩니다. 이러한 전역 옵션 중 일부는 추가 최적화를 구성하고 다른 옵션은 최적화의 특정 측면을 사용 중지합니다.
추가 최적화를 위한 전역 옵션
다음 전역 옵션을 사용하면 추가 최적화가 가능합니다.
-repackageclasses [<optional-package-name>]
: 앱 크기를 줄이기 위해 클래스를 단일 패키지로 리패키징합니다. 선택적 패키지 이름을 제공하지 않으면 클래스가 이름이 지정되지 않은 기본 패키지로 이동합니다. 클래스 이름에서 패키지 접두사를 생략하여 DEX 파일 크기를 줄이므로 앱에 권장되는 설정입니다.-allowaccessmodification
: R8이 클래스, 필드, 메서드의 공개 상태를 변경 (일반적으로 확대)하여 더 광범위한 최적화를 실행할 수 있도록 합니다.proguard-android-optimize.txt
이 사용되면 사용 설정됩니다. Android Gradle 플러그인 (AGP) 8.2부터는 R8을 전체 모드로 사용하는 경우 기본 구성입니다.
다음은 추가 최적화가 사용 설정된 구성의 예입니다.
-repackageclasses
-allowaccessmodification
최적화를 제한하는 전역 옵션
다음 전역 옵션을 사용하면 앱 최적화의 특정 측면을 사용 중지할 수 있으며, 유지 규칙을 개선하거나 처음으로 R8을 사용 설정할 때 유용합니다.
-dontoptimize
: 코드 최적화(예: 메서드 인라인)를 방지합니다. 이 옵션은 개발 중에 사용할 수 있지만 프로덕션 빌드에서는 사용하면 안 됩니다.-dontshrink
: 참조되지 않은 코드와 코드 최적화가 삭제되지 않도록 합니다. 이 옵션은 개발 중에 사용할 수 있지만 프로덕션 빌드에서는 사용하면 안 됩니다.-dontobfuscate
: 클래스와 메서드의 이름이 단축되지 않도록 합니다. 디버깅 중에 난독화 기능을 사용 중지하면 스택 트레이스를 더 쉽게 읽을 수 있어 특히 유용합니다. 이 옵션은 개발 중에 사용할 수 있지만 프로덕션 빌드에서는 사용하면 안 됩니다.-keepattributes <attributes>
: 유지해야 하는 속성의 쉼표로 구분된 목록을 허용합니다. 기본proguard-android-optimize.txt
를 사용하지 않는 경우 R8은RuntimeVisibleAnnotations
및Signature
를 비롯한 모든 속성을 삭제하지만, 리플렉션과 같은 경우에 이러한 속성이 필요한 경우 유지하는 것이 유용할 수 있습니다. 지정할 수 있는 속성 목록은 속성 유지를 참고하세요.
속성 유지
속성은 코드의 여러 부분에 연결된 추가 정보입니다. 속성은 코드의 주석 및 일반 서명과 같은 정보를 저장합니다.
특정 리플렉션 작업이 성공적으로 실행되려면 특정 속성이 유지되어야 합니다. 예를 들면 다음과 같습니다.
getEnclosingMethod()
또는getDeclaredClasses()
를 사용하여 내부 또는 외부 클래스 구조에 액세스할 때는EnclosingMethod
및InnerClasses
속성이 필요합니다.getTypeParameters()
를 사용하여 일반 서명에 액세스할 때는Signature
속성이 필요합니다.getAnnotation()
를 사용하여 주석에 액세스하는 경우RuntimeVisibleAnnotations
속성이 필요합니다.
일반적으로 필수 속성
기본 Proguard 파일 (proguard-android-optimize.txt
또는 proguard-android.txt
)을 사용하는 경우 Android Gradle 플러그인 (AGP)은 다음 속성을 유지합니다. 이러한 속성 중 일부에는 최신 버전의 AGP가 필요합니다.
속성 | 설명 |
---|---|
AnnotationDefault |
이 속성은 주석 유형 자체에 있으며 주석 요소의 기본값을 저장합니다. 참고: 이 속성은 AGP 7.1부터 기본적으로 유지되며 이전 버전의 AGP를 사용하는 앱에서만 명시적으로 유지해야 합니다. |
EnclosingMethod |
이 속성은 로컬 클래스나 익명 클래스가 아닌 내부 클래스에 있습니다. 클래스를 즉시 포함하는 메서드 또는 이니셜라이저를 식별합니다. |
InnerClasses |
이 속성은 다른 클래스 내에 정의된 중첩 클래스 (내부 클래스, 정적 중첩 클래스, 로컬 클래스, 익명 클래스)에 관한 정보를 기록합니다. |
LineNumberTable |
이 속성은 바이트 코드 명령어를 원본 소스 파일의 해당 행 번호에 매핑합니다. 참고: 이 속성은 Android Gradle 플러그인 (AGP) 8.6부터 기본적으로 유지되며 이전 버전의 AGP를 사용하는 앱에서만 명시적으로 유지해야 합니다. |
RuntimeVisibleAnnotations |
이 속성은 리플렉션에 의해 런타임에 표시되는 주석을 저장합니다. 일반적으로 런타임에 주석을 사용하는 경우 앱과 라이브러리 소비자 규칙에 필요한 *Annotation 속성의 주석은 이것이 유일합니다. |
RuntimeVisibleParameterAnnotations |
이 속성은 메서드의 매개변수에 대한 리플렉션에 의해 런타임에 표시되는 주석을 저장합니다. |
RuntimeVisibleTypeAnnotations |
이 속성은 선언뿐만 아니라 유형 사용에 적용되는 주석을 저장합니다. 이 속성은 런타임에 표시됩니다. |
Signature |
이 속성은 클래스, 메서드, 필드의 더 일반적인 유형 서명을 저장합니다. 특히 제네릭 (예: List<String> )을 사용하는 경우에 그렇습니다. |
SourceFile |
이 속성은 클래스가 컴파일된 소스 파일 (.kt 또는 .java 파일)의 이름을 저장합니다. 컴파일된 Java 코드를 단계별로 실행할 때 디버거가 원래 소스 코드 줄을 표시하는 데 주로 사용됩니다. 이를 통해 개발자는 실행을 작성된 코드로 다시 추적할 수 있습니다. 참고: 이 속성은 AGP 8.2부터 기본적으로 유지되며 이전 버전의 AGP를 사용하는 앱에서만 명시적으로 유지해야 합니다. |
proguard-android-optimize.txt
를 사용하는 앱의 경우 대부분의 시나리오에서 AGP로 정의된 유지 규칙이 적절합니다. 하지만 라이브러리용 코드를 작성하는 경우 이 목록에 정의되어 있더라도 라이브러리에 필요한 모든 속성을 소비자 유지 규칙에 지정해야 합니다. 이렇게 하면 개발자가 proguard-android-optimize.txt
를 포함하지 않기로 결정한 경우에도 라이브러리가 견고해집니다.
추가 유지 속성
유지할 추가 속성을 지정할 수 있지만 대부분의 리플렉션 또는 JNI 액세스 시나리오에서는 필요하지 않습니다. 하지만 라이브러리를 최적화하는 동안 이러한 항목 중 일부가 여전히 자주 사용될 수 있습니다.
속성 | 설명 |
---|---|
MethodParameters |
이 속성은 메서드의 매개변수, 특히 이름과 액세스 플래그에 관한 정보를 제공합니다. |
Exceptions |
이 속성은 메서드가 발생시키는 것으로 선언된 확인된 예외를 나열합니다. 이 속성은 일반적으로 앱에 사용되지 않습니다. 라이브러리 작성자의 경우 일반적으로 소비자 유지 규칙에 사용되지 않지만 라이브러리를 빌드할 때는 자주 사용됩니다. 라이브러리 최적화에 관한 자세한 내용은 라이브러리 작성자를 위한 최적화를 참고하세요. |
RuntimeInvisibleAnnotations |
이 속성은 런타임에 리플렉션으로 표시되지 않는 주석을 클래스, 필드 또는 메서드에 저장합니다. 앱 개발자는 이 속성을 유지해서는 안 됩니다. 라이브러리 작성자의 경우 이 속성은 소비자 유지 규칙과 관련이 없지만 라이브러리를 빌드할 때 자주 사용됩니다. 라이브러리 최적화에 관한 자세한 내용은 라이브러리 작성자를 위한 최적화를 참고하세요. |
RuntimeInvisibleParameterAnnotations |
이 속성은 런타임에 리플렉션으로 표시되지 않는 주석을 메서드의 매개변수에 저장합니다. 앱 개발자는 이 속성을 유지해서는 안 됩니다. 라이브러리 작성자의 경우 이 속성은 소비자 유지 규칙과 관련이 없지만 라이브러리를 빌드할 때 자주 사용됩니다. 라이브러리 최적화에 관한 자세한 내용은 라이브러리 작성자를 위한 최적화를 참고하세요. |
RuntimeInvisibleTypeAnnotations |
이 속성은 선언뿐만 아니라 유형 사용에 적용되는 주석을 저장합니다. 이 속성은 런타임에 표시되지 않습니다. 앱 개발자는 이 속성을 유지해서는 안 됩니다. 라이브러리 작성자의 경우 이 속성은 소비자 유지 규칙과 관련이 없지만 라이브러리를 빌드할 때 자주 사용됩니다. 라이브러리 최적화에 관한 자세한 내용은 라이브러리 작성자를 위한 최적화를 참고하세요. |