想讓你的資源文件被混淆嗎?快來試試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

  1. Property主要設置一些通用屬性。

    -- sevenzip ,是否使用7z重新壓縮簽名后的apk包。前提條件是安裝好7z并且加入環境變量中,同時要求加入簽名信息,不然不使用

    -- metaname ,由于重打包時需要刪除簽名信息,考慮到這個文件名可能會被改變,所以使用者可手動輸入簽名信息對應的文件名。默認為META_INF。這個我也不知道是干嘛的

    -- keeproot ,是否將res/drawable混淆成r/s。true的話則不會將res/drawable混淆成r/s

  2. 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,例如友盟,可能需要將部分資源添加到白名單中。

  3. Keepmapping主要用來指定舊的mapping文件,為了保持一致性,我們支持輸入舊的mapping文件,可保證同一資源文件在不同版本混淆后的名稱保持一致。該文件在重打包生成,需額外保存。

    -- isactive ,是否打開keepmapping模式

    -- path ,舊mapping文件的位置,linux用/, window用\

  4. 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效果更好

  5. 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,并且混淆完美

參考文章

如何使用資源混淆工具

安裝包立減1M--微信Android資源混淆打包工具

 

來自:http://www.jianshu.com/p/bc7b0831e925

 

 本文由用戶 ifuqiang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!