Невозможно разрешить зависимости для задачи buildAndroidTest с помощью плагина Android Gradle 3.0.1.
Я обновляю наш проект для использования Gradle 4.1 и Android Gradle плагин 3.0.1. Я обновил нашу конфигурацию зависимостей до новой конфигурации, и проект успешно компилируется. Однако при компиляции тестов для Android существует много неразрешенных зависимостей (в том числе функций верхнего уровня стандартной библиотеки Kotlin).assembleAndroidTest
Gradle задача). Я подозревал, что это может вызвать Proguard (хотя это не происходило до обновления Gradle), но даже добавление явных правил для хранения символов / классов не помогает. Мы используем Kotlin 1.2.10 и плагин Kotlin-Kapt.
Я ценю любую помощь.
1 ответ
Я не использую ProGuard для отладки, но следующие ответы кажутся полезными. Я бы пересмотрел вашу конфигурацию Gradle в другой раз, следуя руководству по миграции, и прежде всего очистил и аннулировал кэши.
Proguard
Чеч этот вопрос и ответы о том, как использовать Kotlin с Proguard.
Отключите эти директивы в вашем build.gradle
файл для сброса Proguard.
minifyEnabled false
shrinkResources false
Настройте Proguard для Kotlin.
Вам не нужно делать ничего особенного. 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, но не тесты
Укажите файл Proguard для использования в инструментальных тестах.
runProguard старый. Он был заменен на minifyEnabled
С minifyEnabled (и другими изменениями в новых версиях Gradle) вы можете столкнуться с проблемами, когда конфигурация Proguard работает для вашего отладочного 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 больше не нужно.
Каждый вариант в тестовом модуле будет пытаться проверить соответствующий вариант в целевом проекте. По умолчанию тестовые модули содержат только вариант отладки, но вы можете создавать новые типы сборки и новые разновидности, чтобы создавать новые варианты, соответствующие проекту протестированного приложения. Задача connectedCheck создается для каждого варианта.
Чтобы тестовый модуль тестировал только другой тип сборки, а не отладочный, используйте VariantFilter, чтобы отключить вариант отладки в тестовом проекте, как показано ниже:
android { variantFilter { variant -> if (variant.buildType.name.equals('debug')) { variant.setIgnore(true); } } }
Если вы хотите, чтобы тестовый модуль предназначался только для определенных разновидностей или типов сборки приложения, вы можете использовать свойство MatchFallbacks, чтобы предназначаться только для тех вариантов, которые вы хотите протестировать. Это также не позволяет тестовому модулю настраивать эти варианты для себя.
Gradle
Пересмотрите свою конфигурацию Gradle. Чтобы построить проект Android, написанный на Kotlin:
- Настройте
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 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 {
...
}
}
}
Исключите зависимости приложения из тестовых конфигураций с помощью Variant API:
В предыдущих версиях плагина Android вы могли исключить определенные переходные зависимости вашего приложения из своих тестов, используя ключевое слово exclude. Однако с новыми конфигурациями зависимостей вы должны сделать это во время выполнения, используя Variant API:
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'