无法使用Android Gradle插件3.0.1解决assembleAndroidTest任务的依赖关系

时间:2018-01-09 14:51:19

标签: android gradle kotlin

我正在更新我们的项目以使用Gradle 4.1和Android Gradle插件3.0.1。我已将依赖关系配置更新为this documentation,并且项目已成功编译。但是,在编译android测试(assembleAndroidTest Gradle任务)时,有许多未解析的依赖项(包括Kotlin标准库的顶级函数)。我怀疑Proguard可能会导致这种情况(虽然它在更新Gradle之前没有),但即使添加明确的规则来保持符号/类也没有帮助。我们使用Kotlin 1.2.10和Kotlin-Kapt插件。

我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我没有使用ProGuard进行调试,但以下答案似乎很有用。 我会在迁移指南之后再次修改Gradle配置,首先是干净且无效的缓存。

Proguard的

了解如何将Kotlin与Proguard一起使用questionanswers

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

minifyEnabled false
shrinkResources false

为Kotlin配置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 but not the tests

指定要在检测测试中使用的Proguard文件。

  

runProguard已经过时了。它被minifyEnabled

取代      

使用minifyEnabled(以及Gradle新版本中的其他更改)   可能会遇到Proguard配置适用于您的问题   调试apk但不适用于仪器测试。 apk创建的   instrumentation测试将使用自己的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 Unit Tests with proguard enabled

添加自定义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

  

我已经通过增加一个&#34; dev&#34;来解决我的构建中的这个问题。   buildType我启用proguard,但配置它以保留所有代码   在我自己的包中,以及一些特定的库类   仅用于测试。我也禁用了开发中的混淆   buildType,以便可以从IDE调试。

     

对于调试和发布版本,我使用我的&#34; real&#34; proguard设置   包括混淆和优化。

使用单独的测试模块

  

Separate test modules现在具有变体感知功能。这意味着   不再需要指定targetVariant。

     

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

     

使测试模块仅测试不同的构建类型,而不是   debug one,使用VariantFilter在测试中禁用调试变量   项目,如下所示:

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

如果您希望测试模块仅定位某些风格或构建   您可以使用matchingFallbacks属性来定位应用的类型   只有您要测试的变体。这也会阻止测试模块   从必须为自己配置这些变种。

摇篮

修改您的Gradle配置。为了to build an Android project written in Kotlin

  • 设置kotlin-android gradle插件并将其应用于您的项目。
  • 添加kotlin-stdlib依赖项。
  

这些操作也可以在IntelliJ IDEA /中自动执行   AS通过调用操作:

     

工具| Kotlin |在项目中配置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

不要忘记配置standard library dependency

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib"
}

使用migration guide修改您的依赖项配置。

  

注意: compileprovidedapk目前仍然可用

     

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

手动提供版本

  

从Kotlin 1.1.2开始,与组的依赖关系   默认情况下,org.jetbrains.kotlin使用所采用的版本进行解析   来自应用的插件。

     

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

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

解决方案策略

你也可以force the resolution strategy

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 {
            ...
        }
    }
}

使用Variant API从测试配置中排除应用程序依赖项:

  

在以前版本的Android插件中,您可以排除某些内容   使用排除,您的应用与测试的传递依赖关系   关键词。但是,使用新的依赖关系配置,您必须这样做   它在执行时使用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标准库包含额外的扩展名   用于在新JDK版本中添加的API的函数。代替   kotlin-stdlib,使用以下依赖项之一:

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

在Kotlin 1.1.x 中,使用kotlin-stdlib-jre7kotlin-stdlib-jre8   代替。

Kotlin反思

  

如果您的项目使用Kotlin reflection   或测试设施,您需要添加相应的依赖项   以及:

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

Kapt

请参阅Kotlin annotation processing toolkapt)的说明。

应用kotlin-kapt Gradle插件:

apply plugin: 'kotlin-kapt'