Android编译ClassCastException与Proguard [英] Android compile ClassCastException with Proguard

查看:265
本文介绍了Android编译ClassCastException与Proguard的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用proguard构建一个项目,我得到一个编译时间ClassCastException错误,解决了每个笔记和警告。





Project SDK是Android 4.4.2。



proguard文件:

 #要在项目中启用ProGuard,请编辑project.properties 
#以定义该文件中描述的proguard.config属性。

#在这里添加项目特定的ProGuard规则。
#默认情况下,此文件中的标志附加到指定的标志
#in $ {sdk.dir} /tools/proguard/proguard-android.txt
#您可以编辑include路径和顺序,通过更改project.properties中的ProGuard
#include属性。

#有关详情,请参阅
#http://developer.android.com/guide/developing/tools/proguard.html

#添加任何项目特定保留选项在这里:

-printconfiguration out_config.txt

-verbose

-keepattributes签名
-keepattributes *注释*
-keepattributes异常,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod,SourceFile,LineNumberTable
-renamesourcefileattribute ProGuard

-dontskipnonpubliclibraryclasses



-keep class * extends java.util.ListResourceBundle {
protected java.lang.Object [] [] getContents();
}

#保持反射所需的SafeParcelable值。这是需要支持向后
#一些类的兼容性。
#-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
#public static final *** NULL;
#}

#保留客户端功能所需的类/成员的名称。
#-keepnames @ com.google.android.gms.common.annotation.KeepName class *
#-keepclassmembernames class * {
#@ com.google.android.gms.common.annotation .KeepName *;
#}

#需要Parcelable / SafeParcelable创作者不被剥离
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR ;
}

-keep public class * extends android.view.View {
public< init>(android.content.Context);
public< init>(android.content.Context,android.util.AttributeSet);
public< init>(android.content.Context,android.util.AttributeSet,int);
public void set *(...);
}

-keep class **。R
-keep class **。R $ * {< fields> ;;}


-keep class com.google。**
-dontwarn com.google。**

-keep class com.android。**
-dontwarn com.android。 **

-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

-keep class sun.misc 。不安全{*; }
-dontnote sun.misc.Unsafe

-dontnote com.android.org.conscrypt.OpenSSLSocketImpl
-dontnote com.squareup.okhttp.OkUrlFactory

#-keep public class com.android.vending.licensing.ILicensingService
############################## #########################
#Android支持
-keep界面android.support。** {*; }
-keep class android.support。** {*; }
-dontnote Android.support。**
################################# #######################


############### #########################################
#Apache
-dontwarn org.apache。**
-dontnote org.apache。**


################# #######################################

### ################################################## ###
#Picasso
-dontwarn com.squareup。**
######################### ######################################

########### ############################################
# Joda时间
-dontwarn org.joda。**
-keep class org.joda。** {*;}
############### #########################################

# ################################################## #####
#Simple XML
-keep public class org.simpleframework。** {*; }
-keep class org.simpleframework.xml。** {*; }
-keep class org.simpleframework.xml.core。** {*; }
-keep class org.simpleframework.xml.util。** {*; }
-dontwarn javax.xml.stream。**

########################### #############################

############# ###########################################
#HListView

-keep class it.sephiroth。**
############################## ##########################

################ ##############################################
#Rounded Image View
-keep class com.makeramen.RoundedImageView
-dontwarn com.makeramen.RoundedImageView

##################### ##########################################

-keep class android.view。查看。**

编译时的结果

  ProGuard:[Project] ProGuard,版本4.7 
...
编译完成,20错误和0警告在18秒
20错误
0 warningings
ProGuard:[Project] java.lang.ClassCastException:java.lang.Object不能转换为java.lang.String
ProGuard:[Project] at proguard.obfuscate.MemberObfuscator.newMemberName (MemberObfuscator.java:198)
ProGuard:[Project] at proguard.obfuscate.MemberNameCollector.visitAnyMember(MemberNameCollector.java:74)
ProGuard:[Project] at proguard.classfile.util.SimplifiedVisitor.visitProgramMember (SimplifiedVisitor.java:79)
ProGuard:[Project] at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91)
ProGuard:[Project] at proguard.classfile.visitor.MemberAccessFilter .visitProgramMethod(MemberAccessFilter.java:90)
ProGuard:[Project] at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71)
ProGuard:[Project] at proguard.classfile.ProgramClass.methodsAccept (ProgramClass.java:504)
ProGuard:[Project] at proguard.classfile.visitor.AllMemberVisitor.visitProgramClass(AllMemberVisitor.java:48)
ProGuard:[Project] at proguard.classfile.ProgramClass.accept (ProgramClass.java:346)
ProGuard:[Project] at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:359)
ProGuard:[Project] at proguard.classfile.LibraryClass.hierarchyAccept .java:371)
ProGuard:[Project] at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:416)
ProGuard:[Project] at proguard.classfile.visitor.ClassHierarchyTraveler.visitProgramClass(ClassHierarchyTraveler .java:75)
ProGuard:[Project] at proguard.classfile.visitor.MultiClassVisitor.visitProgramClass(MultiClassVisitor.java:85)
ProGuard:[Project] at proguard.classfile.ClassPool.classesAccept .java:116)
ProGuard:[Project] at proguard.obfuscate.Obfuscator.execute(Obfuscator.java:217)
ProGuard:[Project] at proguard.ProGuard.obfuscate(ProGuard.java:333 )
ProGuard:[Project] at proguard.ProGuard.execute(ProGuard.java:135)
ProGuard:[Project] at proguard.ProGuard.main(ProGuard.java:492)


解决方案

我终于可以解决了。



问题是扩展一个外部库的类,在这种情况下是apache。
在我的proguard配置中,我添加了一个-keep类符号到这个特定的类。

  import org.apache.http .client.methods.HttpPost; 

public class ProjectHttpDelete extends HttpPost {
public ProjectHttpDelete(String url){
super(url);
}

@Override
public String getMethod(){
returnDELETE;
}

}


I'm trying to build a project with proguard and I'm getting a compile time ClassCastException Error, having solved every notes and warnings.

Been trying to solve this for quite a few time and can't find out what can be happening.

The Project SDK is Android 4.4.2.

The proguard file:

# 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:

-printconfiguration out_config.txt

-verbose

-keepattributes Signature
-keepattributes *Annotation*
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,EnclosingMethod,SourceFile,LineNumberTable
-renamesourcefileattribute ProGuard

-dontskipnonpubliclibraryclasses



-keep class * extends java.util.ListResourceBundle {
    protected java.lang.Object[][] getContents();
}

# Keep SafeParcelable value, needed for reflection. This is required to support backwards
# compatibility of some classes.
#-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
#    public static final *** NULL;
#}

# Keep the names of classes/members we need for client functionality.
#-keepnames @com.google.android.gms.common.annotation.KeepName class *
#-keepclassmembernames class * {
#    @com.google.android.gms.common.annotation.KeepName *;
#}

# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keep class **.R
-keep class **.R$* {<fields>;}


-keep class com.google.**
-dontwarn com.google.**

-keep class com.android.**
-dontwarn com.android.**

-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

-keep class sun.misc.Unsafe { *; }
-dontnote sun.misc.Unsafe

-dontnote com.android.org.conscrypt.OpenSSLSocketImpl
-dontnote com.squareup.okhttp.OkUrlFactory

#-keep public class com.android.vending.licensing.ILicensingService
########################################################
#Android Support
-keep interface android.support.** { *; }
-keep class android.support.** { *; }
-dontnote android.support.**
########################################################


########################################################
# Apache
-dontwarn org.apache.**
-dontnote org.apache.**


########################################################

########################################################
# Picasso
-dontwarn com.squareup.**
########################################################

########################################################
#Joda Time
-dontwarn org.joda.**
-keep class org.joda.** {*;}
########################################################

########################################################
#Simple XML
-keep public class org.simpleframework.**{ *; }
-keep class org.simpleframework.xml.**{ *; }
-keep class org.simpleframework.xml.core.**{ *; }
-keep class org.simpleframework.xml.util.**{ *; }
-dontwarn javax.xml.stream.**

########################################################

########################################################
#HListView

-keep class it.sephiroth.**
########################################################

########################################################
#Rounded Image View
-keep class com.makeramen.RoundedImageView
-dontwarn com.makeramen.RoundedImageView

########################################################

-keep class android.view.View.**

The result while compiling

ProGuard: [Project] ProGuard, version 4.7
...
    Compilation completed with 20 errors and 0 warnings in 18 sec
    20 errors
    0 warnings
    ProGuard: [Project] java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.String
    ProGuard: [Project]     at proguard.obfuscate.MemberObfuscator.newMemberName(MemberObfuscator.java:198)
    ProGuard: [Project]     at proguard.obfuscate.MemberNameCollector.visitAnyMember(MemberNameCollector.java:74)
    ProGuard: [Project]     at proguard.classfile.util.SimplifiedVisitor.visitProgramMember(SimplifiedVisitor.java:79)
    ProGuard: [Project]     at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91)
    ProGuard: [Project]     at proguard.classfile.visitor.MemberAccessFilter.visitProgramMethod(MemberAccessFilter.java:90)
    ProGuard: [Project]     at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71)
    ProGuard: [Project]     at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:504)
    ProGuard: [Project]     at proguard.classfile.visitor.AllMemberVisitor.visitProgramClass(AllMemberVisitor.java:48)
    ProGuard: [Project]     at proguard.classfile.ProgramClass.accept(ProgramClass.java:346)
    ProGuard: [Project]     at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:359)
    ProGuard: [Project]     at proguard.classfile.LibraryClass.hierarchyAccept(LibraryClass.java:371)
    ProGuard: [Project]     at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:416)
    ProGuard: [Project]     at proguard.classfile.visitor.ClassHierarchyTraveler.visitProgramClass(ClassHierarchyTraveler.java:75)
    ProGuard: [Project]     at proguard.classfile.visitor.MultiClassVisitor.visitProgramClass(MultiClassVisitor.java:85)
    ProGuard: [Project]     at proguard.classfile.ClassPool.classesAccept(ClassPool.java:116)
    ProGuard: [Project]     at proguard.obfuscate.Obfuscator.execute(Obfuscator.java:217)
    ProGuard: [Project]     at proguard.ProGuard.obfuscate(ProGuard.java:333)
    ProGuard: [Project]     at proguard.ProGuard.execute(ProGuard.java:135)
    ProGuard: [Project]     at proguard.ProGuard.main(ProGuard.java:492)

解决方案

I was finally able to solve it.

The issue was with a class that extended an external library, in this case apache. In my proguard config I added a -keep class notation to this particular class.

import org.apache.http.client.methods.HttpPost;

public class ProjectHttpDelete extends HttpPost {
    public ProjectHttpDelete(String url) {
        super(url);
    }

    @Override
    public String getMethod() {
        return "DELETE";
    }

}

这篇关于Android编译ClassCastException与Proguard的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆