当前位置: 首页 > 知识库问答 >
问题:

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

夏侯浩气
2023-03-14

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

我感谢任何帮助。

共有1个答案

许博
2023-03-14

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

检查有关如何与Proguard一起使用Kotlin的问题和答案。

生成中禁用这些指令。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调试构建,但不调试测试

指定要在仪器测试中使用的ProGuard文件。

RunProGuard是旧的。它被替换为迷你功能

启用minifyEnabled(以及Gradle新版本中的其他更改)后,您可能会遇到Proguard配置适用于调试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')
    }

启用proguard的Android单元测试

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

添加用于测试的BuildType

我已经在我的构建中解决了这个问题,方法是有一个额外的“开发”构建类型,在那里我启用了proGuard,但配置它以将所有代码保留在我自己的包中,以及一些碰巧仅从测试中使用的特定库类。我还在dev build dType中禁用了模糊处理,以便可以从IDE进行调试。

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

使用单独的测试模块

单独的测试模块现在可以感知变体。这意味着不再需要指定Target etVariant。

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

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

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

如果希望测试模块仅针对某个应用程序的特定风格或构建类型,则可以使用matchingFallbacks属性仅针对要测试的变体。这还可以防止测试模块必须为自己配置这些变体。

修改你的渐变配置。为了构建一个用Kotlin编写的Android项目:

  • 设置kotlin androidgradle插件并将其应用于您的项目

在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'

不要忘记配置标准库依赖项:

repositories {
    mavenCentral()
}

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

使用迁移指南修改依赖项配置。

注:compile提供的、以及apk目前仍然可用。

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

手动提供版本

从Kotlin 1.1.2开始,使用grouporg创建依赖项。喷气式飞机。默认情况下,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 {
            ...
        }
    }
}

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

在以前版本的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'
}

静态编程语言标准库的扩展版本

如果您的目标是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反射或测试工具,则还需要添加相应的依赖项:

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

请参见Kotlin注释处理工具(kapt)的说明。

应用kotlin-kaptGradle插件:

apply plugin: 'kotlin-kapt'
 类似资料:
  • 我是一名新的Android学习者,我正在为语言翻译制作我的第一个Android应用程序。在添加了一些依赖项之后,我遇到了一些问题。我该怎么解决这个问题? Gradle同步失败:无法解决配置的所有依赖项: app: dedegRuntimeClasspath。无法确定android.arch.lifecycle的工件: livedata: 1.1.1:脱机模式下没有缓存版本有关详细信息,请参阅IDE

  • 原因是什么? (注意,我提出这个问题是为了记录jOOQ commercial edition在这里关于堆栈溢出的特定答案,因为这是来自用户的一个常见支持请求,而且堆栈溢出会助长这种情况)。

  • 新安装的Android studio 3.1.3在制作新项目和第一次编译时出现了奇怪的依赖错误。 一个无助于解决问题的类似问题。 这个问题在我身上发生过几次,强制https或http也不能解决它

  • 我遇到了一件奇怪的事。我用常春藤检索标签把罐子放在某处。如果我编写如下代码: 它工作正常。但是如果我添加如下内容: 它会抛出“无法解析依赖关系”。有什么建议吗?谢了。

  • 我对Android的Gradle构建有问题。我尝试了很多方法来解决这个问题,但没有什么不起作用。我需要帮助。 Gradle版本:4.4 Gradle插件:3.0.1 错误:无法解析app@serverDebug /compileClasspath的依赖关系:无法解析项目:vksdk_library。 错误:无法解析“”的依存关系:app@mockDebugAndroidTest/compileCl