一.介紹
通常情況下編譯后的字節碼包含了大量調試信息(如源類名/行號等)
混淆代碼就能刪除這些調試信息,并用無意義字符替換所有名字,增加反編譯難度!
ProGuard是一個混淆Java代碼的開源項目,主要作用如下:
混淆Obfuscate 用無意義字符替換類名/字段名/屬性名/方法名等
壓縮Shrink 移除無用類/字段/屬性/方法
優化Optimize 移除無用字節碼指令
預檢preverify 預檢字節碼,確保可執行
二.混淆配置
在Android studio/build.gradle中
android {
...
buildTypes {
release {
//開啟混淆/壓縮
minifyEnabled true
//proguard-android.txt是Android SDK默認混淆配置文件,
//proguard-rules.pro是我們自定義混淆配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
1.自定義混淆文件proguard-rules.pro
#基本指令----------------------------------
-printmapping proguardMapping.txt #輸出混淆前后代碼映射關系
-keepattributes Signature #保留泛型
# -renamesourcefileattribute 重命名源碼文件.java #崩潰拋出異常時,源碼文件名自定義
-keepattributes SourceFile, LineNumberTable #崩潰拋出異常時,保留源碼文件名和源碼行號
#移除log代碼
#確保沒有開啟--dontoptimize選項
#默認混淆文件不要用proguard-android.txt,應該用proguard-android-optimize.txt
#assume no side effects假定無效, 標識無效代碼
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int d(...);
public static int i(...);
}
2.Android SDK默認混淆文件proguard-android.txt
AndroidSDK\tools\proguard\proguard-android.txt
\proguard-android-optimize.txt
其中proguard-android是不開啟優化的配置文件
proguard-android-optimize.tx是開啟優化的配置文件
#1.在proguard-android-optimize.txt中——————————————————————————————
#開啟優化
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
......剩下部分同proguard-android.txt
#2.在proguard-android.txt中———————————————————————————————————————
#不開啟優化, 會導致-assumenosideeffects無法去除log代碼
#如果要用-assumenosideeffects去除log代碼,默認混淆文件應該選proguard-android-optimize.txt
-dontoptimize
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-dontpreverify
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-dontwarn android.support.**
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
簡書: http://www.lxweimin.com/p/c667764f1f3a
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/72785344
GitHub博客:http://lioil.win/2017/05/27/Android_ProGuard.html
Coding博客:http://c.lioil.win/2017/02/27/Android_ProGuard.html