Android開發(fā)之代碼混淆

應(yīng)用混淆(ProGuard)

ProGuard是一個免費的JAVA類文件壓縮浩蓉,優(yōu)化恢暖,混淆器。

它探測并刪除沒有使用的類惊楼,字段萤晴,方法和屬性,它刪除沒有用的說明并使用字節(jié)碼得到最大優(yōu)化胁后,它使用無意義的名字重命名類店读,字段和方法。

我們先來介紹下ProGuard

我們?yōu)樯兑褂肞roGuard?

  • 優(yōu)化應(yīng)用:創(chuàng)建緊湊的代碼文檔是為了更快的網(wǎng)絡(luò)傳輸攀芯,快速裝載和更小的內(nèi)存占用屯断;
  • 防止反向:創(chuàng)建的程序和程序庫很難使用反向工程;
  • 預(yù)處理應(yīng)用:充分利用JAVA的快捷加載的優(yōu)點來提前檢測和返回JAVA中存在的類文件侣诺。

有些什么參數(shù)可用殖演?

  • -include {filename} 從指定的文件中讀取配置參數(shù)
  • -basedirectory {directoryname} 指定基礎(chǔ)目錄為以后相對的檔案文件
  • -injars {class_path} 指定要處理的應(yīng)用程序jar,war,ear的目錄
  • -outjars {class_path} 指定處理完后要輸出的jar,war,ear目錄的名稱
  • -libraryjars {class_path} 指定要處理的應(yīng)用程序jar,war,ear和目錄所需要的程序庫文件
  • dontskipnonpubliclibraryclasses 指定不去忽略非公共的庫類
  • dontskipnonpubliclibraryclassmebmbers 指定不去忽略可見的庫類的成員

上面提到了Jar、war年鸳、ear三種文件
Jar趴久、war、ear搔确、在文件結(jié)構(gòu)上彼棍,三者并沒有什么不同,它們都采用zip或jar檔案文件壓縮格式膳算。但是它們的使用目的有所區(qū)別:
Jar文件(擴展名為. Jar座硕,Java Application Archive)包含Java類的普通庫、資源(resources)涕蜂、輔助文件(auxiliary files)等华匾。

War文件(擴展名為.War,Web Application Archive)包含全部Web應(yīng)用程序。在這種情形下机隙,一個Web應(yīng)用程序被定義為單獨的一組文件蜘拉、類和資源,用戶可以對jar文件進行封裝有鹿,并把它作為小型服務(wù)程序(servlet)來訪問旭旭。

Ear文件(擴展名為.Ear,Enterprise Application Archive)包含全部企業(yè)應(yīng)用程序。在這種情形下印颤,一個企業(yè)應(yīng)用程序被定義為多個jar文件您机、資源、類和Web應(yīng)用程序的集合。

每一種文件(.jar, .war, .ear)只能由應(yīng)用服務(wù)器(application servers)际看、小型服務(wù)程序容器(servlet containers)咸产、EJB容器(EJB containers)等進行處理。

有哪些保留選項仲闽?

  • -keep {Modifier} {class_specification} 保護指定的類文件和類的成員
  • -keepclassmembers {Modifier} {class_specification} 保護指定類的成員脑溢,如果此類受到保護他們會保護得更好
  • -keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是所有指定的類和類的成員是要存在的
  • -keepnams {class_specification} 保護指定的類的成員和名稱(如果他們不會在壓縮的過程中被刪除)
  • -keepclassmembernames {class_specification} 保護指定類的成員的名稱(如果他們不會在壓縮的過程中被刪除)
  • -keepclasseswithmembersnams {class_specification} 保護指定的類和類成員的名稱赖欣,如果所有指定的類成員出席(在壓縮之后)
  • -printseeds {filename} 列出類和類成員-keep選項的清單屑彻,標準輸出到給定的文件

壓縮

  • dontshrink 不壓縮輸入的類文件
  • printusage {filename}
  • whyareyoukeeping {class_specification}

優(yōu)化

  • -dontoptimize 不優(yōu)化輸入的類文件
  • -assumenosideeffects {class_specification} 優(yōu)化時假設(shè)指定的方法,沒有任何副作用
  • -allowaccessmodification 優(yōu)化時允許訪問并修改有修飾符的類和類的成員

混淆

  • -dontobfuscate 不混淆輸入的類文件
  • -printmapping {filename}
  • -applymapping {filename} 重用映射增加混淆
  • -obfuscationdictionary {filename} 使用給定文件中的關(guān)鍵字作為要混淆方法的名稱
  • -overloadaggressively 混淆時應(yīng)用侵入式重載
  • -useuniqueclassmembernames 確定統(tǒng)一的混淆類的成員名稱來增加混淆
  • -flattenpackagehierarchy {package_name} 重新包裝所有重命名的包并放在給定的單一包中
  • -repackageclass {package_name} 重新包裝所有重命名的類文件中放在給定的單一包中
  • -dontusemixedcaseclassnames 混淆時不會產(chǎn)生形形色色的類名
  • -keepattributes {attribute_name,...} 保護給定的可選屬性顶吮,例如LocalVariableTable(本地變量), SourceFile(源文件)社牲, InnerClasses(內(nèi)部類)
  • -renamesourcefileattribute {string} 設(shè)置源文件中給定的字符串常量

上面介紹了一下ProGuard的基本方法

下面來介紹一下Android中的混淆文件。
對應(yīng)于項目下的proguard-rules.pro文件

基本配置項

1.指定要處理的應(yīng)用程序jar,war,ear和目錄所需要的程序庫文件

-libraryjars libs/apns_1.0.6.jar
-libraryjars libs/armeabi/libBaiduMapSDK_v2_3_1.so
-libraryjars libs/armeabi/liblocSDK4.so
-libraryjars libs/core.jar
-libraryjars libs/gesture-imageview.jar
-libraryjars libs/gson-2.6.2.jar
-libraryjars libs/infogracesound.jar
-libraryjars libs/universal-image-loader-1.9.0.jar

方法: libraryjars jar路徑 ->libraryjars 項目中導(dǎo)入的jar包等
現(xiàn)在Studio的話可以忽略此配置了悴了。

2.不優(yōu)化輸入的class文件搏恤,默認情況下是啟用優(yōu)化的

#不優(yōu)化輸入的class文件,默認情況下是啟用優(yōu)化的
-dontoptimize

3.Proguard對你的代碼進行迭代優(yōu)化的次數(shù) 0~7湃交,一直優(yōu)化到代碼不能被優(yōu)化為止

#Proguard對你的代碼進行迭代優(yōu)化的次數(shù) 0~7熟空,一直優(yōu)化到代碼不能被優(yōu)化為止
-optimizationpasses 5

4.跳過庫中非public的類,可以加快proguard處理速度搞莺;但是有些類庫包含從public類中繼承來的非public類息罗。這時如果加了這條會產(chǎn)生一個warning(find classes)

-skipnonpubliclibraryclasses

5.指定不去忽略非公共的庫類

-dontskipnonpubliclibraryclasses

6.指定不去忽略包可見的庫類的成員。

-dontskipnonpubliclibraryclassmembers

7.確定統(tǒng)一的混淆類的成員名稱來增加混淆

-useuniqueclassmembernames

8.混淆時不會產(chǎn)生形形色色的類名

-dontusemixedcaseclassnames

9.混淆前認證,去掉可加快混淆速度

-dontpreverify

10.假如項目中有用到注解,保留注解才沧,不混淆

-keepattributes *Annotation*

Android中的配置項

1.保留所有的v4包中類不被混淆

-keep class android.support.v4.**

2.保留所有的v4包中接口不被混淆

-keep interface android.support.v4.**

3.保留系統(tǒng)中繼承v4/v7包的類迈喉,不被混淆

-keep class android.support.** { *; }
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.** { *; }
-keep public class * extends android.support.v7.**
-keep interface android.support.v7.app.** { *; }
-dontwarn android.support.**

4.保留系統(tǒng)中繼實現(xiàn)v4/v7包的接口,不被混淆

-keep public class * implements android.support.v4.**
-dontwarn android.support.v4.**

5.所有的native方法不被混淆

-keepclasseswithmembers class * {
    native <methods>;
}

6.自定義View構(gòu)造方法不混淆

-keepclasseswithmembers class * {
    public <init>(android.content.Context);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context,android.util.AttributeSet);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context,android.util.AttributeSet,int);
}

被Android Resource 文件引用到糜工,名字已經(jīng)固定弊添,不能混淆。

7.枚舉不被混淆

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

8.release版不打印log

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** e(...);
    public static *** w(...);
}

9.四大組件不能混淆

-dontwarn android.support.v4.**
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v4.** { *; }
-keep public class * extends android.app.Application

-dontwarn android.support.v7.**
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Fragment
-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

10.Design包不混淆

-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

11.確保JavaBean不被混淆-否則Gson將無法將數(shù)據(jù)解析成具體對象

-keep class com.rair.circle.bean.** { *; }
-keep class com.rair.circle.db.bean.** { *; }

12.不混淆資源類

-keepclassmembers class **.R$* {
    public static <fields>;
}

13.忽略警告

-ignorewarning

當我們使用第三方框架捌木,jar包,如果配置混淆嫉戚,都有對應(yīng)的混淆配置提供刨裆。
例如Jpush(極光推送)



我們只要copy到項目混淆文件中就行

最后

混淆時是否記錄日志

-verbose  

1.apk包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)

-dump class_files.txt  

2.未混淆的類和成員

-printseeds seeds.txt  

3.列出從 apk 中刪除的代碼

-printusage unused.txt  

4.混淆前后的映射

-printmapping mapping.txt  

把混淆配置好后,記得在build.gradle打開混淆(設(shè)置為true)

   buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彬檀,一起剝皮案震驚了整個濱河市帆啃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窍帝,老刑警劉巖努潘,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡疯坤,警方通過查閱死者的電腦和手機报慕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压怠,“玉大人眠冈,你說我怎么就攤上這事【保” “怎么了蜗顽?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雨让。 經(jīng)常有香客問我雇盖,道長,這世上最難降的妖魔是什么栖忠? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任崔挖,我火速辦了婚禮,結(jié)果婚禮上娃闲,老公的妹妹穿的比我還像新娘虚汛。我一直安慰自己,他們只是感情好皇帮,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布卷哩。 她就那樣靜靜地躺著,像睡著了一般属拾。 火紅的嫁衣襯著肌膚如雪将谊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天渐白,我揣著相機與錄音尊浓,去河邊找鬼。 笑死纯衍,一個胖子當著我的面吹牛栋齿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播襟诸,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瓦堵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歌亲?” 一聲冷哼從身側(cè)響起菇用,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陷揪,沒想到半個月后惋鸥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杂穷,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年卦绣,在試婚紗的時候發(fā)現(xiàn)自己被綠了耐量。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡迎卤,死狀恐怖拴鸵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜗搔,我是刑警寧澤劲藐,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站樟凄,受9級特大地震影響聘芜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缝龄,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一汰现、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叔壤,春花似錦瞎饲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俺亮,卻和暖如春驮捍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脚曾。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工东且, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人本讥。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓珊泳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拷沸。 傳聞我的和親對象是個殘疾皇子旨椒,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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