首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止Proguard删除返回类型?

如何阻止Proguard删除返回类型?
EN

Stack Overflow用户
提问于 2014-07-22 08:25:49
回答 1查看 682关注 0票数 2

我最近第一次启用了Proguard的混淆功能,它似乎发现了我的-keep规则中的所有漏洞。

我的保存规则是使用注释来定义的:带注释的元素将被单独保留。接下来的配置如下所示:

代码语言:javascript
复制
# 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揭示了具有签名的方法:

代码语言:javascript
复制
 public org.mozilla.gecko.Tab loadUrl(java.lang.String);

从护卫出来看上去:

代码语言:javascript
复制
 public mt loadUrl(java.lang.String);

尽管有注解。

那么,保持依赖类的神秘-keep语法是什么?奇怪的是,当我告诉它我想保留一个入口,它会继续破坏它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-23 00:36:03

这就是预期的行为。在早期版本中,ProGuard会自动保留所有返回类型和参数类型,但对许多开发人员来说,这是不必要的和令人困惑的。

例如,对于使用Class#getMethod的反射,返回类型与此无关。

如果没有保留这样的类型,ProGuard现在会打印注释。然后,您仍然可以为它添加一个-keep行。

请参阅ProGuard手册>疑难解答> 注意:配置保留入口点‘.’,而不保留描述符类‘.’。

更新:

ProGuard 5.0 beta3和更高的支持

代码语言:javascript
复制
-keep,includedescriptorclasses .......

还可以自动将类保留在指定的字段类型、返回类型和参数类型中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24882343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档