Hyena-詞典-非常精簡(jiǎn)的混淆使用

[Hyena鬣狗快速開發(fā)庫(kù)][Hyena]核心為快速開發(fā),定位小巧精悍攀唯,內(nèi)容簡(jiǎn)單精致洁桌,整合常用ViewBase類侯嘀、通用另凌、詞典推薦類庫(kù)

為什么混淆

  • android的ProGuard戒幔,可以起到壓縮吠谢,混淆,預(yù)檢溪食,優(yōu)化的作用
  • 混淆流程將主項(xiàng)目以及依賴庫(kù)中未被使用的類囊卜、類成員、方法错沃、屬性移除栅组,這有助于規(guī)避64K方法數(shù)的瓶頸
  • 同時(shí),將類枢析、類成員玉掸、方法重命名為無意義的簡(jiǎn)短名稱,增加了逆向工程的難度
  • 而依靠 Gradle 的 Android 插件醒叁,我們將移除未被使用的資源司浪,可以有效減小 apk 安裝包大小泊业。

怎么混淆 [使用示例][使用示例]

  • 開啟混淆
buildTypes {
   release {
        minifyEnabled true      //開啟混淆
        shrinkResources true    //打開資源壓縮(去除沒有引用的資源)
        zipAlignEnabled true    //zipAlign可以讓安裝包中的資源按4字節(jié)對(duì)齊,這樣可以減少應(yīng)用在運(yùn)行時(shí)的內(nèi)存消耗啊易。
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
  • proguard-rules.pro 基本配置
#指定壓縮級(jí)別
-optimizationpasses 5
#不跳過非公共的庫(kù)的類成員
-dontskipnonpubliclibraryclassmembers
#混淆時(shí)采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#把混淆類中的方法名也混淆了
-useuniqueclassmembernames
#優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員
-allowaccessmodification
#將文件來源重命名為“SourceFile”字符串
-renamesourcefileattribute SourceFile
#保留行號(hào)
-keepattributes SourceFile,LineNumberTable
#保持泛型
-keepattributes Signature
#保護(hù)注解
-keepattributes *Annotation*
#R文件的靜態(tài)成員
-keepclassmembers class **.R$* {
    public static <fields>;
}
  • 進(jìn)階配置
# 保持native方法不被混淆    
-keepclasseswithmembernames class * { 
    native <methods>;
}
#Parcelable
-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}
#保持所有實(shí)現(xiàn) Serializable 接口的類成員
-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();
}
#枚舉
-keepclassmembers enum * {
    **[] $VALUES;
    public *;
}
  • 基本規(guī)則
#一顆星表示只是保持該包下的類名吁伺,而子包下的類名還是會(huì)被混淆
-keep class com.knifestone.hyena.test.*
#兩顆星表示把本包和所含子包下的類名都保持
-keep class com.knifestone.hyena.test.**
#用以上方法保持類后,你會(huì)發(fā)現(xiàn)類名雖然未混淆租谈,但里面的具體方法和變量命名還是變了
#如果既想保持類名篮奄,又想保持里面的內(nèi)容不被混淆
-keep class com.knifestone.hyena.test.* {*;}
#也可以使用Java的基本規(guī)則來保護(hù)特定類不被混淆,用extend割去,implement等這些Java規(guī)則
#如下表示:避免所有繼承Activity的類被混淆
-keep public class * extends android.app.Activity
#如果我們要保留一個(gè)類中的內(nèi)部類不被混淆則需要用$符號(hào)
#如下表示:保持ScriptFragment內(nèi)部類JavaScriptInterface中的所有public內(nèi)容不被混淆
-keepclassmembers class com.knifestone.hyena.ui.fragment.ScriptFragment$JavaScriptInterface {
   public *;
}
#一個(gè)類中你不希望保持全部?jī)?nèi)容不被混淆窟却,而只是希望保護(hù)類下的特定內(nèi)容,就可以使用
#如下表示:One類下的所有public方法都不會(huì)被混淆
-keep class com.knifestone.hyena.One {
    public <methods>;
}
#如下表示:用JSONObject作為入?yún)⒌臉?gòu)造函數(shù)不會(huì)被混淆
-keep class com.knifestone.hyena.One {
   public <init>(org.json.JSONObject);
}
#不需要保持類名呻逆,我只需要把該類下的特定方法保持不被混淆就好夸赫,需要用keepclassmembers
-keep    防止類和成員被移除或者被重命名
-keepnames    防止類和成員被重命名
-keepclassmembers    防止成員被移除或者被重命名
-keepnames    防止成員被重命名
-keepclasseswithmembers    防止擁有該成員的類和成員被移除或者被重命名
-keepclasseswithmembernames    防止擁有該成員的類和成員被重命名
  • 注意事項(xiàng)

1,jni方法不可混淆咖城,因?yàn)檫@個(gè)方法需要和native方法保持一致
2茬腿,反射用到的類不混淆(否則反射可能出現(xiàn)問題);
3酒繁,AndroidMainfest中的類不混淆滓彰,所以四大組件和Application的子類和Framework層下所有的類默認(rèn)不會(huì)進(jìn)行混淆。自定義的View默認(rèn)也不會(huì)被混淆州袒;所以像網(wǎng)上貼的很多排除自定義View,或四大組件被混淆的規(guī)則在Android Studio中是無需加入的弓候;
4郎哭,與服務(wù)端交互時(shí),使用GSON菇存、fastjson等框架解析服務(wù)端數(shù)據(jù)時(shí)夸研,所寫的JSON對(duì)象類不混淆,否則無法將JSON解析成對(duì)應(yīng)的對(duì)象
5依鸥,使用第三方開源庫(kù)或者引用其他第三方的SDK包時(shí)亥至,如果有特別要求,也需要在混淆文件中加入對(duì)應(yīng)的混淆規(guī)則
6贱迟,有用到WebView的JS調(diào)用也需要保證寫的接口方法不混淆姐扮,原因和第一條一樣
7,Parcelable的子類和Creator靜態(tài)成員變量不混淆衣吠,否則會(huì)產(chǎn)生Android.os.BadParcelableException異常
8茶敏,使用enum類型時(shí)應(yīng)不被混淆

  • mapping.txt

混淆后默認(rèn)會(huì)在工程目錄app/build/outputs/mapping/release下生成一個(gè)mapping.txt文件,這就是混淆規(guī)則缚俏,我們可以根據(jù)這個(gè)文件把混淆后的代碼反推回源本的代碼惊搏,所以這個(gè)文件很重要贮乳,注意保護(hù)好。

  • 伸手黨福利 (開袋即食)
# 基本配置區(qū) ################### 分割線
#指定壓縮級(jí)別
-optimizationpasses 5
#不跳過非公共的庫(kù)的類成員
-dontskipnonpubliclibraryclassmembers
#混淆時(shí)采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#把混淆類中的方法名也混淆了
-useuniqueclassmembernames
#優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員
-allowaccessmodification
#將文件來源重命名為“SourceFile”字符串
-renamesourcefileattribute SourceFile
#保留行號(hào)
-keepattributes SourceFile,LineNumberTable
#保持泛型
-keepattributes Signature
#保護(hù)注解
-keepattributes *Annotation*
# 進(jìn)階配置區(qū) ################### 分割線
#R文件的靜態(tài)成員
-keepclassmembers class **.R$* {
    public static <fields>;
}
# 保持native方法不被混淆    
-keepclasseswithmembernames class * { 
    native <methods>;
}
#Parcelable
-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}
#保持所有實(shí)現(xiàn) Serializable 接口的類成員
-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();
}
#枚舉
-keepclassmembers enum * {
    **[] $VALUES;
    public *;
}
# 自定配置區(qū) ################### 分割線
#實(shí)體類
#-keep class 實(shí)體類所在包.** { *; }
#與js交互的類
#與反射有關(guān)的類和方法
#第三方庫(kù)       

更多功能請(qǐng)前往Github查看恬惯,傳送門: [Hyena鬣狗快速開發(fā)庫(kù)][Hyena]
[Hyena]:https://github.com/KnifeStone/Hyena
[AndroidUtilCode]:https://github.com/Blankj/AndroidUtilCode
[使用示例]:https://github.com/KnifeStone/Hyena/blob/master/wikis/proguard-rules.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末向拆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酪耳,更是在濱河造成了極大的恐慌浓恳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葡兑,死亡現(xiàn)場(chǎng)離奇詭異奖蔓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讹堤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門吆鹤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洲守,你說我怎么就攤上這事疑务。” “怎么了梗醇?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵知允,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我叙谨,道長(zhǎng)温鸽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任手负,我火速辦了婚禮涤垫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竟终。我一直安慰自己蝠猬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布统捶。 她就那樣靜靜地躺著榆芦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喘鸟。 梳的紋絲不亂的頭發(fā)上匆绣,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音迷守,去河邊找鬼犬绒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兑凿,可吹牛的內(nèi)容都是我干的凯力。 我是一名探鬼主播茵瘾,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咐鹤!你這毒婦竟也來了拗秘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤祈惶,失蹤者是張志新(化名)和其女友劉穎雕旨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捧请,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡涩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疹蛉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活箕。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖可款,靈堂內(nèi)的尸體忽然破棺而出育韩,到底是詐尸還是另有隱情,我是刑警寧澤闺鲸,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布筋讨,位于F島的核電站,受9級(jí)特大地震影響摸恍,放射性物質(zhì)發(fā)生泄漏悉罕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一立镶、第九天 我趴在偏房一處隱蔽的房頂上張望蛮粮。 院中可真熱鬧,春花似錦谜慌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至令哟,卻和暖如春恼琼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屏富。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工晴竞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狠半。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓噩死,卻偏偏與公主長(zhǎng)得像颤难,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子已维,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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