這里我們直接用Android Studio來說明如何進(jìn)行混淆,Android Studio自身集成Java語言的ProGuard作為壓縮看蚜,優(yōu)化和混淆工具叫搁,配合Gradle構(gòu)建工具使用很簡(jiǎn)單,只需要在工程應(yīng)用目錄的gradle文件中設(shè)置minifyEnabled為true即可供炎。然后我們就可以到proguard-rules.pro文件中加入我們的混淆規(guī)則了渴逻。
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
先看如下兩個(gè)比較常用的命令,很多童鞋可能會(huì)比較迷惑以下兩者的區(qū)別音诫。
//一顆星表示只是保持該包下的類名惨奕,而子包下的類名還是會(huì)被混淆
-keep class cn.hadcn.test.*
//兩顆星表示把本包和所含子包下的類名都保持
-keep class cn.hadcn.test.**
用以上方法保持類后,你會(huì)發(fā)現(xiàn)類名雖然未混淆纽竣,但里面的具體方法和變量命名還是變了墓贿,這時(shí)如果既想保持類名,又想保持里面的內(nèi)容不被混淆蜓氨,我們就需要以下方法了
//一顆星表示只是保持該包下的類名聋袋,而子包下的類名還是會(huì)被混淆
-keep class cn.hadcn.test.* {*;}
//兩顆星表示把本包和所含子包下的類名都保持
-keep class cn.hadcn.test.**{*;}
注:**可能會(huì)報(bào)語法錯(cuò)誤,不過這對(duì)程序運(yùn)行并不影響穴吹,如果想要去除警告可以用:
Alt+Enter來去掉警告即可
避免所有繼承于幽勒?的類被混淆
-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.preference.Preference
-keep public class * extends android.view.View
jni方法不可混淆,因?yàn)檫@個(gè)方法需要和native方法保持一致港令;
-keepclasseswithmembernames class * {
# 保持native方法不被混淆
native <methods>;
}
Parcelable的子類和Creator靜態(tài)成員變量不混淆啥容,否則會(huì)產(chǎn)生Android.os.BadParcelableException異常;
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆
public static final Android.os.Parcelable$Creator *;
}
使用enum類型時(shí)需要注意避免以下兩個(gè)方法混淆顷霹,因?yàn)閑num類的特殊性咪惠,以下兩個(gè)方法會(huì)被反射調(diào)用,見第二條規(guī)則淋淀。
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
保持特定類不被混淆,bean應(yīng)用廣泛遥昧,需要混淆
-keep class com.xy.z.HeBean{
public *;
}
保留我們自定義控件(繼承自View)不被混淆
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
保留Parcelable序列化類不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
保留Serializable序列化的類不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
對(duì)于帶有回調(diào)函數(shù)的onXXEvent、*OnListener的,不能被混淆
-keepclassmembers class * {
void *(**On*Event);
void *(**On*Listener);
}
webView處理炭臭,項(xiàng)目中沒有使用到webView忽略即可
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
參考資料有:
http://www.reibang.com/p/7436a1a32891
https://blog.csdn.net/jinrumorijuesha/article/details/103239909