原文地址:[寫給Android開發(fā)者的混淆使用手冊(cè) ]
為保證移動(dòng)端數(shù)據(jù)安全模聋,防止應(yīng)用被逆向工程師反編譯或被不法分子盜用用戶信息,Android應(yīng)用打包發(fā)布都需要進(jìn)行混淆。
混淆其實(shí)是包括了代碼壓縮、代碼混淆以及資源壓縮等的優(yōu)化過(guò)程嘹朗。依靠 ProGuard,混淆流程將主項(xiàng)目以及依賴庫(kù)中未被使用的類诵肛、類成員屹培、方法、屬性移除怔檩,這有助于規(guī)避64K方法數(shù)的瓶頸褪秀;同時(shí),將類珠洗、類成員溜歪、方法重命名為無(wú)意義的簡(jiǎn)短名稱,增加了逆向工程的難度许蓖。而依靠 Gradle 的 Android 插件蝴猪,我們將移除未被使用的資源,可以有效減小 apk 安裝包大小膊爪。
混淆基本配置
一般的混淆為在gradle中進(jìn)行配置:
minifyEnabled false 開啟了代碼壓縮
proguard-android.txt sdk中的一個(gè)混淆文件
proguard-rules.pro 項(xiàng)目module下的一個(gè)混淆配置
proguard-android.txt 中的內(nèi)容:
其實(shí)這就是一個(gè)配置文件
proguard-rules.pro 中常見的配置為:
混淆簡(jiǎn)介(摘自原文)
Android中的“混淆”可以分為兩部分自阱,一部分是Java代碼的優(yōu)化與混淆,依靠 proguard 混淆器來(lái)實(shí)現(xiàn)米酬;另一部分是資源壓縮沛豌,將移除項(xiàng)目及依賴的庫(kù)中未被使用的資源(資源壓縮嚴(yán)格意義上跟混淆沒啥關(guān)系,但一般我們都會(huì)放一起講)赃额。
代碼壓縮
代碼混淆是包含了代碼壓縮加派、優(yōu)化、混淆等一系列行為的過(guò)程跳芳。如上圖所示芍锦,混淆過(guò)程會(huì)有如下幾個(gè)功能:
壓縮。移除無(wú)效的類飞盆、類成員娄琉、方法次乓、屬性等;
優(yōu)化孽水。分析和優(yōu)化方法的二進(jìn)制代碼票腰;根據(jù)proguard-android-optimize.txt中的描述,優(yōu)化可能會(huì)造成一些潛在風(fēng)險(xiǎn)女气,不能保證在所有版本的Dalvik上都正常運(yùn)行杏慰。
混淆。把類名主卫、屬性名逃默、方法名替換為簡(jiǎn)短且無(wú)意義的名稱鹃愤;
預(yù)校驗(yàn)簇搅。添加預(yù)校驗(yàn)信息。這個(gè)預(yù)校驗(yàn)是作用在Java平臺(tái)上的软吐,Android平臺(tái)上不需要這項(xiàng)功能瘩将,去掉之后還可以加快混淆速度。
這四個(gè)流程默認(rèn)開啟凹耙。
在 Android 項(xiàng)目中我們可以選擇將“優(yōu)化”和“預(yù)校驗(yàn)”關(guān)閉姿现,對(duì)應(yīng)命令是-dontoptimize、-dontpreverify(當(dāng)然肖抱,默認(rèn)的 proguard-android.txt 文件已包含這兩條混淆命令备典,不需要開發(fā)者額外配置)∫馐觯——不明白這里為啥需要 優(yōu)化和預(yù)校驗(yàn)關(guān)閉提佣,有知道的同學(xué)請(qǐng)?jiān)诹粞曰貜?fù),謝謝
資源壓縮
資源壓縮將移除項(xiàng)目及依賴的庫(kù)中未被使用的資源荤崇,這在減少 apk 包體積上會(huì)有不錯(cuò)的效果拌屏,一般建議開啟。具體做法是在 build.grade 文件中术荤,將 shrinkResources 屬性設(shè)置為 true倚喂。需要注意的是,只有在用minifyEnabled true開啟了代碼壓縮后瓣戚,資源壓縮才會(huì)生效端圈。
資源壓縮包含了“合并資源”和“移除資源”兩個(gè)流程。
“合并資源”流程中子库,名稱相同的資源被視為重復(fù)資源會(huì)被合并舱权。需要注意的是,這一流程不受shrinkResources屬性控制刚照,也無(wú)法被禁止刑巧, gradle 必然會(huì)做這項(xiàng)工作喧兄,因?yàn)榧偃绮煌?xiàng)目中存在相同名稱的資源將導(dǎo)致錯(cuò)誤。
檢查混淆結(jié)果
混淆過(guò)的包必須進(jìn)行檢查啊楚,避免因混淆引入的bug吠冤。
一方面,需要從代碼層面檢查恭理。使用上文的配置進(jìn)行混淆打包后在 /build/outputs/mapping/release/ 目錄下會(huì)輸出以下文件:
dump.txt
描述APK文件中所有類的內(nèi)部結(jié)構(gòu)
mapping.txt
提供混淆前后類拯辙、方法、類成員等的對(duì)照表
seeds.txt
列出沒有被混淆的類和成員
usage.txt
列出被移除的代碼
我們可以根據(jù) seeds.txt 文件檢查未被混淆的類和成員中是否已包含所有期望保留的颜价,再根據(jù) usage.txt 文件查看是否有被誤移除的代碼涯保。
這些文件最好都保存著,以免線上應(yīng)用出現(xiàn)問(wèn)題周伦,可以追蹤bug夕春。
解出混淆棧
混淆后的類、方法名等等難以閱讀专挪,這固然會(huì)增加逆向工程的難度及志,但對(duì)追蹤線上 crash 也造成了阻礙。我們拿到 crash 的堆棧信息后會(huì)發(fā)現(xiàn)很難定位寨腔,這時(shí)需要將混淆反解速侈。
在 /tools/proguard/ 路徑下有附帶的的反解工具(Window 系統(tǒng)為 proguardgui.bat,Mac 或Linux系統(tǒng)為 proguardgui.sh)迫卢。
這里以 Window 平臺(tái)為例倚搬。雙擊運(yùn)行 proguardgui.bat 后,可以看到左側(cè)的一行菜單乾蛤。點(diǎn)擊 ReTrace每界,選擇該混淆包對(duì)應(yīng)的 mapping 文件(混淆后在 /build/outputs/mapping/release/ 路徑下會(huì)生成 mapping.txt 文件,它的作用是提供混淆前后類幻捏、方法盆犁、類成員等的對(duì)照表),再將 crash 的 stack trace 黏貼進(jìn)輸入框中篡九,點(diǎn)擊右下角的 ReTrace 谐岁,混淆后的堆棧信息就顯示出來(lái)了。
本文摘自[原文 ]
本文僅作為學(xué)習(xí)使用榛臼,詳情請(qǐng)查看原文R恋琛!沛善!謝謝