Android混淆

如何開啟/關(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)文件:

image.png

他們的作用分別是:

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>;
}






?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槽畔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胁编,更是在濱河造成了極大的恐慌厢钧,老刑警劉巖鳞尔,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異早直,居然都是意外死亡寥假,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門霞扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糕韧,“玉大人,你說(shuō)我怎么就攤上這事喻圃∮┎剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵斧拍,是天一觀的道長(zhǎng)雀扶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肆汹,這世上最難降的妖魔是什么愚墓? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮县踢,結(jié)果婚禮上转绷,老公的妹妹穿的比我還像新娘。我一直安慰自己硼啤,他們只是感情好议经,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谴返,像睡著了一般煞肾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗓袱,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天籍救,我揣著相機(jī)與錄音,去河邊找鬼渠抹。 笑死蝙昙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梧却。 我是一名探鬼主播奇颠,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼放航!你這毒婦竟也來(lái)了烈拒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荆几,沒(méi)想到半個(gè)月后吓妆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨铸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年行拢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诞吱。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剂陡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狐胎,到底是詐尸還是另有隱情,我是刑警寧澤歌馍,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布握巢,位于F島的核電站,受9級(jí)特大地震影響松却,放射性物質(zhì)發(fā)生泄漏暴浦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一晓锻、第九天 我趴在偏房一處隱蔽的房頂上張望歌焦。 院中可真熱鬧,春花似錦砚哆、人聲如沸独撇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纷铣。三九已至,卻和暖如春战转,著一層夾襖步出監(jiān)牢的瞬間搜立,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工槐秧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啄踊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓刁标,卻偏偏與公主長(zhǎng)得像颠通,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子命雀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 混淆是上線前挺重要的一個(gè)環(huán)節(jié)蒜哀。Android使用的ProGuard,可以起到壓縮,混淆撵儿,預(yù)檢乘客,優(yōu)化的作用。但...
    lhccccc閱讀 796評(píng)論 0 1
  • 一、為什么進(jìn)行混淆 Java 是一種跨平臺(tái)的浪默、解釋型語(yǔ)言牡直,Java 源代碼編譯成中間”字節(jié)碼”存儲(chǔ)于 class ...
    dongzi711閱讀 3,495評(píng)論 0 2
  • 代碼混淆(Obfuscated code)亦稱花指令,是將計(jì)算機(jī)程序的代碼纳决,轉(zhuǎn)換成一種功能上等價(jià)碰逸,但是難于閱讀和理...
    一s獨(dú)秀閱讀 89,847評(píng)論 13 197
  • 在 Android 日常開發(fā)過(guò)程中,混淆是我們開發(fā) App 的一項(xiàng)必不可少的技能阔加。只要是我們親身經(jīng)歷過(guò) App 打...
    水月沐風(fēng)閱讀 3,758評(píng)論 3 34
  • 混淆饵史,將類名、方法名胜榔、成員變量等重命名為無(wú)意義的簡(jiǎn)短名稱胳喷,以增加逆向工程的難度,同時(shí)通過(guò)移除無(wú)用的類減少包的大小夭织。...
    Parallel_Lines閱讀 709評(píng)論 0 2