proguard 不保留匿名类
Posted
技术标签:
【中文标题】proguard 不保留匿名类【英文标题】:proguard don't keep anonymous class 【发布时间】:2014-05-02 04:47:03 【问题描述】:我在运行时遇到错误:
找不到类“android.support.v7.widget.SearchView$5”, 从方法引用 android.support.v7.widget.SearchView.addOnLayoutChangeListenerToDropDownAnchorSDK11
我试图通过这个 proguard 配置来保留这个类:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep class android.support.v7.widget.SearchView public *;
-keep class android.support.v7.widget.SearchView$*
*;
-keep class android.support.v7.widget.SearchView**
*;
-keep class android.support.v7.widget.SearchView$5
*;
但没有运气。这不是proguard第一次不通过配置保留成员,但是这次我不能重写代码来将匿名转换为内部类。
【问题讨论】:
【参考方案1】:这对我有用(不公开):
-keep class android.support.v7.widget.SearchView *;
【讨论】:
【参考方案2】:确保您在<Android SDK>/tools/proguard
上拥有最新的proguard 版本,然后查看proguard-android.txt
。最新的proguard版本为android提供了更好的配置。
一些可能对您有所帮助的定义:
-dontoptimize
-dontpreverify
-keepclassmembers enum *
public static **[] values();
public static ** valueOf(java.lang.String);
-keep class * implements android.os.Parcelable
public static final android.os.Parcelable$Creator *;
-keepclassmembers class **.R$*
public static <fields>;
【讨论】:
我正在使用最新的 SDK 和完全默认的配置作为你的。但没有一条规则符合我的问题。【参考方案3】:ProGuard 在您的代码或库中找不到类 android.support.v7.widget.SearchView$5。您应该检查 android/support/v7/widget/SearchView$5.class 是否存在于您的支持 jar 中。它似乎存在于我这里的最新版本中,所以您的副本可能已损坏。
请注意,在此处添加 -keep 选项无济于事。 ProGuard 在读取类后立即检查它们之间的依赖关系,然后再使用这些选项。
【讨论】:
以上是关于proguard 不保留匿名类的主要内容,如果未能解决你的问题,请参考以下文章