Android build.gradle 使用支持库失败构建

Posted

技术标签:

【中文标题】Android build.gradle 使用支持库失败构建【英文标题】:Android build.gradle using Support Library Failing Build 【发布时间】:2017-03-01 22:51:32 【问题描述】:

我在开发过程中成功构建了我的应用程序的调试版本,尽管伴随着以下警告:

"W/art: Before android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable.

当我进行完整版本构建时,我遇到以下错误:

Error:Execution failed for task   ':app:transformClassesAndResourcesWithProguardForFullRelease'.
> java.io.IOException: Can't write  [/PATH_TO_APP/app/build/intermediates/transforms/proguard/full/release/jar s/3/1f/main.jar] (Can't read  [/PATH_TO_APP/app/build/intermediates/exploded- aar/com.android.support/support- fragment/24.2.1/jars/classes.jar(;;;;;;**.class)] (Duplicate zip entry  [android/support/v4/app/r.class ==  classes.jar:android/support/v4/app/Fragment$1.class]))

我正在合并支持库,以便在 Android 6.0+ 中使用 AppCompat 权限。以下是我的 build.gradle 文件。

apply plugin: 'com.android.application'

android 
    compileSdkVersion 24
    buildToolsVersion '24.0.3'
    useLibrary 'org.apache.http.legacy'
ext 
    supportLibVersion = '24.2.1'


lintOptions 
    abortOnError false


defaultConfig 
    applicationId "com.whatever.appname"
    testApplicationId 'com.whatever.appname'
    versionCode 8
    minSdkVersion 9
    targetSdkVersion 24


buildTypes 
    debug 
        debuggable true
        minifyEnabled false
        signingConfig signingConfigs.debug
    
    release 
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFile 'PATH_TO_PROGUARD/proguard-project.txt'
    


signingConfigs 
    release 
        keyPassword 'PASSWORD'
        storePassword 'PASSWORD'
        keyAlias 'ALIAS'
        storeFile file('PATH_TO_KEYSTORE/keystore_file')
    
    debug 
        keyAlias 'KEY_ALIAS'
        keyPassword 'PASSWORD'
        storePassword 'PASSWORD'
        storeFile file('PATH_TO_DEBUG_KEYSTORE/debug.keystore')
    

productFlavors 
    full 
        versionName '10.6.0'
        applicationId 'com.whatever.appname'
        testApplicationId 'APP_TEST_ID'
        versionCode 8
        proguardFile '/PATH_TO_PROGUARD/proguard-project.txt'
        signingConfig signingConfigs.release
        targetSdkVersion 24
    

compileOptions 
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7


packagingOptions 
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'

dependencies 
    compile 'ch.acra:acra:4.7.0'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:support-compat:24.2.1'
    compile 'com.android.support:support-core-utils:24.2.1'
    compile 'com.android.support:support-core-ui:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.android.support:support-annotations:24.2.1'
    compile fileTree(include: ['*.jar'], dir: 'libs')

在我的 proguard-project.txt 文件中,由于使用了一些已弃用的类,我的应用程序的一些相关和特定条目是:

-keep class org.apache.http.**  *; 
-dontwarn org.apache.commons.**
-dontwarn org.apache.http.**
-dontwarn android.net.http.AndroidHttpClient
-dontwarn com.google.android.gms.**
-dontwarn com.android.volley.toolbox.**
-ignorewarnings

对于那些好奇的人,当我从构建中完全删除 proguard 进程并执行应用程序清理,然后是 fullRelease 构建时,我遇到的错误是不同的:

Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define     Landroid/support/graphics/drawable/AnimatedVectorDrawableCompat$1;

和:

Error:Execution failed for task  ':app:transformClassesWithDexForFullRelease'.
> com.android.build.api.transform.TransformException:   com.android.ide.common.process.ProcessException:    java.util.concurrent.ExecutionException:    java.lang.UnsupportedOperationException

任何人都可以阐明我遇到的错误,并可能提出解决方法吗?当然,理想情况下,我更愿意将 proguard 过程合并到构建过程中。

更新:此外,从命令行运行任何 gradle 任务时,我遇到了错误:

problem occurred evaluating project ':app'.
> java.lang.UnsupportedClassVersionError:   com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0

这让我相信在 AppCompat 或 Support 库的某个地方使用了 Java 8 语言功能,而我正在针对 Java 7 进行编译。

【问题讨论】:

这意味着您的依赖项中的一些依赖项会被添加两次,并且版本冲突。您可能想检查支持库中的 AnimatedVectorDrawableCompat 类,但也可能在其他库中 我认为你是对的,但我认为这是获得正确版本的支持库的问题,如果允许降级支持我们的 appcompat 库有帮助,我愿意为 API 级别 23 构建等 【参考方案1】:

不确定伙计,但如果我是你,我会试着看看这个

compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-compat:24.2.1'

也许 appcompact 和 support compact 并不完全顺利。 尝试删除 appcompact 并使用支持(反之亦然)

希望对你有帮助

【讨论】:

谢谢,我明天先试试,然后建议 我在没有支持库的情况下清理并构建了应用程序,遇到了与删除 Proguard 进程时完全相同的错误。 使用 Navigate > Symbol voice in menu 搜索 AnimatedVectorDrawableCompat 并查看某些库中是否有重复【参考方案2】:

我的问题的解决方案是启用 Java 8 语言功能的配置解决方案,如文档 Use Java 8 Language Features 中所述。

我为解决该问题所采取的具体步骤是: 将以下内容添加到 build.gradle defaultConfig 部分。

jackOptions 
    enabled true

将以下内容分别添加到 build.gradle buildTypes、debug & release:

debug
    shrinkResources false

release 
    shrinkResources false

将 build.gradle sourceCompatability 和 targetCompatability Java 版本从 VERSION_1_7 更改为以下

sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8

在进行这些更改后,我进行了清理和构建,并且能够成功构建应用程序。

【讨论】:

以上是关于Android build.gradle 使用支持库失败构建的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 编译“错误:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.0 及更高版本。”但 build.gradle 中没有 kotlin_version?

android中的build.gradle是干啥用的

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.1——使用Build Types

android studio怎样配置gradle本地路径

android studio 怎么配置gradle

Android知识要点整理(20)----Gradle 之多模块管理