前言
混淆是上線前挺重要的一個(gè)環(huán)節(jié)。android使用的ProGuard,可以起到壓縮,混淆,預(yù)檢,優(yōu)化的作用。但是很多童鞋還沒有掌握正確的寫混淆文件的姿勢(shì)。我希望搞個(gè)模板化的東西,讓大家輕松搞定混淆。那么,開始寫一個(gè)項(xiàng)目的混淆吧。。。我是不是很直接。。。。
五步搞定
1
五步搞定1打開項(xiàng)目中的proguard-rules.pro,將下面的代碼復(fù)制進(jìn)去。我的思路是將混淆分為2個(gè)主要部分定制化區(qū)域。這里邊的內(nèi)容是我們主要需要補(bǔ)充的部分,大致分為4個(gè)小部分,我們接下來的步驟主要是補(bǔ)充這4個(gè)部分的東西?;静挥脛?dòng)區(qū)域。顧名思義,基本不用動(dòng)。這塊的內(nèi)容我已經(jīng)寫好了,除非有特殊的需求,基本不用改動(dòng).

2
理解完戰(zhàn)略級(jí)思想后,我們開始第一部分補(bǔ)充-實(shí)體類。實(shí)體類由于涉及到與服務(wù)端的交互,各種gson的交互如此等等,是要保留的。將你項(xiàng)目中實(shí)體類都拎出來,用以下語法進(jìn)行保留。

如我的項(xiàng)目下類User的完整路徑為:com.demo.login.bean.User, 那我的混淆如下

當(dāng)然你的實(shí)體類肯定不止這一個(gè),請(qǐng)用上邊的方式一一添加,如果你的實(shí)體類都在一個(gè)包下,那你就幸福了。
3
是第三方包。打開你的build.gradle文件,查看你用了哪些第三方的包。

我去他們的官網(wǎng)把已經(jīng)寫好的混淆copy下來。

一般官網(wǎng)都是有混淆的,沒有的話就google,也沒有的話自己按照上面的寫法自己寫,還不會(huì)的話。。。。。只能換個(gè)包。。。。。如果你是直接包含的jar包的話,你這樣寫

大致意思就是不混淆,不報(bào)warn。如果gradle報(bào)錯(cuò)的話,可以考慮注釋掉-libraryjars log4j-1.2.17.jar這句。
4
第三部分與js互調(diào)的類,工程中沒有直接跳過。一般你可以這樣寫

??如果是內(nèi)部類的話,你可以這樣

例如

5
第四部分與反射有關(guān)的類,工程中沒有直接跳過。
類的話直接這樣-keep class 你的類所在的包.** { *; }
熟練后不用五分鐘就能搞定。大
深入了解先逐條介紹下基本指令區(qū)指令的含義
-optimizationpasses 5代碼混淆的壓縮比例,值在0-7之間
-dontusemixedcaseclassnames混淆后類名都為小寫
-dontskipnonpubliclibraryclasses指定不去忽略非公共的庫的類
-dontskipnonpubliclibraryclassmembers指定不去忽略非公共的庫的類的成員
-dontpreverify不做預(yù)校驗(yàn)的操作
-verbose-printmapping proguardMapping.txt生成原類名和混淆后的類名的映射文件
-optimizations !code/simplification/cast,!field/*,!class/merging/*指定混淆是采用的算法
-keepattributes *Annotation*,InnerClasses不混淆
Annotation-keepattributes Signature不混淆泛型
-keepattributes SourceFile,LineNumberTable拋出異常時(shí)保留代碼行號(hào)基本指令區(qū)基本介紹完了
說下2條用的最多的指令-keep class XXXX保留類名不變,也就是類名不混淆,而類中的成員名不保證。當(dāng)然也可以是繼承XXX類的所有類名不混淆,具體代碼不貼了,重在理解。
-keepclasseswithmembers class XXXX保留類名和成員名。當(dāng)然也可以是類中特定方法,代碼不貼了,理由同上
#---------------------------------------------------------------------------------------------------
后言
將build.gradle中minifyEnabled設(shè)置為true打個(gè)包試試吧