Как я научу ProGuard избавиться от чего-то, что я держу, что не использую?

У меня есть проект Android с файлом proguard-rules.pro для модуля app который содержит только следующее:

 # ProGuard rules -dontobfuscate -dontwarn android.arch.util.paging.CountedDataSource -dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource 

Я ничего не держу. Все правила -keep исходят от чего-то другого, будь то правила, предоставляемые getDefaultProguardFile('proguard-android-optimize.txt') или из правил, упакованных в библиотеки.

Тем не менее, материал хранится, что я не использую. Если я использую Android Studio APK Analyzer в моей сборке release , в то время как многие вещи удаляются ProGuard, многие другие вещи хранятся, я не ссылаюсь.

Например: через транзитивные зависимости у меня есть модуль библиотеки поддержки, который содержит ViewPager в дереве зависимостей приложения. Тем не менее, я не (в настоящее время) использую ViewPager в этом приложении. Несмотря на это, что-то заставляет его сохранять, поскольку APK Analyzer показывает 107 определенных методов для android.support.v4.view.ViewPager , включая его конструктор.

Я мог бы использовать различные параметры ProGuard, чтобы отслеживать, почему это сохраняется. Однако это не происходит из моих правил. Не существует моего собственного, который нуждается в исправлении, – что- -keep происходит от кого-то другого, предположительно инженера Google.

Итак, как мне избавиться от ViewPager ? Есть ли способ, с помощью которого я могу переопределить правило -keep , которое вызывает его сохранение (например, с помощью allowshrinking )? Если да, то как ProGuard, вызванный Android Studio, определяет, -keep правило -keep выигрывает?

Класс ViewPager не хранится в небольшом приложении, которое я только что проверил, поэтому в вашем проекте должен быть другой код или другие правила.

Вы можете начать с того, что ProGuard распечатает цепочку, которая запускает ViewPager:

 -whyareyoukeeping class android.support.v4.view.ViewPager 

Возможно, вам придется повторять это несколько раз для различных классов и методов, чтобы добраться до основной причины. ProGuard не печатает, какое именно правило отвечает именно за это – по общему признанию, это было бы полезной функцией.

Затем вы можете найти файл proguard.txt файле build/intermediates/exploded-aar proguard.txt build/intermediates/exploded-aar который содержит правило соответствия.

Что касается решения в тот момент:

  • Невозможно переопределить правила; Они только накапливаются.
  • Насколько я знаю, плагин Android Gradle также не поддерживает отключение чрезмерно консервативных файлов proguard.txt в библиотеках, поэтому вам нужно создать собственный файл .aar с обновленным правилом или отправить предложение разработчикам библиотека.