Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android資源混淆工具使用說明

Android資源混淆工具使用說明

編輯:關於Android編程

本篇博客內容轉自 github: https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md

本文主要是講述資源混淆組件的用法以及性能,資源混淆組件不涉及編譯過程,只需輸入一個apk(無論簽名與否,debug版,release版均可,在處理過程中會直接將原簽名刪除),可得到一個實現資源混淆後的apk(若在配置文件中輸入簽名信息,可自動重簽名並對齊,得到可直接發布的apk)以及對應資源ID的mapping文件。同時可在配置文件中指定白名單,壓縮文件(支持*,?通配符),支持自動簽名,保持舊mapping,7z重打包,對齊等功能。 本工具支持Linux、Window跨平台使用,但測試表示若使用7z壓縮,Linux下的壓縮率更高。

原理介紹:

 

使用Gradle

此工具已發布在Bintray

apply plugin: 'AndResGuard'

buildscript {
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.9'
    }
}


andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    whiteList = [
        //for your icon
        "R.drawable.icon",
        //for fabric
        "R.string.com.crashlytics.*",
        //for umeng update
        "R.string.umeng*",
        "R.string.UM*",
        "R.string.tb_*",
        "R.layout.umeng*",
        "R.layout.tb_*",
        "R.drawable.umeng*",
        "R.drawable.tb_*",
        "R.anim.umeng*",
        "R.color.umeng*",
        "R.color.tb_*",
        "R.style.*UM*",
        "R.style.umeng*",
        "R.id.umeng*"
        //umeng share for sina
        "R.drawable.sina*"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
     sevenzip {
         artifact = 'com.tencent.mm:SevenZip:1.1.9'
         //path = "/usr/local/bin/7za"
    }
}

運行andresguard/resguard的gradle任務,可以得到資源混淆的安裝包 命令行可直接運行./gradlew resguard

在設置sevenzip時, 你只需設置artifactpath. 支持同時設置,總以path的值為優先.

如何使用資源混淆工具

使用命令行

tools_output文件夾有使用命令行工具的簡單例子,可以參考

我們先看看它的help描述,最簡單的使用方式是:java -jar andresguard.jar input.apk,此時會讀取運行路徑中的config.xml文件,並將結果輸出到運行路徑中的input(輸入apk的名稱)中。當然你也可以自己定義:

-config, 指定具體config文件的路徑;

-out, 指定具體的輸出路徑;混淆的mapping會在輸出文件夾中以resource_mapping_input(輸入apk的名稱).txt命名。

-signature, 指定簽名信息,若在命令行設置會覆蓋config.xml中的簽名信息,順序為簽名文件路徑、storepass、keypass、storealias。

-mapping, 指定舊的mapping文件,保證同一資源文件在不同版本混淆後的名稱保持一致。若在命令行設置會覆蓋config.xml中的信息。

-7zip, 指定7zip的路徑,若已添加到環境變量不需要設置。應是全路徑例如linux: /shwenzhang/tool/7za, Window需要加上.exe 結尾。

window: 對於window應下載命名行版本,若將7za指定到環境變量,即無須設置。地址:http://sparanoid.com/lab/7z/download.html

linux:sudo apt-get install p7zip-full

mac:brew install p7zip

-zipalign, 指定zipalign的路徑,若已添加到環境變量不需要設置。應是全路徑例如linux: /shwenzhang/sdk/tools/zipalign, Window需要加上.exe結尾。

-repackage, 如果想要出渠道包等需求,我們可能希望利用7zip直接重打包安裝包。

\

2.簡單用法

java -jar andresguard.jar input.apk

若想指定配置文件或輸出目錄:

java -jar andresguard.jar input.apk -config yourconfig.xml -out output_directory

若想指定簽名信息或mapping信息:

java -jar andresguard.jar input.apk -config yourconfig.xml
    -out output_directory -signature signature_file_path storepass_value
    keypass_value storealias_value -mapping mapping_file_path

若想指定7zip或zipalign的路徑(若已設置環境變量,這兩項不需要單獨設置):

java -jar andresguard.jar input.apk
 -7zip /shwenzhang/tool/7za  -zipalign /shwenzhang/sdk/tools/zipalign

若想用7zip重打包安裝包,同時也可指定output路徑,指定7zip或zipalign的路徑(此模式其他參數都不支持):

java -jar andresguard.jar -repackage input.apk -out output_directory
 -7zip /shwenzhang/tool/7za  -zipalign /shwenzhang/sdk/tools/zipalign   

使用資源混淆工具會得到什麼

正常來說,我們可得到以下output路徑得到以下7個有用的文件:(需要把zipalign也加入環境變量)

\

混淆過程中會輸出log,主要是可看到耗費時間,以及相對輸入apk減少的大小。

\

如何寫配置文件

配置文件中主要有五大項,即property,whitelist, keepmapping, compress,sign。

1. Property項

Property主要設置一些通用屬性:

--sevenzip, 是否使用7z重新壓縮簽名後的apk包(這步一定要放在簽名後,不然簽名時會破壞效果),需要我們安裝7z命令行,同時加入環境變量中,同時要求輸入簽名信息(不然不會使用)。

Window:7z command line version, 即7za

Linux: 可直接sudo apt-get install p7zip-full。

注意:效果很好,推薦使用,並且在Linux(Mac的高富帥也可)上。

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

--keeproot, 是否將res/drawable混淆成r/s

\

2. Whitelist項

Whitelist主要是用來設置白名單,由於我們代碼中某些資源會通過getIdentifier(需要全局搜索所有用法並添加到白名單)或動態加載等方式,我們並不希望混淆這部分的資源ID:

--isactive, 是否打開白名單功能;

--path, 是白名單的項,格式為package_name.R.type.specname,由於一個resources.arsc中可能會有多個包,所以這裡要求寫全包名。同時支持,?通配符,例如: com.tencent.mm.R.drawable.emoji_、com.tencent.mm.R.drawable.emoji_?;

注意:1.不能寫成com.tencent.mm.R.drawable.emoji.png,即帶文件後綴名;2.通配符代表.+,即a,不能匹配到a;

\

3. Keepmapping項

Keepmapping主要用來指定舊的mapping文件,為了保持一致性,我們支持輸入舊的mapping文件,可保證同一資源文件在不同版本混淆後的名稱保持一致。另一方面由於我們需要支持增量下載方式,如果每次改動都導致所有文件名都會更改,這會導致增量文件增大,但測試證明影響並不大(後面有測試數據)。

--isactive, 是否打開keepmapping模式;

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

\

4. Compress項

Compress主要用來指定文件重打包時是否壓縮指定文件,默認我們重打包時是保持輸入apk每個文件的壓縮方式(即Stored或者Deflate)。一般來說,1、在2.3版本以下源文件大於1M不能壓縮;2、流媒體不能壓縮。對於.png、.jpg是可以壓縮的,只是AssetManger讀取時候的方式不同。

--isactive, 是否打開compress模式;

--path, 是需要被壓縮文件的相對路徑(相對於apk最頂層的位置),這裡明確一定要使用‘/’作為分隔符,同時支持通配符,?,例如.png(壓縮所有.png文件),res/drawable/emjio_?.png,resouces.arsc(壓縮 resources.arsc)

注意若想得到最大混淆:

  1. 輸入四項個path:*.png, *.jpg, *.jpeg, *.gif

  2. 若你的resources.arsc原文件小於1M,可加入resourcs.arsc這一項!若不需要支持低版本,直接加入也可。

    \

    5. Sign項

    Sign主要是對處理後的文件重簽名,需要我們輸入簽名文件位置,密碼等信息。若想使用7z功能就一定要填入相關信息。

    --isactive, 是否打開簽名功能;

    --path, 是簽名文件的位置,linux用/, window用 \;

    --storepass, 是storepass的數值;

    --keypass, 是keypass的數值;

    --alias, 是alias的數值;

    \

    注意: 若出於保密不想寫在config.xml,可用-signature命令行設置模式。config.xml中的簽名信息會被命令行覆蓋。

    Android資源混淆工具需要注意的問題

    1. compress參數對混淆效果的影響 若指定compess 參數.png、.gif以及*.jpg,resources.arsc會大大減少安裝包體積。若要支持2.2,resources.arsc需保證壓縮前小於1M。

    2. 操作系統對7z的影響 實驗證明,linux與mac的7z效果更好

    3. keepmapping方式對增量包大小的影響 影響並不大,但使用keepmapping方式有利於保持所有版本混淆的一致性

    4. 渠道包的問題(建議通過修改zip摘要的方式生產渠道包) 在出渠道包的時候,解壓重壓縮會破壞7zip的效果,通過repackage命令可用7zip重壓縮。

    5. 若想通過getIdentifier方式獲得資源,需要放置白名單中。 部分手機桌面快捷圖標的實現有問題,務必將程序桌面icon加入白名單。

    6. 對於一些第三方sdk,例如友盟,可能需要將部分資源添加到白名單中。

          
                 
              
              
              
              
              
              
              
              
          

      Androd資源混淆工具的耗時與效果

      1. 基本的耗時與效果

      以微信的5.4為例,使用組件中的resoureproguard.jar進行資源混淆,具體的性能數據如下:

      其中時間指的是從最開始到該步驟完成的時間,而不是每步驟獨立時間。

      \

      2. compres參數(下文有詳細描述,是否壓縮某些資源)對安裝包大小的影響

      若指定compess 參數.png、.gif以及*.jpg,resources.arsc對安裝包大小影響如下:

      \

      但是resources.arsc如果原文件大於1M,壓縮後是不能在系統2.3以下運行的。

      3. 操作系統對7z的影響

      由於7z過程中使用的是極限壓縮模式,所以遍歷次數會增多(7次),時間相對會比較長。假設不使用7z在單核的虛擬機中僅需10秒。

      同時我們需要注意是由於文件系統不一致,在window上面使用7z生成的安裝包會較大,微信在window以及linux下7z的效果如下:

      \

      所以最後出包請使用Linux(Mac亦可),具體原因應該與文件系統有關。

      4. keepmapping方式(下文有詳細描述,是否保持舊的mapping)對增量包大小的影響

      我們一般使用bsdiff生成增量包,bsdiff差分的是二進制,利用LCS最長公共序列算法。假設分別使用正序與逆序混淆規則對微信5.4作資源混淆(即它們的混淆方式是完全相反的)。

      \

      事實上,它們的差分是不需要371kb,因為有比較大的文件格式,共同標記部分。

      現在我們做另外一個實驗,首先對微信5.3.1作資源混淆得到安裝包a,然後以keepmapping方式對微信5.4作資源混淆得到安裝包b,最後以完全逆序的方式對微信5.4作資源混淆得到安裝包c。

      分別用安裝包b、c對安裝包a生成增量文件d,e。比較增量文件d、e的大小,分別如下:

      \

      所以增量文件的大小並不是我們采用keepmapping方式的主要考慮因素,保持混淆的一致性,便於查找問題或是更加重要的考慮。

      5.安裝包縮減的原因與影響因素

      總結,安裝包大小減少的原因以下四個:

      \

      相對的,可得到影響效果的因素有以下幾個:

      \

       

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved