Android-SDK默認混淆配置ProGuard

一.介紹

通常情況下編譯后的字節碼包含了大量調試信息(如源類名/行號等)
混淆代碼就能刪除這些調試信息,并用無意義字符替換所有名字,增加反編譯難度!

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容