Proguard игнорирует файл конфигурации библиотеки

Сегодня я сталкиваюсь с действительно странной проблемой …

У меня есть приложение Gradle с двумя модулями, одним основным модулем и одним библиотечным модулем.

  • В обоих модулях я объявил путь к файлу proguard-rules.pro, который правильный
  • В обоих файлах .gradle у меня minifyEnabled true

Вот первая проблема: даже если minifyEnabled является ложным в библиотеке, она становится запутанной. Он не имеет никакого эффекта и, похоже, зависит от настроек основного модуля. Я использую proguard через некоторое время, и я никогда не испытывал такого поведения вообще.

Кроме того, proguard-rules.pro библиотеки, кажется, полностью игнорируется. Неважно, что я объявляю там, он не используется, и результат всегда один и тот же (всегда декомпилированный для просмотра результата). Он запутан с настройками по умолчанию.

Я использовал недопустимое имя файла proguard, чтобы увидеть, даже ли файл затронут, и действительно есть ошибки с неправильным именем, и он также жалуется на ошибки синтаксиса в файле proguard …

Я не знаю, связано ли это с обновлением Android Studio, так как он также рекомендовал мне использовать «minifyEnabled» вместо «runProguard».

Как я могу управлять proguard, чтобы использовать proguard-rules.pro библиотеки тоже?

Редактировать:

Я сделал образец проекта, чтобы прояснить мою проблему

Введите описание изображения здесь

Конфигурация proguard моей библиотеки

Введите описание изображения здесь

Градус моей библиотеки:

Введите описание изображения здесь

И, наконец, результат я всегда получаю. Не имеет значения, что я исключаю / включаю в конфигурацию proguard

Введите описание изображения здесь

Как вы можете видеть, правила proguard хорошо работают на основном модуле. Он делает то, что должен. Но он всегда полностью запутывает мою библиотеку …

Он также полностью удалил деятельность Библиотеки, которая не должна произойти вообще

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

В проекте библиотеки вы можете указать любую конфигурацию ProGuard для конкретной библиотеки в build.gradle, например:

defaultConfig { consumerProguardFiles 'proguard-rules.txt' } 

Этот файл затем упаковывается в библиотеку как proguard.txt и автоматически применяется в проекте приложения.

Если вы включите ProGuard в проект библиотеки (возможно, потому, что вы хотите распространять библиотеку), вам также необходимо добавить правильную конфигурацию для обработки библиотеки. Конструкция Android Gradle, похоже, не делает этого автоматически. Ты можешь:

  1. Скопируйте android-sdk/tools/proguard/examples/library.pro proguard-project.txt в proguard-project.txt в proguard-project.txt вашей библиотеки.
  2. Удалите строки ввода / вывода -injars , -outjars , -libraryjars , -printmapping из файла. Процесс сборки Gradle автоматически предоставляет эти параметры.
  3. Ссылка на конфигурацию из build.gradle проекта библиотеки.

Включение / выключение ProGuard самостоятельно для проекта библиотеки и для проекта приложения отлично подходит для меня.

Удивительно, но ответ Эрика действительно работает и на меня!

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

Я объединил несколько других SO-потоков и подошел к решению, которое работает, что также может быть упрощено. Шаги 1-4 являются необязательными, но пока это, похоже, не повредило.

  1. Загрузите Proguard 5.2 из http://sourceforge.net/projects/proguard/files/proguard/5.2/
  2. /android-sdk/tools/proguard5.2/android-sdk/tools/proguard5.2
  3. Переименуйте … /android-sdk/tools/proguard в … /android-sdk/tools/proguard4.7
  4. ln -s .../android-sdk/tools/proguard5.2 .../android-sdk/tools/proguard
  5. Скопируйте android-sdk/tools/proguard/examples/library.pro в папку проекта библиотеки и переименуйте в proguard-library.pro
  6. Измените proguard-library.pro и закомментируйте -injars , -outjars , -libraryjars и -printmapping .
  7. Отредактируйте файл build.gradle библиотеки, чтобы включить:

     defaultConfig { minifyEnabled true shrinkResources true proguardFiles 'proguard-library.pro' consumerProguardFiles 'proguard-library-consumer.pro' } 

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

  8. proguard-library-consumer.pro

     # include in this file any rules you want applied to a # consumer of this library when it proguards itself. -dontwarn junit.** -dontwarn org.junit.** # Make crash call-stacks debuggable. -keepnames class ** { *; } -keepattributes SourceFile,LineNumberTable 

Единственное, что сработало для меня, это определить оба варианта в моей библиотеке:

 release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' consumerProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }