Android爬坑记

AndroidX - Program type already

2019-11-01  本文已影响0人  葛糖糖

最近在将项目迁移到Androidx的时候,通过Refactor - > Migrate to AndroidX,然后选择Do Refactor ,等编译完运行的时候报了下面的错误

Caused by: com.android.builder.multidex.D8MainDexList$MainDexListException: com.android.tools.r8.errors.CompilationError: Program type already present: androidx.annotation.AnimRes
        at com.android.builder.multidex.D8MainDexList.generate(D8MainDexList.java:87)
        at com.android.build.gradle.internal.transforms.D8MainDexListTransform.transform(D8MainDexListTransform.kt:128)
        ... 127 more

使用 ./gradlew app:dependencies 发现有好几个library都依赖了androidx.annotation:annotation



这是项目中依赖的一部分library:

//Android
implementation "androidx.constraintlayout:constraintlayout:$constraintLayout"
implementation "androidx.cardview:cardview:$androidX"
implementation "androidx.recyclerview:recyclerview:$androidX"
implementation "androidx.annotation:annotation:1.0.0"
​
//Material
implementation "com.google.android.material:material:$material"
​
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle"

发现defaultConfig中在migrate 的时候多加了两行代码:



试着删除这两行代码发现可以解决Program type already present: androidx.annotation..的问题.

renderscriptTargetApi - 指定生成的字节码版本。我们建议你设置这个值为能够提供你正在使用的所有功能的最低API级别,同时设置renderscriptSupportModeEnabled为true。这个设置的有效值为11到最近发布的API级别值。如果你的应用程序配置文件里面指定的最小SDK版本设置为不同的值,那这个值将会被忽略,构建文件中的目标版本值用来设置最低SDK版本。
renderscriptSupportModeEnabled - 如果运行的设备不支持该目标版本,那么可以指定生成的字节码回落到一个兼容的版本。
buildToolsVersion - Android 构建工具所使用的版本。这个值应该被设置为18.1.0或者更高。如果这个可选的配置没有被指定,那么将会默认使用安装的最高版本的构建工具。你应该总是设置这个值,以确保不同开发设备不同配置之间的一致性。

或者你可以更暴力一点直接在build.gradle 中添加一下代码也可以解决问题:

android {
 //bala bala bala
}
​
configurations {
 compile.exclude group: 'androidx.annotation', module: 'annotation'
}
​
dependencies {
// bala bala bala
}

希望对你有帮助~~

上一篇下一篇

猜你喜欢

热点阅读