如何開啟/關(guān)閉代碼混淆:
# 在對(duì)應(yīng)模塊的build.gradle中的buildTypes下的release下添加:
#proguard-rules.pro就是我們需要添加混淆規(guī)則的文件
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
關(guān)閉混淆的話撮慨,需要把 minifyEnabled 改為false耕餐,并且把 shrinkResources true移除斤程。
混淆常用配置的作用:
-verbose 他的作用是混淆時(shí)記錄日志寸癌,通常會(huì)在 build/outputs/mapping/release下生成如下6個(gè)相關(guān)文件:
他們的作用分別是:
1. mapping.txt :這是一個(gè)文本文件榆浓,其中包含混淆前后的類和成員名稱之間的映射關(guān)系于未。每一行記錄了一個(gè)映射,通常包括混淆前的名稱和混淆后的名稱陡鹃,例如:
com.example.MyClass -> a.a.a:
void myMethod() -> a()
2. usage.txt :這個(gè)文件包含了ProGuard分析過(guò)程中的類和成員的使用信息烘浦。它記錄了哪些類和成員被引用了,以及它們是如何被引用的萍鲸。這個(gè)文件對(duì)于優(yōu)化混淆配置非常有用闷叉,可以幫助開發(fā)者去除未使用的代碼。
3. seeds.txt :這個(gè)文件包含了ProGuard保留的類和成員的列表脊阴。在混淆過(guò)程中握侧,有些類和成員可能需要被保留不被混淆,以確保應(yīng)用的功能正常運(yùn)行嘿期。這個(gè)文件列出了這些需要保留的類和成員品擎。
4. missing_rules.txt :文件的存在是為了提醒開發(fā)者在混淆配置中添加適當(dāng)?shù)谋A粢?guī)則,以確保這些類或成員不會(huì)被錯(cuò)誤地混淆或刪除备徐。開發(fā)者可以根據(jù)這個(gè)文件中列出的警告信息萄传,手動(dòng)更新混淆配置,以解決潛在的問(wèn)題并確保應(yīng)用的正常運(yùn)行蜜猾。
5. resources.txt : 的存在主要是為了幫助 ProGuard 在混淆處理時(shí)保留對(duì)資源文件的引用盲再,避免意外刪除或混淆這些資源文件西设,從而導(dǎo)致應(yīng)用在運(yùn)行時(shí)出現(xiàn)問(wèn)題。
6. configuration.txt :as自動(dòng)生成的答朋,對(duì)通用混淆配置的建議。我們可以參考棠笑。
我們可以指定文件生成的路徑梦碗,防止clean后日志丟失:
#混淆時(shí)記錄日志
-verbose
-printmapping proguardLog/mapping.txt
-printseeds proguardLog/seeds.txt
-printusage proguardLog/usage.txt
-dontwarn 用于告訴ProGuard在混淆過(guò)程中不要發(fā)出警告。這個(gè)指令通常用于防止ProGuard在處理某些類或方法時(shí)產(chǎn)生不必要的警告信息蓖救。防止無(wú)效警告洪规、簡(jiǎn)化輸出信息。
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.Conscrypt$Version
-dontwarn org.conscrypt.Conscrypt
-dontwarn org.conscrypt.ConscryptHostnameVerifier
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE
-dontnote 可以幫助你在混淆過(guò)程中過(guò)濾掉某些類型的筆記信息循捺,使輸出日志更加清晰和易于理解斩例。
其實(shí)混淆規(guī)則大部分用默認(rèn)的就好,即configuration.txt 中和missing_rules.txt 中建議的配置就好从橘,算是通用配置念赶。其他像第三方依賴、room數(shù)據(jù)庫(kù)這些我們其實(shí)都可以不用配混淆規(guī)則恰力,因?yàn)橐话阕龅暮玫牡谌揭蕾嚩紩?huì)在自己的庫(kù)中帶上混淆叉谜。我們沒(méi)有必要再粘貼一遍了。這樣可以保持我們的混淆文件始終干凈整潔踩萎。
然后像我們需要額外配置規(guī)則的一般是涉及到序列化\反序列化的類停局,即bean、各種實(shí)體類等(為了方便香府,我們應(yīng)將項(xiàng)目中用到的所有bean歸類到一個(gè)或幾個(gè)公用的文件夾中)董栽。比如:
# 保留bean下的類都不被混淆
-keep class com.xxx.xxx.beans.** { *; }
還有就是如果項(xiàng)目中用到了EventBus的話,需要為Subscribe加上混淆規(guī)則企孩。因?yàn)镋ventBus的Subscribe對(duì)方法有要求锭碳,即必須是public修飾符修飾的,不然會(huì)報(bào)錯(cuò)柠硕。所以工禾,我們應(yīng)在混淆文件中加上:
# 保留 EventBus 的訂閱方法,非常必要
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
proguard-rules.pro文件完整配置如下:(基本有這個(gè)配置就差不多了蝗柔,其他根據(jù)項(xiàng)目中實(shí)際遇到的問(wèn)題再加闻葵。)
# 固定寫法(通用配置),configuration.txt
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# This class is deprecated, but remains for backward compatibility.
-dontwarn android.util.FloatMath
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep class androidx.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keep @androidx.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**
# 添加missing_rules.txt中的配置
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.Conscrypt$Version
-dontwarn org.conscrypt.Conscrypt
-dontwarn org.conscrypt.ConscryptHostnameVerifier
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE
#==下面才是跟應(yīng)用相關(guān)的混淆配置=================================================================================================
#混淆時(shí)記錄日志
-printmapping proguardLog/mapping.txt
-printseeds proguardLog/seeds.txt
-printusage proguardLog/usage.txt
# 保留bean下的類都不被混淆
-keep class com.***.*.beans.** { *; }
# 保留 EventBus 的訂閱方法癣丧,非常必要
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}