Добавить глобальные параметры

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 Этот атрибут хранит аннотации, которые применяются к использованию типов, а не только к их объявлению. Этот атрибут не виден во время выполнения.

Разработчикам приложений не следует сохранять этот атрибут. Для авторов библиотек этот атрибут не имеет значения в правилах сохранения потребителями, но часто используется при создании библиотек. Подробную информацию об оптимизации библиотек см. в разделе «Оптимизация для авторов библиотек» .