此文章來源於http://blog.csdn.net/wenwen091100304/article/details/52802247點擊打開鏈接
在Android APP開發完成後,爲了防止APP被盜版、以及其他安全因素,大多數APP都會被要求做混淆編譯,因此作爲一項必要技能,就必須得掌握了,下面簡單記錄一下真個實踐過程。
- 編輯混淆規則文件
如圖所示,可以從Android Studio的工程目錄上看出對應每個模塊的混淆規則文件,每個模塊使用不同的混淆規則,根據實際情況,進行相關的編輯。
這裏舉個Volley的混淆規則文件看看:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-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 com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 混淆規則文件規則說明
(1)基本命令
# 代碼混淆壓縮比,在0~7之間,默認爲5,一般不下需要修改
-optimizationpasses 5
# 混淆時不使用大小寫混合,混淆後的類名爲小寫
# windows下的同學還是加入這個選項吧(windows大小寫不敏感)
-dontusemixedcaseclassnames
# 指定不去忽略非公共的庫的類
# 默認跳過,有些情況下編寫的代碼與類庫中的類在同一個包下,並且持有包中內容的引用,此時就需要加入此條聲明
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共的庫的類的成員
-dontskipnonpubliclibraryclassmembers
# 不做預檢驗,preverify是proguard的四個步驟之一
# Android不需要preverify,去掉這一步可以加快混淆速度
-dontpreverify
# 有了verbose這句話,混淆後就會生成映射文件
# 包含有類名->混淆後類名的映射關係
# 然後使用printmapping指定映射文件的名稱
-verbose
-printmapping priguardMapping.txt
# 指定混淆時採用的算法,後面的參數是一個過濾器
# 這個過濾器是谷歌推薦的算法,一般不改變
-optimizations !code/simplification/artithmetic,!field/*,!class/merging/*
# 保護代碼中的Annotation不被混淆
# 這在JSON實體映射時非常重要,比如fastJson
-keepattributes *Annotation*
# 避免混淆泛型
# 這在JSON實體映射時非常重要,比如fastJson
-keepattributes Signature
# 拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTab
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
(2)混淆代碼中要保留的的部分
# 保留所有的本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留了繼承自Activity、Application這些類的子類
# 因爲這些子類有可能被外部調用
# 比如第一行就保證了所有Activity的子類不要被混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-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
# 如果有引用android-support-v4.jar包,可以添加下面這行
-keep public class com.null.test.ui.fragment.** {*;}
# 保留Activity中的方法參數是view的方法,
# 從而我們在layout裏面編寫onClick就不會影響
-keepclassmembers class * extends android.app.Activity {
public void * (android.view.View);
}
# 枚舉類不能被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留自定義控件(繼承自View)不能被混淆
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(***);
*** get* ();
}
# 保留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 void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 對R文件下的所有類及其方法,都不能被混淆
-keepclassmembers class **.R$* {
*;
}
# 對於帶有回調函數onXXEvent的,不能混淆
-keepclassmembers class * {
void *(**On*Event);
}
#保持實體類所在的包
-keep class com.wasu.wasulkl.data.**{*;}
#如果項目中用到了WebView的複雜操作,請加入以下代碼:
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String);
}
#JavaScript接口處理舉例
-keepclassmembers class com.null.test.MainActivity$JSInterfacel {
<methods>;
}
#其他第三方的jar包的解決方案
#這個要取決第三方jar包的混淆策略了。一般在其官方文檔上面都有混淆說明。比如支付寶相應的混淆規則就是
-libraryjars ./libs/alipaysdk.jar
-dontwarn com.alipay.android.app.**
-keep public class com.alipay.** {*;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 打開混淆編譯開關
接下來要做的就是打開混淆開關,這個很簡單,在build.gradle文件中,代碼如下,:
buildTypes {
release {
minifyEnabled true //混淆開關,true是打開,false是關閉
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}