1. 程式人生 > >Android Dex檔案優化庫

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]

這是沒有簽名造成的,詳細的解決方案上文有提供。

詳細原理相關的文章,由於時間有限就不在這裡提供了。如各位大佬有需求,以後更新。