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