Android混淆

如何開啟/關(guān)閉代碼混淆:

# 在對應(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 他的作用是混淆時記錄日志,通常會在 build/outputs/mapping/release下生成如下6個相關(guān)文件:

image.png

他們的作用分別是:

1. mapping.txt :這是一個文本文件,其中包含混淆前后的類和成員名稱之間的映射關(guān)系。每一行記錄了一個映射,通常包括混淆前的名稱和混淆后的名稱,例如:
com.example.MyClass -> a.a.a:
   void myMethod() -> a()

2. usage.txt :這個文件包含了ProGuard分析過程中的類和成員的使用信息。它記錄了哪些類和成員被引用了,以及它們是如何被引用的。這個文件對于優(yōu)化混淆配置非常有用,可以幫助開發(fā)者去除未使用的代碼。

3. seeds.txt :這個文件包含了ProGuard保留的類和成員的列表。在混淆過程中,有些類和成員可能需要被保留不被混淆,以確保應(yīng)用的功能正常運(yùn)行。這個文件列出了這些需要保留的類和成員。

4. missing_rules.txt :文件的存在是為了提醒開發(fā)者在混淆配置中添加適當(dāng)?shù)谋A粢?guī)則,以確保這些類或成員不會被錯誤地混淆或刪除。開發(fā)者可以根據(jù)這個文件中列出的警告信息,手動更新混淆配置,以解決潛在的問題并確保應(yīng)用的正常運(yùn)行。

5. resources.txt : 的存在主要是為了幫助 ProGuard 在混淆處理時保留對資源文件的引用,避免意外刪除或混淆這些資源文件,從而導(dǎo)致應(yīng)用在運(yùn)行時出現(xiàn)問題。

6. configuration.txt :as自動生成的,對通用混淆配置的建議。我們可以參考。

我們可以指定文件生成的路徑,防止clean后日志丟失:

#混淆時記錄日志
-verbose
-printmapping proguardLog/mapping.txt
-printseeds proguardLog/seeds.txt
-printusage proguardLog/usage.txt

-dontwarn 用于告訴ProGuard在混淆過程中不要發(fā)出警告。這個指令通常用于防止ProGuard在處理某些類或方法時產(chǎ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 可以幫助你在混淆過程中過濾掉某些類型的筆記信息,使輸出日志更加清晰和易于理解。

其實(shí)混淆規(guī)則大部分用默認(rèn)的就好,即configuration.txt 中和missing_rules.txt 中建議的配置就好,算是通用配置。其他像第三方依賴、room數(shù)據(jù)庫這些我們其實(shí)都可以不用配混淆規(guī)則,因?yàn)橐话阕龅暮玫牡谌揭蕾嚩紩谧约旱膸熘袔匣煜N覀儧]有必要再粘貼一遍了。這樣可以保持我們的混淆文件始終干凈整潔。

然后像我們需要額外配置規(guī)則的一般是涉及到序列化\反序列化的類,即bean、各種實(shí)體類等(為了方便,我們應(yīng)將項(xiàng)目中用到的所有bean歸類到一個或幾個公用的文件夾中)。比如:

# 保留bean下的類都不被混淆
-keep class com.xxx.xxx.beans.** { *; }

還有就是如果項(xiàng)目中用到了EventBus的話,需要為Subscribe加上混淆規(guī)則。因?yàn)镋ventBus的Subscribe對方法有要求,即必須是public修飾符修飾的,不然會報錯。所以,我們應(yīng)在混淆文件中加上:

# 保留 EventBus 的訂閱方法,非常必要
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}

proguard-rules.pro文件完整配置如下:(基本有這個配置就差不多了,其他根據(jù)項(xiàng)目中實(shí)際遇到的問題再加。)

# 固定寫法(通用配置),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)的混淆配置=================================================================================================
#混淆時記錄日志
-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>;
}






?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 混淆是上線前挺重要的一個環(huán)節(jié)。Android使用的ProGuard,可以起到壓縮,混淆,預(yù)檢,優(yōu)化的作用。但...
    lhccccc閱讀 960評論 0 1
  • 一、為什么進(jìn)行混淆 Java 是一種跨平臺的、解釋型語言,Java 源代碼編譯成中間”字節(jié)碼”存儲于 class ...
    dongzi711閱讀 3,934評論 0 3
  • 代碼混淆(Obfuscated code)亦稱花指令,是將計算機(jī)程序的代碼,轉(zhuǎn)換成一種功能上等價,但是難于閱讀和理...
    一s獨(dú)秀閱讀 90,882評論 13 198
  • 在 Android 日常開發(fā)過程中,混淆是我們開發(fā) App 的一項(xiàng)必不可少的技能。只要是我們親身經(jīng)歷過 App 打...
    水月沐風(fēng)閱讀 3,919評論 3 34
  • 混淆,將類名、方法名、成員變量等重命名為無意義的簡短名稱,以增加逆向工程的難度,同時通過移除無用的類減少包的大小。...
    Parallel_Lines閱讀 838評論 0 2

友情鏈接更多精彩內(nèi)容