我是怎样优化 Android 工程中的 Enum的

来源:互联网 发布:情定三生知夏恢复记忆 编辑:程序博客网 时间:2024/05/18 00:22

转载请注明出处:
http://blog.csdn.net/brucehurrican/article/details/62883396

学过 Java 的人都知道,enum 可以方便的用于参数校验,类型检测,常量声明等场景。之前我接手维护一个app工程,发现其中代码有很多 enum,此时功能不多的 app 的安装包则高达 20+M,急需要 apk瘦身。除了通用的图片压缩,降低分辨率来瘦身外。针对代码层面,我还进行了,enum 改造,改一点测一点,逐步将工程中的 enum 全部替换掉。写下此文全当是个总结吧。

AA.java

public class AA {    private void checkParam(String msg) {        Log.d("AA", msg);    }}

这是最简单一个参数校验方法。编译后的 AA.class 文件大小为 505B 记为 originalFileSize = 505。
为了限定 msg 只能输入特定的信息,用 enum 写法如下

public class AA {    public enum Info {        JAVA, ANDROID    }    private void checkParam(Info msg) {        Log.d("AA", msg.toString());    }}

这样保证 msg 只能输入 JAVA, ANDROID这两种了。编译后的 AA.class 文件大小 658B, 同时编译后还生成了 AA$Info.class 文件大小为 1KB,记为 enumFileTotalSize = 658 + 1024。

通过 Android 注解的方式来改造 enum

public class AA {    private void checkParam(@paramType String msg) {        Log.d("AA", msg);    }    @Retention(RetentionPolicy.SOURCE)    @StringDef({"JAVA", "ANDROID"})    private @interface paramType{    }}

这样编译后的 AA.class 文件大小为 593B,同时生成了 AA$paramType.class 文件大小为 371B,记为 annotationFileTotalSize = 593 +371

最终比较结果:
originalFileSize = 505B,enumFileTotalSize = 658 + 1024 = 1682B, annotationFileTotalSize = 593 +371 = 964 B

通过数据比较可以明显看到,为了达到限定入参类型分别采用枚举法和注解法,对原有文件的体积大小增长比为233% 和 91%,采用枚举法比采用注解法造成最终编译后的文件体积大小多了 74%。
以上述 demo 为例,注解法比枚举法会有74%的瘦身效果。

按照 google 官方推荐的性能优化方案,也不推荐使用枚举法,so 还是赶紧使用注解来代替枚举吧~

0 0
原创粉丝点击