Facebook App 优化工具 ReDex 优化的 6 点及未优化的一大方面
ReDex 是 Facebook 开源的工具,通过对字节码进行优化,以减小 Android Apk 大小,同时提高 App 启动速度。
去年十月 Facebook 就写过一篇文章《Optimizing Android bytecode with ReDex》对其进行介绍,终于在上周 ReDex 开源了。
Facebook 通过线上及线下测试,启动速度提升 20% 以上,Dex 大小减小 25%,对于内存较小的机型启动速度的优化效果尤其明显。
一. 设计介绍
1. 基于 Dex 的优化
ReDex 是基于 Dex 文件的字节码进行优化,从上图 Android 编译过程我们可以看出,Java 源文件经过 Java 编译器转换为 .class 文件,再转换为虚拟机字节码和三方库一起转换为 dex 文件。
Dex 优化相比基于源码或者 Java 字节码的好处是:
(1) 可以最大限度的从全局以及类间进行优化;
(2) 可以类似于 C 在编译最后的 Linking 阶段做优化一样进行优化。
PS:Proguard 就是基于 Java 字节码的优化。
2. 基于管道的优化过程设计
ReDex 设计时将优化过程分为不同阶段,类似污水处理分为机械处理-生物处理-深度处理等阶段,每个阶段可当做优化插件进行插拔(取舍),并可以跟在其他不相关的阶段后面,这样的好处有:
(1) 方便多个优化阶段并行开发;
(2) 方便后续添加新的优化阶段以及开源接受更多的优化;
(3) 用户可以通过配置方便的决定用哪些优化。
二. 6 个优化点介绍
ReDex 主要的优化在于减小 APK 大小以及提高启动速度,分为 6 大点:
1. 基于反馈(启动加载顺序测试)的 Class 字节码布局
类字节码在单个 Dex 中的布局是根据编译顺序而不是运行时行为决定,即便 Multidex 会将 App 定义的组件以及部分启动需要的类放在 Main Dex 中,但依然不是根据运行时顺序布局,这会导致程序启动时需要查找随机分布在 Dex 中的类。
ReDex 会将 APK 在 Lab 中试运行,并跟踪启动时哪些类需要加载,然后将这些类字节码放到 Dex 前部,减少启动时从闪存中寻找类的时间,从而提高 App 启动速度。
2. 混淆和压缩
跟 JS 的压缩以及 Android 的 Proguard 类似。
3. 内联函数
将一些函数直接展开到调用它的函数中,减少函数调用切换的时间消耗。
4. 删除无用的 interfaces
删除只有一个实现的接口,用实现直接代替。一定程度加快函数调用时间,并减少内存空间以及函数引用。
5. 删除无用代码
通过类似早期内存回收的标记-删除策略,删除无用代码。
6. 删除 metadata
metadata 的一些数据在运行中并不需要,用 Dex 中已有的字符串代替源文件引用以及删除无用的注解来减小 Dex 大小。
ReDex 自身的运行速度很快,虽然是针对 Dex 的优化,但接受 APK 参数,方便与已有编译系统集成。
三. 注意事项
1. 对于不能删除的代码需要额外配置,如 JNI 调用、反射、(布局文件中调用?)等特殊情况。
2. 签名后的 APK ReDex 处理后需要重新签名,因为 Dex 文件已经发生变化。
3. 某些优化阶段如混淆会影响堆栈输出
虽然 ReDex 会有类似 Proguard 的 mapping 文件提供,但目前应该没有什么 Bug 收集平台能对他进行支持,慎用。
四. 配置
1. 可通过 -c 指定具体的优化阶段配置文件
redex -c oppass.config -o tmp/output.apk input.apk其中 oppass.config 可类似于 ReDex 源码下 config/default.config 文件,用于配置采用哪些优化阶段。
2. 每个优化阶段可以单独做额外的配置
比如上面说的需要反射的类不能删除,文件路径缩略配置表,启动时先后加载的类列表。
3. Proguard 文件列表
通常情况下,ReDex 会和 Proguard 一起对 APK 进行优化,并且运行在 Proguard 后,通过 Proguard 文件列表的配置 ReDex 就可正确识别混淆后的类。
五. 其他优化
从 Android 编译过程图中我们也可以看出,APK 包除了 Dex 文件外,还包含 Resource 部分,这部分可优化的空间也很大,下次分享相关资料。
建议继续学习:
- Facebook 网站架构 (阅读:9743)
- facebook 的工程师文化 (阅读:6227)
- Facebook 的系统架构 (阅读:4976)
- 谈谈Facebook的聊天系统架构 (阅读:4527)
- Facebook性能大提升的秘密:HipHop (阅读:4341)
- Facebook是如何开发软件的 (阅读:3650)
- 以Facebook为案例剖析科技公司应有的工具文化 (阅读:3513)
- 在信息架构层次对比开心网和Facebook的设计 (阅读:3174)
- 《打造 Facebook》笔记 (阅读:3008)
- Facebook的用户体验评判规则 (阅读:2572)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Trinea 来源: Trinea
- 标签: ReDex Facebook
- 发布时间:2016-04-20 13:13:14
- [67] Go Reflect 性能
- [67] Oracle MTS模式下 进程地址与会话信
- [67] 如何拿下简短的域名
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [60] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [47] 界面设计速成