4

Я надеюсь, что кто-то может ответить на то, что я считаю основным вопросом Gradle/Proguard.Возможно ли Proguard использовать библиотечный модуль Android, но не модуль приложения?

У меня очень простой Android-проект. Этот проект содержит основной модуль приложения с именем app и библиотечный модуль для библиотек поддержки Android под названием AndroidSupport.

Я хочу запустить Proguard исключительно на AndroidSupport (т. Е. НЕ на общем приложении), потому что у меня возникли проблемы с тестированием аппаратуры в приложении, когда это Proguard-ed. Моя надежда состоит в том, что я могу самостоятельно профинансировать AndroidSupport, чтобы мне не требовалось Proguard моего кода приложения (и, таким образом, избегать проблем с проверкой тестов).

Это мой appbuild.gradle. Обратите внимание, что Proguard заблокированном:

apply plugin: 'com.android.application' 
android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 
    defaultConfig { 
     applicationId "com.example.androidsupportlibproject" 
     minSdkVersion 9 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     debug { 
      minifyEnabled false //Proguard DISABLED 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':AndroidSupport') 
} 

Мой AndroidSupport модуль Proguard ВКЛЮЧЕНО:

apply plugin: 'com.android.library' 
android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 
    defaultConfig { 
     minSdkVersion 9 
     targetSdkVersion 22 
    } 
    buildTypes { 
     release { 
      minifyEnabled true //Proguard ENABLED 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:22.2.0' 
    compile 'com.android.support:appcompat-v7:22.2.0' 
    compile 'com.android.support:recyclerview-v7:22.2.0' 
    compile 'com.android.support:support-annotations:22.2.0' 
} 

Мой AndroidSupport модуль proguard-rules.pro выглядит следующим образом:

-dontobfuscate 
-keep class android.support.v4.** { *; } 
-keep interface android.support.v4.app.** { *; } 

Когда app применение позволило Proguard и AndroidSupport имеет Proguard отключен, я могу использовать consumerProguardFiles proguard-rules.pro для минимизации AndroidSupport.
Но когда я использую выше вставленную конфигурацию, я получаю следующее сообщение об ошибке:

Error:Execution failed for task ':AndroidSupport:proguardRelease'. 
java.io.IOException: The output jar is empty. Did you specify the proper '-keep' options?` 

Кто-нибудь знает, если это настроить можно? Включить Proguard ТОЛЬКО на зависимый библиотечный модуль, но не на самом приложении?

Заранее благодарен!

+0

смотрите здесь http://stackoverflow.com/questions/27277433/why-does-gradle-build-my-module-in-release-mode-when-the-app-is-in-debug –

ответ

0

Не хотите ли отображать некоторые интерфейсы API-интерфейсов вашего библиотечного модуля? Для доступа из вашего прикладного модуля? В этом случае, вы должны добавить -keep опции в вашу библиотеку ProGuard, например:

-keep,allowshrinking class com.example.androidsupportlibproject.YourClass { 
    public <methods>; 
    protected <methods>; 
    public static <methods>; 
    public <init>(...); 
} 
+0

Спасибо для вашего комментария. Мой библиотечный модуль - это просто контейнер для библиотек поддержки и не содержит дополнительного кода приложения. Вот почему я смущен тем, что '-keep класс android.support.v4. ** {*; } -keep интерфейс android.support.v4.app. ** {*; } ' не содержит никакого кода. –

0

Это не представляется возможным запустить Proguard исключительно на модуле, а не на общего применения. Всякий раз, когда я пытаюсь это сделать, Proguard, похоже, вычеркивает весь код из моего APK, потому что он, вероятно, не может разрешить зависимости между тестированием apk и проверенным apk.

Решение состоит в том, чтобы запустить Proguard во всем приложении и выяснить, как получить модульные тесты для запуска. Обратите внимание, что testProguardFile в конфигурации Proguard относится к конфигурации для тестирования apk, а не к проверенному apk.

1

Его можно пропустить только в библиотечном модуле, а не в проекте дыр в проекте «Android Studio». Я создаю android inapp sdk. В моем проекте есть модуль lib и app, я успешно обфускал только модуль lib.

Подсказка: Добавьте код ниже в ваш файл lib buildue build.gradle.

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

Тогда в том же каталоге со сборкой.gradle, create, proguard-rules.pro. Ваш код защиты будет отправлен туда.

+0

Не работает для меня :( –

Смежные вопросы