我正在更新我们的项目以使用Gradle 4.1和Android Gradle插件3.0.1。我已将依赖关系配置更新为this documentation,并且项目已成功编译。但是,在编译android测试(assembleAndroidTest
Gradle任务)时,有许多未解析的依赖项(包括Kotlin标准库的顶级函数)。我怀疑Proguard可能会导致这种情况(虽然它在更新Gradle之前没有),但即使添加明确的规则来保持符号/类也没有帮助。我们使用Kotlin 1.2.10和Kotlin-Kapt插件。
我感谢任何帮助。
答案 0 :(得分:0)
我没有使用ProGuard进行调试,但以下答案似乎很有用。 我会在迁移指南之后再次修改Gradle配置,首先是干净且无效的缓存。
了解如何将Kotlin与Proguard一起使用question和answers。
在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'
不要忘记配置standard library dependency:
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib"
}
使用migration guide修改您的依赖项配置。
注意:
compile
,provided
和apk
目前仍然可用。但是,他们将在下一个主要版本中删除 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-jre7
和kotlin-stdlib-jre8
代替。
如果您的项目使用Kotlin reflection 或测试设施,您需要添加相应的依赖项 以及:
compile "org.jetbrains.kotlin:kotlin-reflect" testCompile "org.jetbrains.kotlin:kotlin-test" testCompile "org.jetbrains.kotlin:kotlin-test-junit"
请参阅Kotlin annotation processing tool(kapt
)的说明。
应用kotlin-kapt
Gradle插件:
apply plugin: 'kotlin-kapt'