Android代碼混淆

代碼混淆的作用

  • 1.防止反編譯
  • 2.精簡編譯後的APK文件的大小

    代碼混淆的代碼語句寫於proguard-rules.pro文件中:
    這裏寫圖片描述

混淆參數詳解

-optimizationpasses 5     # 指定代碼的壓縮級別                                                 
-dontusemixedcaseclassnames   # 是否使用大小寫混合                                                  
-dontskipnonpubliclibraryclasses    # 是否混淆第三方jar                                            
-dontpreverify      # 混淆時是否做預校驗                                                          
-verbose          # 混淆時是否記錄日誌                                                             
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆時所採用的算法

-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.app.backup.BackupAgentHelper   # 保持哪些類不被混淆

-keep public class * extends android.preference.Preference                      # 保持哪些類不被混淆

-keep public class com.android.vending.licensing.ILicensingService   # 保持哪些類不被混淆

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆                                         
    native <methods>;
}

-keepclasseswithmembers class * {    # 保持自定義控件類不被混淆                                           
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * { # 保持自定義控件類不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);     
}

-keepclassmembers class * extends android.app.Activity {                        # 保持自定義控件類不被混淆
   public void *(android.view.View);
}

-keepclassmembers enum * {  # 保持枚舉 enum 類不被混淆                                                    
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {                                # 保持 Parcelable 不被混淆
  public static final android.os.Parcelable$Creator *;
}

-keep class MyClass;  # 保持自己定義的類不被混淆                                                          

Studio中啓用混淆
在對應的Module中的build.gradle文件中:

buildTypes {
    release {
        minifyEnabled true //設置爲true
        shrinkResources true //設置爲true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

或:
這裏寫圖片描述

注意事項

  • 1.所有的jar包都要做如下申明
-libraryjars libs/apns_1.0.6.jar  
  • 2.引用的第三方庫要參考對應的官方文檔
  • 3.support-v4包錯誤處理
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { ; }
  • 4.對於第三方庫的錯誤, 可以根據錯誤提示, 引入 -dontwarn com.xx.* 和 -keep class com.xx.* ,這樣可以讓proguard不混淆對應的類的方法, 同時也讓proguard不要生成告警信息
發佈了60 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章