R8은 앱 전체에서 R8의 최적화를 수정하거나 모든 유지 규칙에 영향을 미치는 전역 옵션을 제공합니다. 이러한 옵션은 보관 규칙과 함께 proguard-rules.pro
파일에 유지됩니다. 이러한 전역 옵션 중 일부는 추가 최적화를 구성하고 다른 옵션은 최적화의 특정 측면을 사용 중지합니다.
추가 최적화를 위한 전역 옵션
다음 전역 옵션을 사용하면 추가 최적화가 가능합니다.
-repackageclasses [<optional-package-name>]
: 추가 앱 크기 감소를 위해 클래스를 지정된 단일 패키지로 리패키징합니다. 선택적 패키지 이름을 제공하지 않으면 클래스가 비어 있는 기본 패키지로 이동합니다. 앱에 권장되는 설정입니다.-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 |
이 속성은 선언뿐만 아니라 유형 사용에 적용되는 주석을 저장합니다. 이 속성은 런타임에 표시되지 않습니다. 앱 개발자는 이 속성을 유지해서는 안 됩니다. 라이브러리 작성자의 경우 이 속성은 소비자 유지 규칙과 관련이 없지만 라이브러리를 빌드할 때 자주 사용됩니다. 라이브러리 최적화에 관한 자세한 내용은 라이브러리 작성자를 위한 최적화를 참고하세요. |