想讓你的資源文件被混淆嗎?快來試試AndResGuard吧
最近閑下來沒什么事情,遂沒事找事做,試試各種新輪子。AndResGuard是騰訊的 shwenzhang 開源在 github 上的項目,他幫助你縮小APK大小,他的原理類似Java Proguard,但是只針對資源,將原本冗長的資源路徑變短,例如將res/drawable/wechat變為r/d/a。
我選擇通過命令行的方式將包打出,因為之前試用了Tinker,感覺項目被搞得亂七八糟的了。
環境變量的設置
- android環境變量。這個沒啥說的,特別注意build-tools是有版本號區分的,我們要使用其中的zipalign這個優化工具
- 7zip環境變量。由于支持7z極限壓縮,所以需要單獨設置一下。
window: 對于window應下載命名行版本,若將7za指定到環境變量,即無須設置。地址:[http://sparanoid.com/lab/7z/download.html](http://sparanoid.com/lab/7z/download.html) linux:sudo apt-get install p7zip-full mac:brew install p7zip
前期準備
- 下載 AndResGuard ,將其中tool_output文件夾單獨拿出來。
簡單說明一下,jar包不多說了;bat跟sh分別是windows跟linux的執行腳本,這里面的執行命令稍后要進行修改,符合我們自身情況才行;config就是混淆壓縮屬性的配置文件;keystore就是app簽名文件
AndResGuard
- 去除release.keystore,換成我們自己的app簽名文件。
- 修改config.xml配置文件。后面我會結合官方文章進一步說明
- 修改build_apk腳本。由于我是mac,所以只演示了如何修改build_apk.sh
如何寫config配置文件
配置文件中主要有五大項,即 property , whitelist , keepmapping , compress , sign 。
-
Property主要設置一些通用屬性。
-- sevenzip ,是否使用7z重新壓縮簽名后的apk包。前提條件是安裝好7z并且加入環境變量中,同時要求加入簽名信息,不然不使用
-- metaname ,由于重打包時需要刪除簽名信息,考慮到這個文件名可能會被改變,所以使用者可手動輸入簽名信息對應的文件名。默認為META_INF。這個我也不知道是干嘛的
-- keeproot ,是否將res/drawable混淆成r/s。true的話則不會將res/drawable混淆成r/s
-
Whitelist主要是用來設置白名單。
-- isactive ,是否打開白名單功能
-- path ,白名單的列表,格式為package_name.R.type.specname。由于一個resources.arsc中可能會有多個包,所以這里要求寫全包名。同時支持*,?通配符,例如: com.tencent.mm.R.drawable.emoji_*,com.tencent.mm.R.drawable.emoji_?。linux用/, window用\。
注意:
1、 若想通過getIdentifier方式獲得資源,需要放置白名單中。 部分手機桌面快捷圖標的實現有問題,務必將程序桌面icon加入白名單。
2、 對于一些第三方sdk,例如友盟,可能需要將部分資源添加到白名單中。
-
Keepmapping主要用來指定舊的mapping文件,為了保持一致性,我們支持輸入舊的mapping文件,可保證同一資源文件在不同版本混淆后的名稱保持一致。該文件在重打包生成,需額外保存。
-- isactive ,是否打開keepmapping模式
-- path ,舊mapping文件的位置,linux用/, window用\
-
Compress主要用來指定文件重打包時是否壓縮指定文件,默認我們重打包時是保持輸入apk每個文件的壓縮方式(即Stored或者Deflate)。
-- isactive ,是否打開compress模式;
-- path ,需要被壓縮文件的相對路徑(相對于apk最頂層的位置)。
這里path也有幾個注意點:
1、 一定要使用/作為分隔符,同時支持通配符*,?,例如*.png(壓縮所有.png文件),res/drawable/emjio_?.png,resouces.arsc(壓縮 resources.arsc)。
2、 若想得到最大混淆:輸入四項個path:*.png,*.jpg,*.jpeg,*.gif。
3、 若你的resources.arsc原文件小于1M,可加入resourcs.arsc這一項!在2.3版本以下源文件大于1M不能壓縮,若不需要支持低版本,也可以直接加入。
4、 流媒體不能壓縮。但是.png、.jpg是可以壓縮的,只是AssetManger讀取時候的方式不同。
5、 操作系統對7z的影響。實驗證明,linux與mac的7z效果更好
-
Sign主要是對處理后的文件重簽名,需要我們輸入簽名文件位置,密碼等信息。若想使用7z功能就一定要填入相關信息。出于保密不想寫在config.xml,可用-signature命令行設置模式,config.xml中的簽名信息會被命令行覆蓋,這里不再使用
這是我在提供的config.xml上的簡單配置
<?xml version="1.0" encoding="UTF-8"?>
<resproguard>
<issue id="property">
<seventzip value="true"/>
<metaname value="META-INF"/>
<keeproot value="false"/>
</issue>
<issue id="whitelist" isactive="true">
<path value="com.renyu.sostar.R.mipmap.ic_launcher"/>
</issue>
<issue id="keepmapping" isactive="false">
</issue>
<issue id="compress" isactive="false">
<path value="*.png"/>
<path value="*.jpg"/>
<path value="*.jpeg"/>
<path value="*.gif"/>
<path value="resources.arsc"/>
</issue>
<issue id="sign" isactive="true">
<path value="android.keystore"/>
<storepass value="abcd1234"/>
<keypass value="abcd1234"/>
<alias value="android.keystore"/>
</issue>
</resproguard>
使用命令行
打開build_apk.sh進行修改
java -jar AndResGuard-cli-1.1.16.jar input.apk -config config.xml -out outapk -signature release.keystore testres testres testres
最簡單的就是直接java -jar AndResGuard-cli-1.1.16.jar input.apk,此時會讀取運行路徑中的config.xml文件,并將結果輸出到運行路徑中的input.apk中。
下面看看如何自定義
-- config ,指定具體config文件的路徑;
-- out ,指定生成文件具體的輸出路徑,其中混淆的mapping會在輸出文件夾中以resource_mapping_(輸入apk的名稱).txt命名。
-- signature ,指定簽名信息,若在命令行設置會覆蓋config.xml中的簽名信息,順序為簽名文件路徑、storepass、keypass、storealias。
-- mapping , 指定舊的mapping文件,保證同一資源文件在不同版本混淆后的名稱保持一致。若在命令行設置會覆蓋config.xml中的信息。
-- 7zip ,指定7zip的路徑,若已添加到環境變量則不需要設置。此處必須為全路徑,例如linux: /shwenzhang/tool/7za,Windows需要加上.exe 結尾。
-- zipalign ,指定zipalign的路徑,若已添加到環境變量則不需要設置。此處必須為全路徑,例如linux: /shwenzhang/sdk/tools/zipalign,Windows需要加上.exe結尾。
-- repackage ,如果想要出渠道包等需求,我們可能希望利用7zip直接重打包安裝包。
關于渠道包的問題我不是很理解,我覺得通過腳本一樣可以直接遍歷文件夾中的所有apk,分別生成新包
這樣就很明了了,7zip與zipalign路徑都通過環境變量自動可以獲取到,mapping在第一次使用的時候是沒有的,之后使用只要帶上就行了,最后也就是config、out與signature
java -jar AndResGuard-cli-1.1.16.jar app-release.apk -config config.xml -out outapk -signature android.keystore abcd1234 abcd1234 android.keystore
我們得到什么
運行吧
重打包相關信息
執行結果
混淆效果
文件 | 描述 |
---|---|
app-release_signed_7zip_aligned.apk | 若選擇7z重打包模式,將得到一個對齊后可供發布的apk |
app-release_signed_7zip.apk | 若選擇7z重打包模式,將得到一個7z重打包后的apk |
app-release_signed_aligned.apk | 若選擇sign模式,將得到一個對齊后可供發布的apk |
app-release_signed.apk | 若選擇sign模式,將得到一個簽名后的apk |
app-release_unsigned.apk | 處理完成,未重簽名的apk |
resource_mapping_app-release | 資源混淆的mapping文件,keepmapping要保留的 |
resources.arsc | 修改后的resources.arsc文件 |
看看效果
文件大小少了600k,并且混淆完美
參考文章
來自:http://www.jianshu.com/p/bc7b0831e925