Java 如何防止ProGuard分离内部枚举

Java 如何防止ProGuard分离内部枚举,java,enums,proguard,inner-classes,android-proguard,Java,Enums,Proguard,Inner Classes,Android Proguard,我正在尝试对一个面向公众的类(MyClass)文件进行保护,该文件包含一个内部枚举(MyInnerEnum)。但是,在进行预处理之后,内部枚举被分离到它自己的类文件MyClass$MyInnerEnum。如何防止ProGuard分离内部枚举?我需要能够使用点表示法访问内部枚举,如MyClass.myinneenum.enum_值,而不使用美元符号,如MyClass$myinneenum.enum_值 我的公开课: package com.myclass; public interface My

我正在尝试对一个面向公众的类(
MyClass
)文件进行保护,该文件包含一个内部枚举(
MyInnerEnum
)。但是,在进行预处理之后,内部枚举被分离到它自己的类文件
MyClass$MyInnerEnum
。如何防止ProGuard分离内部枚举?我需要能够使用点表示法访问内部枚举,如
MyClass.myinneenum.enum_值
,而不使用美元符号,如
MyClass$myinneenum.enum_值

我的公开课:

package com.myclass;

public interface MyClass {
    enum MyInnerEnum {
        ENUM_VALUE
    }
}
我尝试了这些ProGuard配置选项,但没有成功:

<option>-keep enum com.myclass.MyClass** { *; }</option>
<option>-keep enum com.myclass.MyClass$* { *; }</option>
<option>-keep enum com.myclass.MyClass$MyInnerEnum { *; }</option>
-保留enum com.myclass.myclass**{*;}
-保持enum com.myclass.myclass$*{*;}
-保持enum com.myclass.myclass$MyInnerEnum{*;}

您可以通过保留外部类(在您的case接口中)和内部枚举来尝试。通过将以下行添加到proguard配置中,这应该会起作用:

-keep interface com.myclass.MyClass
-keep enum com.myclass.MyClass$MyInnerEnum

我遇到了同样的问题。我通过添加以下内容来解决此问题:

# don't proguard all inner enum, need to cooperate with "-keep enum com.companyname.abcd.ClassName$EnumName"
-keepattributes InnerClasses
...
-keep enum com.myclass.MyClass$MyInnerEnum

将嵌套类放入单独的
.class
文件是标准行为,它与proguard无关。您应该仍然能够使用点。嵌套类总是使用
Outer$Nested
命名模式在字节码中分解成单独的类。根据Java文档,这就是Java编译。这不会改变引用源代码中嵌套类的方式。这不是一个“内部枚举”,而是一个嵌套枚举。接口不能有内部类。JLS§9.5:“接口中的成员类型声明隐式地
公共
静态
”JLS§8.9:“嵌套枚举类型隐式地
静态
”让我们说它不同,java虚拟机不知道嵌套类,换句话说,没有办法将嵌套类设置为字节码级别。(这只是编译器的一个技巧,它添加了一些变量和访问方法,这样编译后的类就可以作为嵌套类工作)。不使用Proguard将导致相同的结构。您不能“阻止Proguard”这样做,因为不是Proguard做的。是java编译器实现了这一点。此外,由于嵌套枚举的定义是静态的(Lew Bloch的注释),所以嵌套它们毫无意义。您可以通过自己在源代码中进行操作来“防止单挑”。