在前面的文章深入 Android 混淆實(shí)踐:ProGuard 通關(guān)秘籍和深入 Android 混淆實(shí)踐:多模塊打包爬坑之旅中,已經(jīng)講到了如何在 Android 中使用 ProGuard,以及如何自定義實(shí)現(xiàn)混淆規(guī)則的生成。為了更深入地理解 ProGuard 的細(xì)節(jié),本系列文章從我感興趣的點(diǎn)出發(fā),記錄在閱讀 ProGuard 源碼過程中的思考與啟發(fā),希望對你也有所幫助。本文為此系列文章的開篇,將最基礎(chǔ)的講起,使用 ProGuard 源碼去實(shí)現(xiàn)代碼混淆。
1. ProGuard 的使用
在之前的文章中,使用 ProGuard 的流程已經(jīng)融入到 Android Gradle Tools 中了。除了自帶的流程,我們也可以直接使用 android-sdk/tools/proguard/libs
里面的 ?proguard.jar
。在 android-sdk/tools/proguard/bin
下有 proguard.sh
這個可執(zhí)行文件:
PROGUARD_HOME=`dirname?"$0"`/..
java?-jar?$PROGUARD_HOME/lib/proguard.jar?"$@"
可以看到,就是使用 java -jar
進(jìn)行執(zhí)行的,并且將參數(shù)直接透傳。除了使用這個可執(zhí)行腳本執(zhí)行外,我們也可以直接使用如下命令直接運(yùn)行:
java?-jar?proguard.jar?[options?...]
根據(jù)使用混淆的經(jīng)驗(yàn),你應(yīng)該可以想到,加固過程中,主要需要以下四部份內(nèi)容:
要被混淆的內(nèi)容,如常見的 jar 包。
被混淆內(nèi)容的依賴庫, 如 Android SDK。
混淆的配置,哪些類、方法不被優(yōu)化混淆處理。
混淆后的輸出內(nèi)容。
在執(zhí)行命令中,必須包含這些內(nèi)容,我們可以使用以下幾條參數(shù)來指定:
-injars ?classpath,classpath 指定當(dāng)前需要混淆的 jar 包,classpath 路徑中支持 apk, aab, aar, war, ear, jmod, zip 以及文件夾,支持多個輸入。
-outjars classpath,classpath 指定當(dāng)前混淆后輸出的 jar 包, 格式支持與
-injars
一致, 一般情況下,此處僅有一個可輸出的 classpath 路徑-libraryJars classpath, classpath 指定依賴庫,支持格式與
-injars
一致,如有多個 library 依賴,寫多行就可以指定-include filename,filename 指定配置文件的路徑,也可使用 ?
@filename
?替代
我們所編寫的 混淆配置
通過 -include filename
即可指定。當(dāng)然,-injars
、-outjars
、-libraryJars
和 -keep 規(guī)則
放到同一個配置文件中,運(yùn)行時,指定對應(yīng)配置文件即可,使用起來更方便,比如我將配置信息寫到 debug_proguard.pro
文件中,即可按如下方式進(jìn)行運(yùn)行:
java?-jar?proguard.jar?@debug_proguard.pro
當(dāng)寫好配置后,運(yùn)行如上命令,就能將混淆后的內(nèi)容輸出到 -outjars
指定的路徑中。
2. ProGuard 源碼下載與運(yùn)行配置
前面的內(nèi)容中,可以了解到 ProGuard 的使用,而 ProGuard 是一個開源項(xiàng)目,它使用的是 GPL 協(xié)議,而其還依賴了ProGuard-core
,此項(xiàng)目也為開源項(xiàng)目。為了了解其實(shí)現(xiàn)細(xì)節(jié),可以將代碼下載下來,如下所示:
git?clone?git@github.com:Guardsquare/proguard.git
git?clone?git@gitcode.net:mirrors/Guardsquare/proguard.git
代碼下載好后,可以直接使用 Intellij IDEA
打開它并且運(yùn)行起來,這樣我們就可以直接進(jìn)行運(yùn)行調(diào)試,能夠更方便的去讀懂 ?ProGuard 中的邏輯。
在 ProGuard 代碼倉庫中寫到,要編譯源碼,需要使用 JDK 8 , 此處需要注意你當(dāng)前使用的 JDK 版本。
首先,要運(yùn)行代碼,就需要找到 main()
方法所在的類,才能執(zhí)行運(yùn)行。在第一節(jié)的內(nèi)容中,使用 java -jar proguard.jar
就可以執(zhí)行,從 jar 包中的 MANIFEST.MF
文件中,可以看到, main()
?方法在 proguard.ProGuard
中, 如下圖所示:

在源碼中,我們也能看到 proguard/ProGuard.java
的類中,正好有一個 main()
方法。在 Intellij IDEA
可以直接運(yùn)行此 main
方法:

如果直接點(diǎn)擊綠色的 ?? ,運(yùn)行肯定會報錯。在這里,我們還需要手動將第一部分中使用的 debug_proguard.pro
文件路徑放到參數(shù)列表中去,具體操作方法如下圖所示:

配置完成后,直接點(diǎn)擊 Intellij IDEA
中的 ??? ,輸出的產(chǎn)物與用命令行執(zhí)行出來的結(jié)果一致。文章來源:http://www.zghlxwxcb.cn/news/detail-487523.html
3. 結(jié)語
當(dāng)拿到源碼后,第一步就是將源碼跑起來,這能夠有助于我們對源碼理解,以及后續(xù)分析源碼時進(jìn)行調(diào)試。本文內(nèi)容很簡單,但紙上得來終覺淺,絕知此事要躬行。朋友們可以自己去將源碼下載下來,并使用你所熟知的 IDE
將其運(yùn)行起來,相信你也有很多的收獲,也歡迎各位與我交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-487523.html
到了這里,關(guān)于ProGuard 進(jìn)階系列(一): 運(yùn)行源代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!