正确的 Proguard 配置以保持静态内部类

Posted

技术标签:

【中文标题】正确的 Proguard 配置以保持静态内部类【英文标题】:Proper Proguard configuration to keep static inner class 【发布时间】:2013-10-22 11:31:18 【问题描述】:

我有以下几点:

public class A extends B 
    static class C 
        Object field1;
        int field2;
        boolean field3;
    

无法通过反射获得 C 类!

我尝试了以下方法:

-keep class com.path.to._class.A$** *;

-keep class com.path.to._class.A$* *;

-keep class com.path.to._class.A$C *;

-keep class com.path.to._class.A$C 
    <fields>;


-keep class com.path.to._class.A$C 
    Object field1;
    int field2;
    boolean field3;

以上都不起作用。我在这里做错了什么吗?

也许值得一提的是 B 扩展了 View...

【问题讨论】:

不用说,不运行 Proguard 就可以了... 【参考方案1】:

所有这些都应该有效(仅 Object -> java.lang.Object)。您可以检查 bin/proguard/seeds.txt 以查看它们是否已列出。否则,您可能正在修改错误的配置文件,或者名称中可能存在拼写错误。

【讨论】:

由于某种原因,添加 -keepattribute InnerClasses 完成了工作,但为什么呢?它也搞砸了其他内部类。 -keep 选项保留类的原始名称,这足以正常反射。选项 -keepattributes InnerClasses 保留仅在不太常见的反射类型中需要的可选属性。所以这取决于你的代码和你得到的错误。【参考方案2】:
-keep public class com.path.to._class.A$C *;

这对我有用,发布得很晚,但仍然可以帮助其他面临这个问题的人

【讨论】:

以上是关于正确的 Proguard 配置以保持静态内部类的主要内容,如果未能解决你的问题,请参考以下文章

Android proguard,保持Inner class的inner class

非静态内部类创建静态实例造成的内存泄漏

静态类和内部类的区别是啥

如果在proguard中包含带有注释的字段,如何保持类的成员不受影响

实现 AsyncTask 的正确方法是啥?静态或非静态嵌套类?

static关键字有何魔法?竟让Spring Boot搞出那么多静态内部类