因為Java代碼是非常容易反編譯的,為了更好的保護Java源代碼包斑,我們需要對編譯好后的class文件進行混淆。這篇文章講解proguard代碼混淆相關(guān)技術(shù)知識點。
內(nèi)容目錄
- Proguard的功能
- 如何編寫Proguard文件
- 如何在Android Studio中使用代碼混淆
Proguard的功能:
- 壓縮(Shrink)檢測和刪除沒有使用的類针史,字段,方法和屬性
- 優(yōu)化(Optimize)對字節(jié)碼進行優(yōu)化碟狞,并且移除無用指令
- 混淆(Obfuscate)使用a啄枕,b,c等無意義的名稱族沃,對類频祝,字段和方法進行重命名
- 預(yù)檢(Preveirfy)在java平臺上對處理后的代碼進行預(yù)檢
??Proguard由shrink、optimize脆淹、obfuscate和preveirfy四個步驟組成常空,每個步驟都是可選的,我們可以配置腳本來決定執(zhí)行其中哪幾個步驟盖溺。經(jīng)過這四個步驟漓糙,我們的app可以有效的防止被惡意破解逆向分析,縮減apk的體積以及降低代碼的可閱讀性烘嘱。
如何編寫Proguard文件
- 基本混淆
- 針對app的量身定制
- 針對第三方j(luò)ar包的解決方案
基本混淆
# 代碼混淆壓縮比昆禽,在0和7之間,默認為5拙友,一般不需要改
-optimizationpasses 5
# 混淆時不使用大小寫混合为狸,混淆后的類名為小寫
-dontusemixedcaseclassnames
# 指定不去忽略非公共的庫的類
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共庫的類的成員
-dontskipnonpubliclibraryclassmembers
#不做預(yù)校驗
-dontpreverify
#生成映射文件
-verbose
#使用printmapping指定映射文件的名稱
-printmapping proguardMapping.txt
#指定混淆時采用的算法
-optimizations ! code/ simplification/arithmetic,!field/*.class/merging/*
#保護代碼中的Annotation不被混淆
-keepattributes *Annotation
#避免混淆泛型
-keepattributes Signature
#拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable
針對app的混淆保護
#保留四大組件,自定義的Application等不被混淆遗契,因為這些類都有可能被外部調(diào)用
-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.view.View
#保留native方法不被混淆
-keepclasswithmembername class * {native <method>}
#保留某些子類不被混淆
-keep public class * extends android.app.Activity
#保留R文件下的資源不被混淆
-keep class **.R${*;}
#保留枚舉類不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueof(java.lang.String);
}
針對第三方庫的混淆保護
#保留com.baidu.**這個包里的所有類和所有方法不被混淆
-keep class com.baidu.** {*;}
#讓Proguard不要警告找不到com.baidu.**這個包里的類的相關(guān)引用
-dontwarn com.baidu.**
如何在Android Studio中使用代碼混淆
一般我們的gradle文件中會這么寫混淆配置:
buildTypes {
debug {
minifyEnable false
}
release {
minifyEnable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rule.pro'
}
}
??上面的minifyEnable true表示開啟混淆辐棒,因為debug模式下為了加快編譯速度,所以關(guān)閉牍蜂。注意上面的proguardFiles后面寫到proguard-android.txt漾根,這是系統(tǒng)默認的混淆文件,位于sdk目錄下/tools/proguard內(nèi)鲫竞,其中包含了基本混淆辐怕,一般不需要改動,我們需要配置的時項目中與app處于同級目錄的proguard-rules.pro文件从绘。