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

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

我感谢任何帮助。

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

Proguard的

关于如何使用Kotlin和Proguard来回答这个问题和答案 。

在你的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 { ; } -keepclassmembers class kotlin.Metadata { public ; } -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而不适用于仪器测试的问题。 为仪器测试创建的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') } 

Androidunit testing启用了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,但是配置它将所有的代码保存在我自己的包中,还有一些特定的库类只是从测试中使用。 我也在开发buildType中禁用模糊处理,以便它可以从IDE调试。

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

使用单独的测试模块

独立的测试模块现在可以识别变体。 这意味着指定targetVariant不再是必需的。

测试模块中的每个变体都将尝试测试目标项目中的匹配变体。 默认情况下,测试模块只包含一个调试版本,但是您可以创建新的版本types和新的版本以创建新的版本以匹配测试的应用项目。 为每个变体创建connectedCheck任务。

为了使测试模块仅测试一个不同的构建types,而不是测试模块,请使用VariantFilter在测试项目中禁用调试变体,如下所示:

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

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


摇篮

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

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

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

工具| Kotlin | 在Project中配置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" } 

使用迁移指南修改您的依赖关系配置。

注意: compileprovidedapk目前仍然可用

但是,他们在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标准库的扩展版本,其中包含用于添加到新JDK版本中的API的附加扩展function。 使用下列依赖项之一而不是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


Kotlinreflection

如果您的项目使用Kotlinreflection或测试工具,则还需要添加相应的依赖关系:

 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'