ReDex是一个由Facebook开发的Android bytecode(dex)优化库。它提供了一个读、写和分析.dex文件的框架,并且可以对dex文件进行优化。经过ReDex优化过的APK文件通常会体积更小,运行更快。
安装Xcode命令行工具:
xcode-select --install
使用Homebrew安装Redex:
brew install autoconf automake libtool python3
brew install boost double-conversion gflags glog libevent jsoncpp
sudo apt-get install \
g++ \
automake \
autoconf \
autoconf-archive \
libtool \
libboost-all-dev \
libevent-dev \
libdouble-conversion-dev \
libgoogle-glog-dev \
libgflags-dev \
liblz4-dev \
liblzma-dev \
libsnappy-dev \
make \
zlib1g-dev \
binutils-dev \
libjemalloc-dev \
libiberty-dev \
libjsoncpp-dev
从Github下载ReDex:
git clone https://github.com/facebook/redex.git
cd redex
使用自带的配置编译并安装Redex
autoreconf -ivf && ./configure && make
sudo make install
这一步是可选的。可以通过预设的脚本下载单元测试功能:
./test/setup.sh
cd test
make check
运行下面的代码:
redex path/to/your.apk -o path/to/output.apk
这里的your.apk是编译打包过的Release版本,没有意外的话就会得到output.apk。但是这里得到的apk是没有签名的,这时安装会出现My app fails to install with Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误,你需要对apk重新签名。
ReDex也提供了签名的功能,如果只是想用debug key签名的话,命令如下:
redex --sign [ ... arguments ...]
如果想要用指定的Key签名的话,输入以下命令:
--sign Sign the apk after optimizing it
-s [KEYSTORE], --keystore [KEYSTORE]
-a [KEYALIAS], --keyalias [KEYALIAS]
-p [KEYPASS], --keypass [KEYPASS]
简而言之ProGuard是从.class文件到.dex文件的优化,而ReDex是从.dex文件到.dex文件的优化。ProGuard和ReDex各有优势,官方的建议是两者都要使用。官方提供的优化数据表明,对比只使用ProGuard的APK减少了25%的体积和冷启动时间。(我手头的实测数据比较尴尬,13M多的APK只减少了0.03MB,冷启动时间没有明显变化)
Facebook官方并没有对使用DexGuard给出优化的建议和数据,并且也没有支持DexGuard的计划。
zipalign是Android SDK提供的优化工具,需要告诉ReDex Android SDK的路径。例如:SDK的路径是:/path/to/android/sdk,命令如下:
ANDROID_SDK=/path/to/android/sdk redex [... arguments ...]
当然也可以把zipalign配置到环境变量里面:
PATH=/path/to/android/sdk/build-tools/xx.y.zz:$PATH redex [... arguments ...]
这是没有签名造成的,详细的解决方案上文有提供。
详细原理相关的文章,由于时间有限就不在这里提供了。如各位大佬有需求,以后更新。