【问题标题】:Android compile ClassCastException with ProguardAndroid 使用 Proguard 编译 ClassCastException
【发布时间】:2015-05-09 19:33:54
【问题描述】:

我正在尝试使用 proguard 构建一个项目,但我得到了一个编译时 ClassCastException 错误,已解决所有注释和警告。

尝试解决这个问题已经有一段时间了,但不知道会发生什么。

项目 SDK 是 Android 4.4.2。

proguard 文件:

# 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.**

编译时的结果

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)

【问题讨论】:

  • 尝试暂时删除protected java.lang.Object[][] getContents(); 位,看看会发生什么。当 ProGuard 运行时,您正在崩溃,这表明它无法解释您的 ProGuard 规则文件中的内容。
  • 删除受保护的 java.lang.Object[][] getContents();甚至整个 -keep 类符号给出相同的结果

标签: android compiler-errors proguard


【解决方案1】:

我终于解决了。

问题在于扩展外部库的类,在本例中为 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() {
        return "DELETE";
    }

}

【讨论】:

    【解决方案2】:

    我通过为每个正在“-dontwarn”的类执行“-keep”来解决它:

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

    【讨论】:

    • 您的示例帮助我获得了更好的异常详细信息。最后我发现,我必须为gson 使用-keep 模型类。在我发现之后,我删除了你的代码。不必要地保留那么多东西是不可取的。
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2015-12-22
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多