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
時, 你只需設定artifact
或path
.
支援同時設定,總以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(http://www.7-zip.org/download.html)
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)
注意若想得到最大混淆:
-
輸入四項個path:*.png, *.jpg, *.jpeg, *.gif
-
若你的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資源混淆工具需要注意的問題
-
compress引數對混淆效果的影響 若指定compess 引數.png、.gif以及*.jpg,resources.arsc會大大減少安裝包體積。若要支援2.2,resources.arsc需保證壓縮前小於1M。
-
作業系統對7z的影響 實驗證明,linux與mac的7z效果更好
-
keepmapping方式對增量包大小的影響 影響並不大,但使用keepmapping方式有利於保持所有版本混淆的一致性
-
渠道包的問題(建議通過修改zip摘要的方式生產渠道包) 在出渠道包的時候,解壓重壓縮會破壞7zip的效果,通過repackage命令可用7zip重壓縮。
-
若想通過getIdentifier方式獲得資源,需要放置白名單中。 部分手機桌面快捷圖示的實現有問題,務必將程式桌面icon加入白名單。
-
對於一些第三方sdk,例如友盟,可能需要將部分資源新增到白名單中。
<issue id="whitelist" isactive="true">
<path value ="yourpackagename.R.string.umeng*" />
<path value ="yourpackagename.R.layout.umeng*" />
<path value ="yourpackagename.R.drawable.umeng*" />
<path value ="yourpackagename.R.anim.umeng*" />
<path value ="yourpackagename.R.color.umeng*" />
<path value ="yourpackagename.R.style.*UM*" />
<path value ="yourpackagename.R.style.umeng*" />
<path value ="yourpackagename.R.id.umeng*" />
<path value ="yourpackagename.R.string.com.crashlytics.*" />
</issue>
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.安裝包縮減的原因與影響因素
總結,安裝包大小減少的原因以下四個:
相對的,可得到影響效果的因素有以下幾個:
相關文章
- android混淆檔案說明Android
- Android資源混淆打包工具Android
- ios加固,ios程式碼混淆,ios程式碼混淆工具, iOS原始碼混淆使用說明詳解iOS原始碼
- [Android開源框架]RxHttp使用說明Android框架HTTP
- 微信資源混淆工具打包
- Oracle profile 使用者資源限制 說明Oracle
- 用Excel做資料說明――抽樣說明工具Excel
- opatch 工具打補丁使用說明
- DBV工具說明
- sql注入工具sqlmap使用引數說明SQL
- mysql語句分析工具explain使用說明MySqlAI
- Oracle中的使用者資源限制的幾點說明Oracle
- 使用說明
- Oracle BBED 工具 說明Oracle
- Oracle BBED 工具說明Oracle
- Ubuntu修改Hosts檔案工具HostsTool使用說明Ubuntu
- Oracle 9i LogMiner工具使用說明Oracle
- 主流的開源ETL工具清單及優劣說明!
- WebApiClientCore使用說明WebAPIclient
- QLExpress使用說明Express
- postman 使用說明Postman
- Sqlite使用說明SQLite
- cmake使用說明
- certbot 使用說明
- Flutter開發第一個專案android studio 開發工具的使用說明FlutterAndroid
- Android Jetpack - Fragment官方說明AndroidJetpackFragment
- Cz工具集使用介紹 - 規範Git提交說明Git
- exp,imp相關工具說明
- Oracle DUL/AUL/ODU 工具說明Oracle
- Eclipse與Android原始碼中ProGuard工具的使用(程式碼混淆)EclipseAndroid原始碼
- JPA EntityManager使用說明
- wc 命令使用說明
- oracle orapwd使用說明Oracle
- Jupiter 使用說明
- BaseRecyclerViewAdapterHelper使用說明ViewAPT
- HSQL DB 使用說明SQL
- FreeSql 使用說明SQL
- Android混淆Android