2014-11-17 5 views
27

я столкнулся действительно странные проблемы, в течение нескольких дней теперь ...Proguard игнорирует конфигурационный файл библиотеки

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

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

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

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

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

I не знаю, связано ли это с обновлением 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 ....

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

ответ

77

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

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

defaultConfig { 
    consumerProguardFiles 'proguard-rules.txt' 
} 

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

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

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

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

+1

Привет Эрик, в первую очередь поблагодарить Вас за быстрый ответ , Я полностью вынул параметр minifyEnabled в библиотеке сейчас, и он действительно решил «Выходной бачок пуст», о котором я упоминал в письме, но proguard игнорирует конфигурацию proguard anyways –

+1

Действительно, я пропустил вещь consumerProguardFiles. Теперь он работает, спасибо вам большое :) –

+1

'customerProguardFiles' должен быть указан в' defaultConfig', а не 'buildTypes/release', так что он работает, если приложение-разработчик потребления в обоих режимах отладки и выпуска (например, чтобы избежать 65k dex метод предел). – ashughes

7

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

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

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

  1. Скачать Proguard 5,2 из http://sourceforge.net/projects/proguard/files/proguard/5.2/
  2. распакуйте ... /android-sdk/tools/proguard5.2
  3. Rename ... /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 
    
+0

Ошибка: ресурс shrinker не может использоваться для библиотек. – halxinate

4

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

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

Это действительно сработало .. по какой-то причине просто использование consumerProguardFiles хранило большую часть того, что мне было нужно, но случайно просто игнорировало правила для нескольких классов .. используя обе работы .. но ПОЧЕМУ! ?? – speedynomads

+0

К сожалению, это действительно сработало ... Прошло некоторое время, пытаясь это сделать, теперь осталось только выяснить, ПОЧЕМУ это сработало :) –

+0

* Что пошло не так: Возникла проблема с настройкой проекта ': content'. > Файл proguard-android.txt по умолчанию не должен использоваться в качестве файла конфигурации пользователя. – Y2i