无法使用Android Gradle插件3.0.1解析assembleAndroidTest任务的依赖项

无法使用Android Gradle插件3.0.1解析assembleAndroidTest任务的依赖项,android,gradle,kotlin,Android,Gradle,Kotlin,我正在更新我们的项目,使用Gradle4.1和Android Gradle插件3.0.1。我已将依赖项配置更新为,项目已成功编译。然而,在编译android测试(assembleAndroidTestGradle任务)时,存在许多未解决的依赖项(包括Kotlin标准库的顶级函数)。我怀疑Proguard可能会导致这种情况(尽管它在更新Gradle之前没有),但即使添加显式规则来保留符号/类也无济于事。我们使用Kotlin1.2.10和KotlinKapt插件 非常感谢您的帮助。我不使用ProGu

我正在更新我们的项目,使用Gradle4.1和Android Gradle插件3.0.1。我已将依赖项配置更新为,项目已成功编译。然而,在编译android测试(
assembleAndroidTest
Gradle任务)时,存在许多未解决的依赖项(包括Kotlin标准库的顶级函数)。我怀疑Proguard可能会导致这种情况(尽管它在更新Gradle之前没有),但即使添加显式规则来保留符号/类也无济于事。我们使用Kotlin1.2.10和KotlinKapt插件


非常感谢您的帮助。

我不使用ProGuard进行调试,但以下答案似乎很有用。 根据迁移指南,我将在另一次修改Gradle配置,首先清理缓存并使其无效

前卫 检查此项以及如何将Kotlin与Proguard一起使用

build.gradle
文件中禁用这些指令以放弃Proguard。

minifyEnabled false
shrinkResources false
为Kotlin配置Proguard。

minifyEnabled false
shrinkResources false
你不需要做任何特别的事情。Kotlin与ProGuard out合作 盒子的底部。但在处理数据时,您可能会遇到一些奇怪的错误 使用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规则文件

/project/app/proguard测试规则.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'
    }
}
添加用于测试的内置类型

我在构建中通过增加一个“dev”解决了这个问题 buildType,其中我启用proguard,但将其配置为保留所有代码 在我自己的包中,还有一些特定的库类 只能从测试中使用。我还禁用了dev中的模糊处理 buildType,以便可以从IDE对其进行调试

对于调试和发布版本,我使用我的“真实”proguard设置 包括模糊处理和优化

使用单独的测试模块

我们现在知道了变异。这意味着 不再需要指定targetVariant

测试模块中的每个变量都将尝试测试匹配 目标项目中的变量。默认情况下,测试模块仅包含 调试变量,但您可以创建新的构建类型和新的风格来 创建新的变体以匹配测试的应用程序项目。连接支票 为每个变量创建任务

使测试模块只测试不同的生成类型,而不测试 调试一,使用VariantFilter在测试中禁用调试变量 项目,如下所示:

android {
    variantFilter { variant ->
        if (variant.buildType.name.equals('debug')) {
            variant.setIgnore(true);
        }
    }
}
如果您希望测试模块只针对特定的风格或构建 应用程序的类型,您可以使用该属性设置目标 仅限要测试的变体。这也防止了测试模块的损坏 不必为自己配置这些变体


格拉德尔 修改你的渐变配置。为了:

  • 设置
    kotlin android
    gradle插件并将其应用于您的项目
  • 添加
    kotlin stdlib
    依赖项
这些动作也可以在IntelliJ IDEA中自动执行/ 通过调用操作:

工具| Kotlin |在项目中配置Kotlin


科特林机器人
科特林标准实验室 别忘了配置:

使用修改依赖项配置

注意:
编译
提供
,以及
apk
目前仍然可用

但是,它们将在的下一个主要版本中删除 Android插件


手动提供版本

从Kotlin 1.1.2开始,具有组的依赖项 默认情况下,
org.jetbrains.kotlin
与所采用的版本一起解析 从应用插件

您可以使用完全依赖项手动提供版本 这样的符号:

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

解决策略

您还可以:

当您使用时:

使用变体API从测试配置中排除应用依赖项:

android.testVariants.all { variant ->
    variant.getCompileConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    variant.getRuntimeConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
}
在以前版本的Android插件上,您可以排除某些 使用exclude 关键词。但是,对于新的依赖项配置,您必须这样做 它在执行时使用变量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标准库 新JDK版本中添加的API函数。而不是
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
相反


科特林反射 如果您的项目使用 或者测试设施,您需要添加相应的依赖项 以及:

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

卡普特 请参阅(
kapt
)的说明

应用
kotlin-kapt
Gradle插件:

apply plugin: 'kotlin-kapt'

Proguard不用于测试。它应该。否则,您如何知道您的代码不会在运行时由于proguard问题而崩溃?在组装apk进行发布而不是测试构建时,会调用proguard。
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7"
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
compile "org.jetbrains.kotlin:kotlin-reflect"
testCompile "org.jetbrains.kotlin:kotlin-test"
testCompile "org.jetbrains.kotlin:kotlin-test-junit"
apply plugin: 'kotlin-kapt'