Java 为什么proguard-keepclassmembers根据类说明符的行为不同?
我一直在调试我正在编写的Android应用程序中的一个ProGuard问题,原因是它删除了从JSON字符串中提取字段所需的字段名。为了确保这些成员保持原名,我添加了以下内容: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.
-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