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