Подтвердить что ты не робот

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

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

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

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

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

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

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

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

Как мне заставить proguard также использовать proguard-rules.pro библиотеки?

Edit:

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

enter image description here

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

enter image description here

Gradle моей библиотеки:

enter image description here

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

enter image description here

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

Он также полностью удалил Activity Library, что не должно происходить вообще

4b9b3361

Ответ 1

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

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

defaultConfig {
    consumerProguardFiles 'proguard-rules.txt'
}

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

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

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

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

Ответ 2

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

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

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

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

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

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

  • 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
    

Ответ 3

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

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

Ответ 4

Я использую ниже в модуле библиотеки и решены.

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
consumerProguardFiles 'lib_proguard-rules.pro'