當(dāng)前環(huán)境
Android Studio: 3.2.1
Gradle 插件: 'com.android.tools.build:gradle:3.2.1'
Gradle : gradle-4.6
具體配置
因?yàn)閜roguard文件要靠手寫(xiě)岁钓,所以有時(shí)候感覺(jué)很難屡限,但是找到規(guī)律之后也挺簡(jiǎn)單的钧大,感覺(jué)難是因?yàn)榘⊙耄皇煜に囊恍╆P(guān)鍵字瘸恼,這里列出了常用的關(guān)鍵字,以及人能看懂的含義压固,其實(shí)要想看明白,自己寫(xiě)的Demo測(cè)試一下就好了靠闭,借助于反編譯工具看下到底什么被混淆了帐我,工具看這。我下面寫(xiě)了詳細(xì)的注釋github愧膀,常用的也就這么多了拦键,其余的可以根據(jù)命令行進(jìn)行調(diào)試,然后逐個(gè)添加檩淋。
#-ignorewarnings # 忽略警告芬为,避免打包時(shí)某些警告出現(xiàn)
-optimizationpasses 5 # 指定代碼的壓縮級(jí)別
-dontusemixedcaseclassnames # 是否使用大小寫(xiě)混合 混淆時(shí)不會(huì)產(chǎn)生形形色色的類(lèi)名
-dontskipnonpubliclibraryclasses # 是否混淆第三方j(luò)ar
-dontpreverify # 混淆時(shí)是否做預(yù)校驗(yàn)
-verbose # 混淆時(shí)是否記錄日志
-dontoptimize # 不優(yōu)化輸入的類(lèi)文件
## 這個(gè) SourceFile 可以字 Smali 文件里面 .source "xxxx" 保證原始類(lèi)名不被抹掉
-keepattributes *Annotation*, SourceFile, InnerClasses, LineNumberTable, Signature, EnclosingMethod
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #優(yōu)化 混淆時(shí)采用的算法
-keep public class * extends android.app.Activity # 未指定成員萄金,僅僅保持類(lèi)名不被混淆
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.app.View
-keep public class * extends android.app.IntentService
-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.hardware.display.DisplayManager
-keep public class * extends android.os.UserManager
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.app.Fragment
-keep public class * extends android.support.v4.widget
# *匹配任意字符不包括 “ . ” ,**匹配任意字符
# 下面這行的意思是媚朦,保留v4下面的類(lèi)名及其v4下面子包的類(lèi)名不被混淆
-keep public class * extends android.support.v4.**
# 下面 這行表示一個(gè)接口中的所有的東西都不被混淆
-keep interface android.support.v4.app.** { *; }
# 下面這行表示保持這個(gè)包及其子包下面的所有類(lèi)的類(lèi)名及其類(lèi)里面的所有內(nèi)容都不混淆
-keep class android.support.v4.** { *; }
-keep class android.os.**{*;}
-keep class android.support.v8.renderscript.** { *; }
-keep class **.R$* { *; }
-keep class **.R{ *; }
#實(shí)現(xiàn)了android.os.Parcelable接口類(lèi)的任何類(lèi)氧敢,以及其內(nèi)部定義的Creator內(nèi)部類(lèi)類(lèi)型的public final靜態(tài)成員變量份氧,都不能被混淆和刪除
-keep class * implements android.os.Parcelable { # 保持Parcelable不被混淆
public static final android.os.Parcelable$Creator *;
}
#keepclasseswithmembernames 保留類(lèi)和類(lèi)中的成員恋拷,防止被混淆,保留指明的成員,成員沒(méi)有引用會(huì)被移除
# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#keepclasseswithmembers 保留類(lèi)和類(lèi)中的成員,防止被混淆或移除逞带,保留指明的成員(和上面的區(qū)別是空入,這里會(huì)防止被移除)
# 保持自定義控件類(lèi)名和構(gòu)造方法不被混淆或移除
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
# 保持自定義控件類(lèi)不被混淆
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int, int);
}
-keepclassmembers class * extends android.app.Activity { #保持類(lèi)成員
public void *(android.view.View);
}
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
-keepclassmembers enum * { # 保持枚舉 enum 類(lèi)不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#####################上面這些是系統(tǒng)默認(rèn)配置的#####################3
## 一般來(lái)說(shuō)上面的這些即使我們不寫(xiě),開(kāi)了混淆也會(huì)自動(dòng)啟用
## 現(xiàn)在我用的 Android Studio Gradle的插件是 3.2.1 這個(gè)插件自帶默認(rèn)混淆文件
## 在啟用混淆的時(shí)候解壓出來(lái)盟步,詳情參考 /項(xiàng)目名/build/intermediates/proguard-files/proguard-android.txt-3.2.1 里面的注釋
## 注釋上說(shuō)gradle 的 Android 插件媳拴,從2.2 版本開(kāi)始,不再使用sdk本地的Proguard,而以后gradle插件自帶默認(rèn)Proguard配置文件
#-libraryjars libs/jar包名字.jar #缺省proguard 會(huì)檢查每一個(gè)引用是否正確,但是第三方庫(kù)里面往往有些不會(huì)用到的類(lèi)仪搔,沒(méi)有正確引用。如果不配置的話煮嫌,系統(tǒng)就會(huì)報(bào)錯(cuò)梯码。
-dontwarn android.support.v4.**
-dontwarn android.os.**
#編譯時(shí)關(guān)掉Log的打印,
#-assumenosideeffects class android.util.Log { #如果是自定義Log類(lèi),修改下面的包名
# public static *** d(...);
# public static *** e(...);
# public static *** i(...);
# public static *** v(...);
# public static *** println(...);
# public static *** w(...);
# public static *** wtf(...);
#}
# 實(shí)體類(lèi)不混淆(自己項(xiàng)目實(shí)體類(lèi)不被混淆秉版,因?yàn)镚son中用到了反射)
#-keep class me.febsky.entity.** { *; }
### -----這是個(gè)列子---- ###
#這個(gè)類(lèi)里面的所有的成員變量和方法都不混淆
-keep class me.febsky.testprogard.MainActivity { *; }
#這個(gè)類(lèi)里面的內(nèi)部類(lèi)的所有的成員變量和方法都不混淆
-keep class me.febsky.testprogard.MainActivity$* { *; }
#這個(gè)類(lèi)里面的所有public的內(nèi)部類(lèi)的所有的成員變量和方法都不混淆
-keep public class me.febsky.testprogard.MainActivity$* { *; }
#這個(gè)類(lèi)里面的內(nèi)部類(lèi)的類(lèi)名不備混淆秸妥,方法和變量還是混淆的
-keep class me.febsky.testprogard.MainActivity$*
#保持一個(gè)類(lèi)的類(lèi)名不被混淆,里面的方法和成員變量名還是被混淆的
-keep public class me.febsky.testprogard.MyOutClass
### -----這是個(gè)列子---- ###
## for sharedSDK
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}
#butter knife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}