來(lái)自:https://juejin.im/post/5947e7e8128fe1006a52d922
Android Studio 代碼混淆
一、沒(méi)加過(guò)代碼混淆幅虑,第一次耳胎,學(xué)習(xí)中,下面都是從網(wǎng)上看的經(jīng)驗(yàn)细诸,目前新建項(xiàng)目沛贪,以后補(bǔ)充過(guò)程中遇到的問(wèn)題。
二震贵、Android Studio 代碼混淆基本配置
在工程目錄下利赋,找到 proguard-rules.pro 文件,它就是你要進(jìn)行編寫混淆配置的文件猩系,在這個(gè)文件中編寫混淆規(guī)則媚送,當(dāng)然,在這之前寇甸,還需要在你 module 的 build.gradle 文件中引用該混淆文件塘偎,將module 的 build.gradle的minifyEnabled設(shè)為true。上面中的 proguard-android.txt 文件拿霉,這是系統(tǒng)默認(rèn)的混淆文件吟秩,具體在../sdk/tools/proguard/ 目錄下,其中包含了 android 最基本的混淆绽淘,一般不需要改動(dòng)涵防,我們需要配置的是項(xiàng)目中 app 下的 proguard-rules.pro 文件。
三沪铭、混淆規(guī)則
1.基本規(guī)則
兩個(gè)常用的混淆命令壮池,注意一顆星表示只是保持該包下的類名偏瓤,而子包下的類名還是會(huì)被混淆;兩顆星表示把本包和所含子包下的類名都保持椰憋;
-keepclasscn.hadcn.test.**-keepclasscn.hadcn.test.*
用以上方法保持類后硼补,你會(huì)發(fā)現(xiàn)類名雖然未混淆,但里面的具體方法和變量命名還是變了熏矿,這時(shí)如果既想保持類名已骇,又想保持里面的內(nèi)容不被混淆,我們就需要以下方法了
-keepclasscom.example.bean.**{ *; }
在此基礎(chǔ)上票编,我們也可以使用Java的基本規(guī)則來(lái)保護(hù)特定類不被混淆褪储,比如我們可以用extend,implement等這些Java規(guī)則慧域。如下例子就避免所有繼承Activity的類被混淆
# 保留我們使用的四大組件鲤竹,自定義的Application等等這些類不被混淆
# 因?yàn)檫@些子類都有可能被外部調(diào)用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
2.什么時(shí)候不被混淆
一般以下情況都會(huì)不混淆:
1.使用了自定義控件那么要保證它們不參與混淆
2.使用了枚舉要保證枚舉不被混淆
3.對(duì)第三方庫(kù)中的類不進(jìn)行混淆
4.運(yùn)用了反射的類也不進(jìn)行混淆
5.使用了 Gson 之類的工具要使 JavaBean 類即實(shí)體類不被混淆
6.在引用第三方庫(kù)的時(shí)候,一般會(huì)標(biāo)明庫(kù)的混淆規(guī)則的昔榴,建議在使用的時(shí)候就把混淆規(guī)則添加上去辛藻,免得到最后才去找
7.有用到 WebView 的 JS 調(diào)用也需要保證寫的接口方法不混淆,原因和第一條一樣
8.Parcelable 的子類和 Creator 靜態(tài)成員變量不混淆互订,否則會(huì)產(chǎn)生 Android.os.BadParcelableException 異常