(通用)Android App代碼混淆終極解決方案

App雖然沒有那么的高大上嗡害,但是代碼的混淆是代表了程序員對App的責(zé)任心鹏控, 也是對App安全的一點點保證庶近。今天我會將自己做Android混淆的過程和體會分享給大家富蓄,也避免大家少走彎路,少跳坑尚镰。

本篇博客混淆基于Android Studio的IDE開發(fā)環(huán)境阀圾。

其實在android Studio中做混淆,基本就是對Proguard-rules.pro文件的操作钓猬∩缘叮混淆的過程也是有規(guī)律可循的。下面我將分幾個部分來分別介紹混淆過程敞曹。

(1)如何開啟混淆。
(2)混淆的公共部分综膀。
(3)需要我們不混淆的代碼澳迫。
(4)libs下的第三方Jar包的混淆方式。
(5)complie的第三方Jar包的混淆方式剧劝。
(6)代碼注釋的混淆方式橄登。
ok,大家準(zhǔn)備好了嗎?下面我就以流水賬的方式與大家分別介紹啦<ゴ恕(O(∩_∩)O 哈哈~)

1.如何開啟混淆

開始混淆很簡單拢锹,Android Studio中找到你的項目module的build.gradle
將minifyEnabled設(shè)置為true就ok。

2.公共部分

在混淆的過程中萄喳,有一部分是固定不變的卒稳。下面我將列出保持不變的模塊,只需將代碼Copy即可他巨。

1.基本指令區(qū)
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-ignorewarning
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable

#2.默認(rèn)保留區(qū)
-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
-keep class android.support.** {*;}

-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-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();
}
-keep class **.R$* {
 *;
}
-keepclassmembers class * {
    void *(**On*Event);
}

3.webview
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}
-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, jav.lang.String);
}

以上就是固定不變的部分充坑。

3.需要我們不混淆的代碼

不混淆用關(guān)鍵字-keep來修飾减江。不混淆的部分大概分為如下幾個模塊:

(1)實體類,json解析類
(2)第三方j(luò)ar包
(3)js和webview的調(diào)用模塊
(4)與反射相關(guān)的類和方法

大概就是以上幾個模塊捻爷,下面來看不混淆的代碼:

-keep class com.xx.xx.entity.** { *; }
2.第三方包
#eventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.** { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
#3.與js互相調(diào)用的類
 沒有可不寫
#4.反射相關(guān)的類和方法
-keep class com.xx.xx.xx.xx.view.** { *; }
-keep class com.xx.xx.xx.xx.xx.** { *; }

4.libs下的第三方Jar包的混淆方式

保留libs下的jar包的方式也很簡單辈灼,同樣是使用-keep關(guān)鍵字:
找到libs目錄,打開相對于的jar文件也榄,找到對應(yīng)的包名巡莹,然后添加如下代碼:
-keep class 包名.** { *; }

5.complie的第三方Jar包的混淆方式

complie的第三方Jar包的混淆方式和libs下的相同,只需要打開:
打開對應(yīng)的引用jar文件甜紫,然后同樣使用-keep class 包名.** { *; }

6.代碼注釋的混淆方式

我們在項目中肯定用到過有注釋方式的代碼榕莺,例如小刀(butterknife)。需要使用@Bind來修飾變量棵介。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钉鸯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子邮辽,更是在濱河造成了極大的恐慌唠雕,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨述,死亡現(xiàn)場離奇詭異岩睁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)揣云,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門捕儒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邓夕,你說我怎么就攤上這事刘莹。” “怎么了焚刚?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵点弯,是天一觀的道長。 經(jīng)常有香客問我矿咕,道長抢肛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任碳柱,我火速辦了婚禮捡絮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莲镣。我一直安慰自己福稳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布剥悟。 她就那樣靜靜地躺著灵寺,像睡著了一般曼库。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上略板,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天毁枯,我揣著相機(jī)與錄音,去河邊找鬼叮称。 笑死种玛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓤檐。 我是一名探鬼主播赂韵,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挠蛉!你這毒婦竟也來了祭示?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤谴古,失蹤者是張志新(化名)和其女友劉穎质涛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掰担,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汇陆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了带饱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡代。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勺疼,靈堂內(nèi)的尸體忽然破棺而出教寂,到底是詐尸還是另有隱情,我是刑警寧澤恢口,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布孝宗,位于F島的核電站,受9級特大地震影響耕肩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜问潭,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一猿诸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狡忙,春花似錦梳虽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谷炸。三九已至,卻和暖如春禀挫,著一層夾襖步出監(jiān)牢的瞬間旬陡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工语婴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留描孟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓砰左,卻偏偏與公主長得像匿醒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缠导,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351