Невозможно разрешить зависимости для задачи assembleAndroidTest с плагином Android Gradle 3.0.1

Я обновляю наш проект, чтобы использовать Gradle 4.1 и Android Gradle plugin 3.0.1. Я обновил нашу конфигурацию зависимостей до новой конфигурации, и проект успешно компилируется. Тем не менее, при компиляции андроидных тестов ( assembleAndroidTest Gradle task) существует множество нерешенных зависимостей (включая функции верхнего уровня стандартной библиотеки Kotlin). Я подозревал, что Proguard может вызвать это (хотя это не было до обновления Gradle), но даже добавление явных правил для сохранения символов / классов не помогает. Мы используем плагин Kotlin 1.2.10 и Kotlin-Kapt.

Я ценю любую помощь.

Я не использую ProGuard для отладки, но следующие ответы кажутся полезными. Я бы пересмотрел вашу настройку Gradle еще раз после руководства по миграции и прежде всего чистых и недействительных кешей.

Proguard

Чеч этот вопрос и ответы о том, как использовать Kotlin с Proguard.

Отключите эти директивы в файле build.gradle чтобы отменить Proguard.

 minifyEnabled false shrinkResources false 

Настройте Proguard для Kotlin.

Вам не нужно ничего особенного делать. Котлин работает с ProGuard из коробки. Но вы можете столкнуться с некоторыми странными ошибками при обработке своего приложения с помощью ProGuard. В этом случае просто добавьте:

 -dontwarn kotlin.** 

Вы также можете добавить:

 -keep class kotlin.** { *; } -keep class kotlin.Metadata { *; } -dontwarn kotlin.** -keepclassmembers class **$WhenMappings { <fields>; } -keepclassmembers class kotlin.Metadata { public <methods>; } -assumenosideeffects class kotlin.jvm.internal.Intrinsics { static void checkParameterIsNotNull(java.lang.Object, java.lang.String); } 

Проверьте эти связанные вопросы, чтобы либо включить Proguard для тестов, либо нет:

proguard gradle debug build, но не тесты

Укажите файл Proguard для использования на контрольных тестах.

runProguard – старый. Он был заменен на minifyEnabled

С minifyEnabled (и другими изменениями в новых версиях Gradle) вы можете столкнуться с проблемами, когда конфигурация Proguard работает для вашего debug apk, но не для контрольных тестов. Apk, созданный для контрольных тестов, будет использовать собственный файл proguard, поэтому изменение существующего файла proguard не будет иметь никакого эффекта.

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

  // inside android block debug { shrinkResources true // removes unused graphics etc minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' testProguardFile('test-proguard-rules.pro') } 

Тестирование на Android-блоке с включенной функцией proguard

Добавить пользовательский файл правил proguard

/project/app/proguard-test-rules.pro

 # Proguard rules that are applied to your test apk/code. -ignorewarnings -keepattributes *Annotation* -dontnote junit.framework.** -dontnote junit.runner.** -dontwarn android.test.** -dontwarn android.support.test.** -dontwarn org.junit.** -dontwarn org.hamcrest.** -dontwarn com.squareup.javawriter.JavaWriter # Uncomment this if you use Mockito #-dontwarn org.mockito.** The add the following to your build.gradle for your app. To use the proguard file when testing. /project/app/build.gradle android { debug { minifyEnabled true testProguardFile 'proguard-test-rules.pro' } } 

Добавить buidType для тестирования

Я решил эту проблему в своей сборке, имея дополнительный «dev» buildType, где я включаю proguard, но настраиваю его, чтобы сохранить весь код в моем собственном пакете и несколько конкретных классов библиотеки, которые используются только из тестов. Я также отключил обфускацию в dev buildType, чтобы его можно было отлаживать из среды IDE.

Для отладочных и выпускных сборников я использую свои «реальные» настройки proguard, включая обфускацию и оптимизацию.

Используйте отдельные тестовые модули

Отдельные тестовые модули теперь доступны для версии. Это означает, что указание targetVariant больше не требуется.

Каждый вариант в тестовом модуле попытается проверить соответствующий вариант в целевом проекте. По умолчанию тестовые модули содержат только вариант отладки, но вы можете создавать новые типы сборки и новые варианты для создания новых вариантов в соответствии с тестируемым проектом приложения. Для каждого варианта создается задача connectCheck.

Чтобы тестовый модуль тестировал только другой тип сборки, а не отладочный, используйте VariantFilter для отключения варианта отладки в тестовом проекте, как показано ниже:

 android { variantFilter { variant -> if (variant.buildType.name.equals('debug')) { variant.setIgnore(true); } } } 

Если вы хотите, чтобы тестовый модуль ориентировался только на определенные вкусы или типы сборки приложения, вы можете использовать свойство matchFallbacks для таргетинга только на те варианты, которые вы хотите проверить. Это также не позволяет тестовому модулю настраивать эти варианты для себя.


Gradle

Пересмотрите конфигурацию Gradle. Чтобы создать проект Android, написанный в Котлине :

  • Настройте плагин kotlin-android gradle и примените его к вашему проекту.
  • Добавьте зависимости kotlin-stdlib .

Эти действия могут также выполняться автоматически в IntelliJ IDEA / AS путем вызова действия:

Инструменты | Котлин | Настроить Kotlin в проекте


Котлин-андроид

 buildscript { ext.kotlin_version = '1.2.10' ... dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' 

Котлин-STDLIB

Не забудьте настроить стандартную зависимость библиотеки :

 repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib" } 

Измените конфигурацию зависимостей, используя руководство по миграции .

Примечание. compile , provided и apk в настоящее время доступны .

Однако они будут удалены в следующем выпуске плагина Android.


Предоставить версию вручную

Начиная с Kotlin 1.1.2, зависимости с группой org.jetbrains.kotlin по умолчанию разрешены версией, взятой из прикладного плагина.

Вы можете предоставить версию вручную, используя полную запись зависимостей следующим образом:

 compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 

Стратегия решения

Вы также можете заставить стратегию разрешения :

 configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } } 

Поскольку вы используете Android Gradle plugin 3.0.1 :

 // Instead, because the new build model delays dependency resolution, you // should query and modify the resolution strategy using the Variant API: android { applicationVariants.all { variant -> variant.getCompileConfiguration().resolutionStrategy { ... } variant.runtimeConfiguration.resolutionStrategy { ... } variant.getAnnotationProcessorConfiguration().resolutionStrategy { ... } } } 

Исключайте зависимости приложений от тестовых конфигураций с использованием API-интерфейса Variant:

В предыдущих версиях Android-плагина вы могли исключать определенные транзитивные зависимости вашего приложения из своих тестов, используя ключевое слово exclude . Однако с новыми конфигурациями зависимостей вы должны сделать это во время выполнения с использованием API-интерфейса Variant:

 android.testVariants.all { variant -> variant.getCompileConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp' variant.getRuntimeConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp' } 

Расширенные версии стандартной библиотеки Kotlin

Если вы нацеливаете JDK 7 или JDK 8 , вы можете использовать расширенные версии стандартной библиотеки Kotlin, которые содержат дополнительные функции расширения для API-интерфейсов, добавленных в новые версии JDK. Вместо kotlin-stdlib используйте одну из следующих зависимостей:

 compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7" compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8" 

В Kotlin 1.1.x вместо этого используйте kotlin-stdlib-jre7 и kotlin-stdlib-jre8 .


Отражение Котлина

Если ваш проект использует объекты отражения или тестирования Kotlin , вам также необходимо добавить соответствующие зависимости:

 compile "org.jetbrains.kotlin:kotlin-reflect" testCompile "org.jetbrains.kotlin:kotlin-test" testCompile "org.jetbrains.kotlin:kotlin-test-junit" 

Kapt

См. Описание инструмента обработки аннотации Kotlin ( kapt ).

Примените kotlin-kapt Gradle:

 apply plugin: 'kotlin-kapt'