android - android studio中的proguard错误

Posted

技术标签:

【中文标题】android - android studio中的proguard错误【英文标题】:android - proguard error in android studio 【发布时间】:2015-12-08 17:11:12 【问题描述】:

我想为我的应用程序使用 proguard,我启用了它,但是当我想生成 apk 文件时,它给了我这个错误:

    Information:Gradle tasks [:app:assembleRelease]
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:checkReleaseManifest
:app:preDebugBuild UP-TO-DATE
:app:prepareComandroidSupportAppcompatV72300Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72300Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72300Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42300Library UP-TO-DATE
:app:prepareJpWasabeefRecyclerviewAnimators122Library UP-TO-DATE
:app:prepareReleaseDependencies
:app:compileReleaseAidl UP-TO-DATE
:app:compileReleaseRenderscript UP-TO-DATE
:app:generateReleaseBuildConfig UP-TO-DATE
:app:generateReleaseAssets UP-TO-DATE
:app:mergeReleaseAssets UP-TO-DATE
:app:generateReleaseResValues UP-TO-DATE
:app:generateReleaseResources UP-TO-DATE
:app:mergeReleaseResources UP-TO-DATE
:app:processReleaseManifest UP-TO-DATE
:app:processReleaseResources UP-TO-DATE
:app:generateReleaseSources UP-TO-DATE
:app:processReleaseJavaRes UP-TO-DATE
:app:compileReleaseJava UP-TO-DATE
:app:compileReleaseNdk UP-TO-DATE
:app:compileReleaseSources UP-TO-DATE
:app:lintVitalRelease
:app:proguardRelease
Note: there were 7 duplicate class definitions.
      (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)
Warning:library class org.apache.http.conn.scheme.LayeredSocketFactory extends or implements program class org.apache.http.conn.scheme.SocketFactory
Warning:org.acra.ErrorReporter: can't find referenced method 'void setLatestEventInfo(android.content.Context,java.lang.CharSequence,java.lang.CharSequence,android.app.PendingIntent)' in library class android.app.Notification
Warning:library class android.webkit.WebView depends on program class android.net.http.SslCertificate
Warning:library class org.apache.http.conn.ssl.SSLSocketFactory depends on program class org.apache.http.conn.scheme.HostNameResolver
Warning:library class org.apache.http.conn.ssl.SSLSocketFactory depends on program class org.apache.http.params.HttpParams
Warning:library class org.apache.http.params.HttpConnectionParams depends on program class org.apache.http.params.HttpParams
Warning:there were 17 instances of library classes depending on program classes.
         You must avoid such dependencies, since the program classes will
         be processed, while the library classes will remain unchanged.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency)
Warning:there were 1 unresolved references to library class members.
         You probably need to update the library versions.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
:app:proguardRelease FAILED
Error:Execution failed for task ':app:proguardRelease'.
> java.io.IOException: Please correct the above warnings first.

我正在使用最新版本的 sdk 23,这是我的 gradle 文件:

    apply plugin: 'com.android.application'

android 
    compileSdkVersion 23
    buildToolsVersion '23.0.0'

    defaultConfig 
        applicationId "com.x.x"
        minSdkVersion 11
        targetSdkVersion 23
    

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




dependencies 
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'com.android.support:recyclerview-v7:23.0.0'
    compile files('libs/acra-4.5.0.jar')
    compile files('libs/universal-image-loader-1.8.4-with-sources.jar')
    compile files('libs/org.apache.http.legacy.jar')
    compile 'com.android.support:cardview-v7:23.0.0'
    compile 'jp.wasabeef:recyclerview-animators:1.2.2'
    compile 'com.android.support:design:23.0.0'

怎么了?这段代码我哪里做错了?

谢谢

【问题讨论】:

我想知道您的依赖项` compile files('libs/org.apache.http.legacy.jar')` ...如果您使用的是旧版 apache 库,则不要'不需要 jar,您只需将 useLibrary 'org.apache.http.legacy' 添加到您的 android 部分。 【参考方案1】:

只需在 proguard 上添加:

-keep class org.apache.http.**  *; 
-dontwarn org.apache.http.**
-dontwarn android.net.**

【讨论】:

你能解释一下这是如何工作的,因为我从今天开始使用 proguard 【参考方案2】:

正如您在 logcat 中提到的那样检查 http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

您的应用程序依赖项中有重复的类定义,这只是警告。

现在如果您想修复它,请在您的 proguard-android.txt 中添加以下代码:

# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in $sdk.dir/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the javascript interface
# class:
-dontwarn com.google.code.**
-dontwarn  org.apache.**
-dontwarn  jp.wasabeef.recyclerview.**
-dontwarn  com.nostra13.universalimageloader.**
-dontwarn  org.acra.** 

#wasabeef recyclerview
-keep class jp.wasabeef.recyclerview.**  *; 
-keepattributes Signature
#HTTP Legacy
-keep class org.apache.**  *; 
-keepattributes Signature
#Universal Image Loader
-keep class com.nostra13.universalimageloader.**  *; 
-keepattributes Signature
#Acra
-keep class org.acra.**   *; 
-keepattributes Signature
#Support libraries
-keep class com.android.**  *; 
-keepattributes Signature





# Keep the annotations
-keepattributes *Annotation*


-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''


-dontnote com.android.vending.licensing.ILicensingService

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepclassmembers class * implements java.io.Serializable 
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();


# Preserve all native method names and the names of their classes.
-keepclasseswithmembernames class * 
    native <methods>;


-keepclasseswithmembernames class * 
    public <init>(android.content.Context, android.util.AttributeSet);


-keepclasseswithmembernames class * 
    public <init>(android.content.Context, android.util.AttributeSet, int);


# Preserve static fields of inner classes of R classes that might be accessed
# through introspection.
-keepclassmembers class **.R$* 
  public static <fields>;


# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * 
    public static **[] values();
    public static ** valueOf(java.lang.String);


-keep public class * 
    public protected *;


-keep class * implements android.os.Parcelable 
  public static final android.os.Parcelable$Creator *;

注意:proguard-android.txt 位置 -> android-sdk-path\tools\proguard

谢谢。!!

【讨论】:

哇,这是一个巨大的 proguard 文件..您认为与问题相关的重要部分是什么?

以上是关于android - android studio中的proguard错误的主要内容,如果未能解决你的问题,请参考以下文章

android studio中怎么设置点击按钮响应?

android studio怎么查看ddms

android studio v4包冲突

android studio application怎么创建

如何在android studio中建立一个html文件

android-gif-drawable在android studio上怎么配置