Android Studio實現代碼混淆

1,在build.grandle添加,其中規則寫在proguard-rules.pro中,也能夠自定義一個文件,將其代替,好比eclipse經常使用的 proguard-project.txtjava

buildTypes {
  release {
    signingConfig signingConfigs.release
    minifyEnabled true
    proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
  }}

2,在proguard-rules.pro中加入如下代碼,基本能夠涵蓋全部android


-ignorewarnings
#指定代碼的壓縮級別
-optimizationpasses 5
#包明不混合大小寫
-dontusemixedcaseclassnames
#不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses
#優化  不優化輸入的類文件
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
#預校驗
-dontpreverify
#混淆時是否記錄日誌
-verbose
# 混淆時所採用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#保護註解
-keepattributes *Annotation*
# 保持哪些類不被混淆
-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

#若是有引用v4包能夠添加下面這行
#-keep public class * extends android.support.v4.app.Fragment
#忽略警告
-ignorewarning
#####################記錄生成的日誌數據,gradle build時在本項目根目錄輸出################
#apk 包內全部 class 的內部結構
-dump class_files.txt
#未混淆的類和成員
-printseeds seeds.txt
#列出從 apk 中刪除的代碼
-printusage unused.txt
#混淆先後的映射
-printmapping mapping.txt

#####################記錄生成的日誌數據,gradle build時 在本項目根目錄輸出-end################
##############混淆保護本身項目的部分代碼以及引用的第三方jar包library,android studio默認已添加到打包腳本中,不用重複添加######

#XUtils混淆
-keep class com.lidroid.** { *; }

#org.apache.http.legacy.jar混淆
-keep class org.apache.**{*;}

#友盟
-keep class com.umeng.**{*;}
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**
-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep public class [your_pkg].R$*{
   public static final int *;
}

#支付寶
#BeeCloud
-dontwarn cn.beecloud.**
#PayPal
-dontwarn com.paypal.**
-dontwarn io.card.payment.**
#保留類簽名聲明
-keepattributes Signature
#BeeCloud
-keep class cn.beecloud.** { *; }
-keep class com.google.** { *; }
#支付寶
-keep class com.alipay.** { *; }
#微信
-keep class com.tencent.** { *; }
#銀聯
-keep class com.unionpay.** { *; }
#百度
-keep class com.baidu.** { *; }
-keep class com.dianxinos.** { *; }
#PayPal
-keep class com.paypal.** { *; }
-keep class io.card.payment.** { *; }

#信鴿推送
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep class com.tencent.android.tpush.**  {* ;}
-keep class com.tencent.mid.**  {* ;}

#本身項目特殊處理代碼
#忽略警告
-dontwarn com.bobaoo.xiaobao.domain.**
#保留一個完整的包
-keep class com.bobaoo.xiaobao.domain.** {
   *;
}

#若是引用了v4或者v7包
-dontwarn android.support.**

-keep public class * extends android.view.View {
   public <init>(android.content.Context);
   public <init>(android.content.Context, android.util.AttributeSet);
   public <init>(android.content.Context, android.util.AttributeSet, int);
   public void set*(...);
}

#保持 native 方法不被混淆
-keepclasseswithmembernames class * {
   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);
}

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

#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable
#保持 Serializable 不被混淆而且enum 類也不被混淆
-keepclassmembers class * implements java.io.Serializable {
   static final long serialVersionUID;
   private static final java.io.ObjectStreamField[] serialPersistentFields;
   !static !transient <fields>;
   !private <fields>;
   !private <methods>;
   private void writeObject(java.io.ObjectOutputStream);
   private void readObject(java.io.ObjectInputStream);
   java.lang.Object writeReplace();
   java.lang.Object readResolve();
}

#保持枚舉 enum 類不被混淆 若是混淆報錯,建議直接使用上面的 -keepclassmembers class * implements java.io.Serializable便可
-keepclassmembers enum * {
 public static **[] values();
 public static ** valueOf(java.lang.String);
}
-keepclassmembers class * {
   public void *ButtonClicked(android.view.View);
}

#不混淆資源類
-keepclassmembers class **.R$* {
   public static <fields>;
}
#避免混淆泛型 若是混淆報錯建議關掉
#–keepattributes Signature
#移除log 測試了下沒有用仍是建議本身定義一個開關控制是否輸出日誌
#-assumenosideeffects class android.util.Log {
#    public static boolean isLoggable(java.lang.String, int);
#    public static int v(...);
#    public static int i(...);
#    public static int w(...);
#    public static int d(...);
#    public static int e(...);
#}

注意:項目中的第三方jar包默認已經添加到腳本不用混淆了,但是混淆後運行會報錯找不到原有的方法,這是你須要保留jar中你須要的包,例如訪問網絡構架XUtils,apache的jar包中某些包的保留。web


#XUtils混淆
-keep class com.lidroid.** { *; }

#org.apache.http.legacy.jar混淆
-keep class org.apache.**{*;}
算法

相關文章
相關標籤/搜索