proguard 是不是将所有枚举转换为 int 或需要为此配置

Posted

技术标签:

【中文标题】proguard 是不是将所有枚举转换为 int 或需要为此配置【英文标题】:Does proguard converts all enums to int or needs to be configured for thisproguard 是否将所有枚举转换为 int 或需要为此配置 【发布时间】:2015-11-21 02:20:45 【问题描述】:

proguard 是否会自动将枚举转换为整数以进行内存优化,或者我必须对其进行配置才能做到这一点? 如果我必须配置,配置是什么?

【问题讨论】:

【参考方案1】:

优化在 ProGuard 的optimizations page 中列出。它似乎是默认优化之一,但如果您需要更多控制(例如禁用除枚举拆箱之外的所有 class/* 优化),则可以明确指定它(与其他优化一样)。

类/拆箱/枚举

尽可能将枚举类型简化为整数常量。

【讨论】:

我刚试过这个并反编译了代码,但是一个简单的枚举类(只有枚举,没有字段)仍然显示为枚举而不是 int。有什么我做错了吗?我正在使用“proguard-android-optimize.txt”文件。 @ThomasVos 请注意,该文件的默认规范为keep static class members on enums,这可能会干扰拆箱。我会先尝试删除它,只要您不使用 values() 方法或 String 转换(这几乎限制了您进行相等检查)。 感谢您的回复。我已经通过将文件复制到我的源代码中删除了这些行,并删除了 gradle 中的 android proguard 规则文件。但是,枚举仍然出现在反编译的代码中。 @ThomasVos 我也尝试验证枚举转换,但它第一次失败了。但我设法强制转换。看看这个仓库github.com/maxim-pandra/ProguardEnumIntDefTest @MaksimTuraev “强制转换”是什么意思?我已经检查了那个 repo,它似乎仍然没有将枚举转换为整数。【参考方案2】:

Proguard 设置

Proguard 需要如下配置:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

注意包含proguard-android-optimize.txt 文件而不是proguard-android.txt 文件。

ProguardEnumIntDefTest 是 Github 上的一个示例项目,它试图找出 Proguard 是否将枚举转换为整数。


优化

为了让 Proguard 优化 enumenum 不应该有方法和关联的值(字段)。 Proguard 将这些简单的枚举转换为整数,因此,您可以在编译时获得枚举的类型安全性以及在运行时获得整数的性能!


【讨论】:

以上是关于proguard 是不是将所有枚举转换为 int 或需要为此配置的主要内容,如果未能解决你的问题,请参考以下文章

将作用域枚举转换为 int

如何将枚举泛型类型的变量转换为 int 并返回

c#中怎么将string转化为枚举

将带有 [DescriptionAttribute] 的枚举转换为 Dictionary<string,int> [重复]

C# Enum,Int,String的互相转换 枚举转换

C# Enum,Int,String的互相转换 枚举转换