ReDex 是 Facebook 开源的工具,通过对字节码进行优化,以减小 Android Apk 大小,同时提高 App 启动速度。
GitHub:ReDex,官网主页:fbredex.com
去年十月 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 部分,这部分可优化的空间也很大,下次分享相关资料。
关注下面微信公众号 codeKK,回复18
可查看Facebook 的其他 Android 开源库。
-—————————————–
codeKK 专注于开源分享、Android 内推、职业规划
微信扫一扫下面二维码关注
——————————————
alert(‘haha’)
年十月 FacebookJaughnny’s Wireless 就写过一篇文章《Optimizing Android bytecode with ReDex》对其进行介绍,终于在上周 ReDex 开源了。
Facebook 通过线上及线下测试,启动速度提升 20% 以上,Dex 大小减小 25%,对于内存较小的机型启动速度的优化效果尤其明显。
Ok; Bosds -Alles Von Hier im: ” Penthouse”, Ganz legenerale- Playboy.. sexy´st Content womens naked Party Show
http://www.trinea.cn/android/facebook%e5%bc%80%e6%ba%90%e7%9a%84android%e4%bc%98%e5%8c%96%e5%b7%a5%e5%85%b7redex-%e5%87%8f%e5%b0%8f%e5%ae%89%e8%a3%85%e5%8c%85%e5%a4%a7%e5%b0%8f-%e5%90%8c%e6%97%b6%e6%8f%90%e9%ab%98%e8%bf%90/
Matt
请问有没有对Resource部分进行优化的工具或者讨论
补充一下 官网
http://fbredex.com/
https://github.com/facebook/redex
公众号里直接复制过来忘了连接了,我文章加下
全球网
不知道这种 动态技术 在 android 里面 能够走多远.[衰]
这个算是优化技术,大部分应该长期可用
嗯, 谢谢. 我继续努力.
这种Redex方式对已经加过壳的APK还能起到优化作用么?因为感觉原理上它只能对外面的壳进行优化,而且壳本身也没什么东西。
好问题,这块他们应该买考虑到
未优化点是?
最后提到的资源方面