Android编译ClassCastException与Proguard [英] Android compile ClassCastException with 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屋!