Java 为什么proguard-keepclassmembers根据类说明符的行为不同?

Java 为什么proguard-keepclassmembers根据类说明符的行为不同?,java,android,proguard,Java,Android,Proguard,我一直在调试我正在编写的Android应用程序中的一个ProGuard问题,原因是它删除了从JSON字符串中提取字段所需的字段名。为了确保这些成员保持原名,我添加了以下内容: -keepclassmembers class com.example.common.regions.** { !static !final !transient <fields>; } 然后我想我不喜欢在ProGuard中指定目录,最好有一个注释来区分这些类 @Target(ElementType.

我一直在调试我正在编写的Android应用程序中的一个ProGuard问题,原因是它删除了从JSON字符串中提取字段所需的字段名。为了确保这些成员保持原名,我添加了以下内容:

-keepclassmembers class com.example.common.regions.** {
    !static !final !transient <fields>;
}
然后我想我不喜欢在ProGuard中指定目录,最好有一个注释来区分这些类

@Target(ElementType.TYPE)
public @interface ProguardKeepClassMembers {
}
然后,我用
@ProguardKeepClassMembers
注释了我的类(不是成员,只是类),并将ProGuard规则更改为:

-keepclassmembers @com.example.common.ProguardKeepClassMembers class * {
    !static !final !transient <fields>;
}

所以。。。为什么只有类匹配器发生更改时-keepclassmembers的行为不同?

ProGuard可能正在删除注释本身,因为代码没有使用它。你应该保留它:

-keep @interface com.example.common.ProguardKeepClassMembers
或者,您可以在jar annotations.jar中收集此类注释,并将其指定为库(无需将其保留在源代码或libs中):

这样,注释类就不会出现在结果代码中,这很好。这是example examples/annotations/examples.pro中的方法(例如在android sdk/tools/proguard中)


另请参阅ProGuard手册>故障排除>处理后的意外观察>

好的,这似乎有效,但它确实阻止ProGuard混淆
.common
包名。此外,ProGuard文档的链接对我来说并不适用——它们总是将我带到顶层框架。(铬v33)
com.example.common.regions.RegionMapMeta -> com.example.b.d.b:
    java.lang.String mapVid -> a
    int mapVersion -> b
    double topLeftLat -> c
    double topLeftLong -> d
    double topRightLat -> e
    double topRightLong -> f
    double bottomLeftLat -> g
    double bottomLeftLong -> h
    double bottomRightLat -> i
    double bottomRightLong -> j
    double boundingTopLat -> k
    double boundingBottomLat -> l
    double boundingLeftLong -> m
    double boundingRightLong -> n
    int minZoom -> o
    int maxZoom -> p
    int maxZoomMinX -> q
    int maxZoomMaxX -> r
    int maxZoomMinY -> s
    int maxZoomMaxY -> t
    int stackOrder -> u
    java.lang.String thumbnailImage -> v
    java.util.Set mapLayers -> w
-keep @interface com.example.common.ProguardKeepClassMembers
-libraryjars annotations.jar