Android Dex檔案優化庫
ReDex是一個由Facebook開發的Android bytecode(dex)優化庫。它提供了一個讀、寫和分析.dex檔案的框架,並且可以對dex檔案進行優化。經過ReDex優化過的APK檔案通常會體積更小,執行更快。
新增依賴
Mac OS X
安裝Xcode命令列工具:
xcode-select --install
使用Homebrew安裝Redex:
brew install autoconf automake libtool python3
brew install boost double-conversion gflags glog libevent jsoncpp
Ubuntu 14.04 LTS (64-bit)
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
這一步是可選的。可以通過預設的指令碼下載單元測試功能:
./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有什麼不同?
簡而言之ProGuard是從.class檔案到.dex檔案的優化,而ReDex是從.dex檔案到.dex檔案的優化。ProGuard和ReDex各有優勢,官方的建議是兩者都要使用。官方提供的優化資料表明,對比只使用ProGuard的APK減少了25%的體積和冷啟動時間。(我手頭的實測資料比較尷尬,13M多的APK只減少了0.03MB,冷啟動時間沒有明顯變化)
Facebook官方並沒有對使用DexGuard給出優化的建議和資料,並且也沒有支援DexGuard的計劃。
常見錯誤
I’m getting “Couldn’t find zipalign. See README.md to resolve this”
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 ...]
My app fails to install with Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
這是沒有簽名造成的,詳細的解決方案上文有提供。
詳細原理相關的文章,由於時間有限就不在這裡提供了。如各位大佬有需求,以後更新。