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' } 
Intereting Posts
Android: добавить шрифт helvetica neue в приложение Android WebView , относящиеся Android-медиаплеер MediaPlayer (658): ошибка (1, -2147483648) Изменение имени пакета на существующие проекты Phonegap Android Gallery View Прокрутка проблемы, когда onClickListener для данных Переместить до родительской активности из уведомления Получить представление root из текущей активности Как получить информацию о устройстве Bluetooth с помощью устройства Bluetooth для устройств Bluetooth? Android OpenCV с использованием функций MatOfKeyPoint и feature2d Установка повторяющегося сигнала тревоги каждый день в определенное время В Android Приложение Google SignIn без добавления его в учетные записи устройства Должен ли я использовать JavaCV или Java-библиотеку OpenCV на Android? Является ли объединение для небольших объектов более эффективным, чем сборщик мусора Java от Java? Установка ширины TextView в java Pass arraylist объектов, определенных пользователем, для Introid android