【问题标题】:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'. > java.io.IOException: Please correct the above warnings first任务 ':app:transformClassesAndResourcesWithProguardForRelease' 执行失败。 > java.io.IOException: 请先更正上述警告
【发布时间】:2016-08-16 20:38:04
【问题描述】:

当我尝试在 android studio 1.5.1 中生成签名的 Apk 并完成有关此过程的对话框时,我遇到了此消息并且构建中止:

    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl$Builder
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request$Builder
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Call
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl$Builder
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request$Builder
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Call
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl$Builder
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request$Builder
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
    Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache

build.gradle:

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        ....
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            consumerProguardFiles 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'de.hdodenhof:circleimageview:1.3.0'
    compile 'com.jakewharton:butterknife:8.0.1'
    android{
        useLibrary  'org.apache.http.legacy'
    }
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.onesignal:OneSignal:2.+@aar'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'
    compile 'com.google.android.gms:play-services-analytics:+'
    compile 'com.google.android.gms:play-services-location:+'
    compile 'com.google.android.gms:play-services-appindexing:8.4.0'
    compile 'com.github.lzyzsd:circleprogress:1.1.0@aar'
}

proguard-rules.txt:

    # This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

# Optimizations: If you don't want to optimize, use the
# proguard-android.txt configuration file instead of this one, which
# turns off the optimization flags.  Adding optimization introduces
# certain risks, since for example not all optimizations performed by
# ProGuard works on all versions of Dalvik.  The following flags turn
# off various optimizations known to have issues, but the list may not
# be complete or up to date. (The "arithmetic" optimization can be
# used if you are only targeting Android 2.0 or later.)  Make sure you
# test thoroughly if you go this route.
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify

# The remainder of this file is identical to the non-optimized version
# of the Proguard configuration file (except that the other file has
# flags to turn off optimization).

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

-keep com.squareup.picasso.** { ; }
-dontwarn com.squareup.picasso.*

经过大量搜索,我知道我应该使用-dontwarn com.squareup.picasso.*,但什么也没发生!我仍然有同样的问题。

【问题讨论】:

    标签: java android proguard obfuscation android-proguard


    【解决方案1】:

    您的build.gradle 中有几个错误。让我们修复它们,它应该可以为您解决问题。

    1. Gradle 脚本中的 ProGuard 配置文件定义

    这可能是您的问题的根本原因。您确定使用了您的 ProGuard 配置文件 proguard-rules.txt 吗?因为从构建脚本看来并非如此。你用

    android {
        …
        buildTypes {
            release {
                minifyEnabled true
                consumerProguardFiles 'proguard-rules.txt'
            }
        }
    }
    

    但该配置对应用程序无效,consumerProguardFiles 仅适用于 android 库项目。它告诉库项目将指定的 ProGuard 配置文件打包到输出 aar 中。

    在应用程序中你必须使用

    android {
        ...
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles 'proguard-rules.txt', getDefaultProguardFile('proguard-android.txt')
            }
        }
    }
    

    配置 proguardFiles 告诉构建应用指定的 ProGuard 配置文件。所以这意味着它不是为您的构建定义的。

    请注意,默认的 ProGuard 文件包含所有 Android 应用所必需的一般 Android 规则(一些规则由 Android Gradle 插件添加)。 您似乎将大部分默认规则复制到了配置中。 最佳做法是使用默认的 ProGuard 配置文件,不要将它们复制到您自己的配置中。

    1. 调整 ProGuard 配置规则

    你不需要这条规则

    -keep com.squareup.picasso.** { ; }
    

    添加忽略毕加索警告的规则。您可以使用任一

    -dontwarn com.squareup.okhttp.**
    

    -dontwarn com.squareup.picasso.OkHttpDownloader
    
    1. useLibrary 语句放在正确的位置。

    这是一件小事,但你应该先修复它。不要将useLibrary 放入dependencies 闭包中。它属于android闭包。

    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"
        useLibrary 'org.apache.http.legacy'
        …
    }
    

    顺便说一句:真的建议摆脱HttpClient。最好使用OkHttp

    【讨论】:

      【解决方案2】:

      在 build.gradle 中这样做:

      android {
          compileSdkVersion 23
          buildToolsVersion "23.0.0"
          useLibrary 'org.apache.http.legacy'
          ...
      }
      

      【讨论】:

      • 我将您的代码放入 build.gradle 但此错误出现了 Error:Timeout waiting to lock cp_proj class cache for build file 'C:\Users\A.S.R\AndroidStudioProjects\Teroject\app\build.gradle' (C:\Users\A.S.R\.gradle\caches\2.8\scripts\build_4rnkp3frs7d5k4pjqcgs8zqjt\cp_proj). It is currently in use by another Gradle instance. Owner PID: unknown Our PID: 4812 Owner Operation: unknown Our operation: Initialize cache Lock file: C:\Users\A.S.R\.gradle\caches\2.8\scripts\build_4rnkp3frs7d5k4pjqcgs8zqjt\cp_proj\cache.properties.lock
      • useLibrary 语句的定位是错误的,但这并不能解决问题。
      【解决方案3】:

      这是来自 Jake Wharton 的 Picasso 的答案和 Proguard 配置:

      ### PICASSO
      
      # Checks for OkHttp versions on the classpath to determine Downloader to use.
      -dontnote com.squareup.picasso.Utils
      # Downloader used only when OkHttp 2.x is present on the classpath.
      -dontwarn com.squareup.picasso.OkHttpDownloader
      # Downloader used only when OkHttp 3.x is present on the classpath.
      -dontwarn com.squareup.picasso.OkHttp3Downloader
      
      
      ### OKHTTP
      
      # Platform calls Class.forName on types which do not exist on Android to determine platform.
      -dontnote okhttp3.internal.Platform
      
      
      ### OKIO
      
      # java.nio.file.* usage which cannot be used at runtime. Animal sniffer annotation.
      -dontwarn okio.Okio
      # JDK 7-only method which is @hide on Android. Animal sniffer annotation.
      -dontwarn okio.DeflaterSink
      

      Github issue in Picasso

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-12
        • 2018-07-16
        • 1970-01-01
        • 2016-06-27
        • 2020-05-21
        • 1970-01-01
        • 2016-10-24
        • 2020-03-07
        相关资源
        最近更新 更多