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 不保留匿名类的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle Plugin 2.2.0 ProGuard 开始保留内部类

为啥在匿名类中只能访问最终变量?

内部类和匿名内部类的用法

匿名内部类简要分析

请问JAVA中匿名内部类有啥用,举个例子,谢谢

Java匿名内部类和Lambda表达式