我最近第一次启用了Proguard的混淆功能,它似乎发现了我的-keep规则中的所有漏洞。
我的保存规则是使用注释来定义的:带注释的元素将被单独保留。接下来的配置如下所示:
# Keep the annotation.
-keep @interface org.mozilla.gecko.mozglue.JNITarget
# Keep classes tagged with the annotation.
-keep @org.mozilla.gecko.mozglue.JNITarget class *
# Keep all members of an annotated class.
-keepclassmembers @org.mozilla.gecko.mozglue.JNITarget class * {
*;
}
# Keep annotated members of any class.
-keepclassmembers class * {
@org.mozilla.gecko.mozglue.JNITarget *;
}
# Keep classes which contain at least one annotated element. Split over two directives
# because, according to the developer of ProGuard, "the option -keepclasseswithmembers
# doesn't combine well with the '*' wildcard" (And, indeed, using it causes things to
# be deleted that we want to keep.)
-keepclasseswithmembers class * {
@org.mozilla.gecko.mozglue.JNITarget <methods>;
}
-keepclasseswithmembers class * {
@org.mozilla.gecko.mozglue.JNITarget <fields>;
}所有从反射/JNI/等到Java的入口点都用这个注释(或者配置得相当的,但更好的名称)来注释。
不幸的是,这并没有阻止Proguard将使用的类重命名为方法的返回类型,从而改变了它的签名并破坏了入口点。
例如,Javap揭示了具有签名的方法:
public org.mozilla.gecko.Tab loadUrl(java.lang.String);从护卫出来看上去:
public mt loadUrl(java.lang.String);尽管有注解。
那么,保持依赖类的神秘-keep语法是什么?奇怪的是,当我告诉它我想保留一个入口,它会继续破坏它。
发布于 2014-07-23 00:36:03
这就是预期的行为。在早期版本中,ProGuard会自动保留所有返回类型和参数类型,但对许多开发人员来说,这是不必要的和令人困惑的。
例如,对于使用Class#getMethod的反射,返回类型与此无关。
如果没有保留这样的类型,ProGuard现在会打印注释。然后,您仍然可以为它添加一个-keep行。
请参阅ProGuard手册>疑难解答> 注意:配置保留入口点‘.’,而不保留描述符类‘.’。
更新:
ProGuard 5.0 beta3和更高的支持
-keep,includedescriptorclasses .......还可以自动将类保留在指定的字段类型、返回类型和参数类型中。
https://stackoverflow.com/questions/24882343
复制相似问题