Интеграция Espresso с Proguard и Gradle

Приложение, над которым я работаю, создается с помощью Gradle. Я пытаюсь добавить Espresso в качестве зависимости для инструментальных тестов. Само приложение имеет несколько зависимостей, одна из которых — Guava 15.0. Чтобы это работало, я использую версию Espresso с явными зависимостями и исключаю встроенную гуаву (вместо нее использую свою собственную).

dependencies {
   ...
   instrumentTestCompile fileTree(dir: 'libs/espresso-dependencies', include: '*.jar')
   compile 'com.google.guava:guava:15.0' 
   ...
}

Когда я пытаюсь выполнить сборку с помощью gradle connectedInstrumentTest, я получаю сообщения об ошибках, связанных с отсутствующими методами и классами.

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState
at com.google.android.apps.common.testing.ui.espresso.base.InputManagerEventInjectionStrategy.<init>(InputManagerEventInjectionStrategy.java:35)

Добавление -keep class com.google.common.** { *; } в мою конфигурацию Proguard заставляет все работать нормально. Кажется, что происходит то, что Proguard анализирует только классы, используемые основным приложением, и не ищет использование зависимостями тестирования инструмента. Методы/классы, которые не используются моим основным приложением, но которые необходимы для инструментальных тестов, по-видимому, оптимизированы.

Как я могу заставить Proguard сохранить классы/методы Guava, необходимые для Espresso и его зависимостей? Нецелесообразно задавать их все вручную (существует много вариантов использования), и сохранение всех из них противоречит цели Proguard.


person antonyt    schedule 28.11.2013    source источник


Ответы (2)


Вот что сработало для меня:

В build.gradle я добавил эту строку в свой раздел defaultConfig:

testProguardFile "test-proguard-rules.pro"

Затем я создал test-proguard-rules.pro со следующим содержимым:

-dontobfuscate
-dontwarn

Это говорит Gradle использовать эту отдельную конфигурацию proguard для вашего тестового apk, содержащего ваши инструментальные тесты. В этом случае вы говорите proguard не запутывать ваш тестовый apk, что, вероятно, вам нужно. Основной apk, который вы тестируете, по-прежнему запутывается с помощью существующей конфигурации proguard.

person Ilan Klinghofer    schedule 25.06.2015
comment
Как вы справляетесь со всеми вызовами, которые тестовый apk делает основному приложению. Поскольку класс и методы в основном приложении были бы замаскированы proguard, как тестовое приложение вызовет эти запутанные методы/класс? - person Sahil Jain; 12.09.2017

Не защищайте свои APK-файлы во время тестирования, если в этом нет крайней необходимости.

person ValeraZakharov    schedule 14.12.2013
comment
К сожалению, приложение не проходит шаг dex без proguard из-за слишком большого количества методов (через библиотеки). Существует достаточно возможностей для добавления исключений Guava, но подобные ошибки могут возникать и в других местах (т. е. в любое время, когда методы/классы используются при тестировании, но не в основном приложении). - person antonyt; 14.12.2013