无法使用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" }
使用迁移指南修改您的依赖关系配置。
注意:
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标准库的扩展版本,其中包含用于添加到新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-jre7
和kotlin-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'