R8 предоставляет глобальные параметры, которые либо изменяют оптимизации R8 во всем приложении, либо влияют на каждое правило сохранения. Эти параметры хранятся в файле proguard-rules.pro вместе с правилами сохранения. Некоторые из этих глобальных параметров настраивают дополнительную оптимизацию, в то время как другие отключают определенные аспекты оптимизации.
Глобальные параметры для дополнительной оптимизации
Следующие глобальные параметры позволяют выполнить дополнительную оптимизацию:
-
-repackageclasses [<optional-package-name>]: Перепаковывает классы в один пакет для уменьшения размера приложения. Если вы не укажете необязательное имя пакета, классы будут перемещены в безымянный пакет по умолчанию. Это рекомендуемая настройка для приложений, поскольку она приводит к уменьшению размера DEX-файлов за счет отсутствия префикса пакета в именах классов. -
-allowaccessmodification: Позволяет R8 изменять (обычно расширять) видимость классов, полей и методов для выполнения более масштабных оптимизаций. Включается при использованииproguard-android-optimize.txt. Начиная с Android Gradle Plugin (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 Plugin (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 | Этот атрибут хранит аннотации, которые применяются к использованию типов, а не только к их объявлению. Этот атрибут не виден во время выполнения. Разработчикам приложений не следует сохранять этот атрибут. Для авторов библиотек этот атрибут не имеет значения в правилах сохранения потребителями, но часто используется при создании библиотек. Подробную информацию об оптимизации библиотек см. в разделе «Оптимизация для авторов библиотек» . |