proguard不保持匿名课程

时间:2014-03-24 17:08:08

标签: android proguard

我在运行时遇到错误:

  

无法找到课程' 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 {
    *;
}

但没有运气。这不是第一次通过配置来保持成员,但这次我不能重写代码以将匿名转换为内部类。

3 个答案:

答案 0 :(得分:7)

这对我有用(没有公开):

 -keep class android.support.v7.widget.SearchView { *; }

答案 1 :(得分:0)

确保您在<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>;
}

答案 2 :(得分:0)

ProGuard在您的代码或库中找不到类android.support.v7.widget.SearchView $ 5。你应该检查你的支持jar中是否存在android / support / v7 / widget / SearchView $ 5.class。它似乎出现在我这里的最新版本中,所以也许你的副本已经损坏了。

请注意,添加-keep选项在这里无济于事。在使用这些选项之前,ProGuard会立即检查类之间的依赖关系。