AndroidStudio代码混淆

Android混淆基本配置

android {
    buildTypes {
        release {
            // 是否进行混淆
            minifyEnabled true
            //Zipalign优化
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //对应的混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {

        }
    }
}

minifyEnabled 主要用来控制是否混淆,默认为false,将其设置为true,开启混淆。
接下来,我们需要配置项目下的proguard-rules.pro 文件,设置混淆规则。

配置混淆规则

混淆模板

#--------------------------第三方包--------------------------
#Gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
#这里填写自己项目中存放bean对象的具体路径
-keep class com.mirry.traveljournal.bean.**{*;}    
-keep class com.google.gson.* { *;}
-dontwarn com.google.gson.**

#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector{ *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

#Bugly错误日志
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

#--------------------------基本配置--------------------------
#指定代码的压缩(proguard对代码进行迭代优化的次数0-7)等级Android中一般设置为5
-optimizationpasses 5
#包名不使用大小写混合
-dontusemixedcaseclassnames
# 不混淆第三方引用的库
-dontskipnonpubliclibraryclasses
# 不做预校验
-dontpreverify
# 忽略警告
-ignorewarning
#apk 包内所有 class 的内部结构
-dump class_files.txt
#未混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt
# 保持Activity类及其子类不被混淆
-keep public class * extends android.app.Activity
# 保持Application类及其不被混淆
-keep public class * extends android.app.Application
# 保持Service类及其子类不被混淆
-keep public class * extends android.app.Service
# 保持BroadcastReceiver类及其不被混淆
-keep public class * extends android.content.BroadcastReceiver
# 保持ContentProvider类及其子类不被混淆
-keep public class * extends android.content.ContentProvider
# 保持BackupAgentHelper类及其子类不被混淆
-keep public class * extends android.app.backup.BackupAgentHelper
# 保持Preference类及其子类不被混淆
-keep public class * extends android.preference.Preference
# 保持Fragment类及其子类不被混淆
-keep public class * extends android.app.Fragment
#保持引用v4包下Fragment及其子类不被混淆
-keep public class * extends android.support.v4.app.Fragment
#保持 Serializable类及其实现类不被混淆
-keepnames class * implements java.io.Serializable
# 如果引用了v4或者v7包
-dontwarn android.support.**
# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}
#保护注解
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation {*;}
# 不混淆内部类
-keepattributes InnerClasses
#不混淆资源类即R文件
-keepclassmembers class **.R$* {
    public static <fields>;
}
#避免混淆泛型 如果混淆报错建议关掉
-keepattributes Signature
# 保持枚举 enum 类不被混淆
-keepclassmembers enum * {
   public static **[] values();
   public static ** valueOf(java.lang.String);
}

# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context);
}
# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
   public <init>(android.content.Context, android.util.AttributeSet);
}
# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
   public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保持Activity中参数类型为View的所有方法
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

#所有View的子类及其子类的get、set方法都不进行混淆
-keepclassmembers 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);
    void set*(***);
    *** get*();
}

# 保持包含org.json.JSONObject参数的构造方法的类
-keepclassmembers class * {
   public <init> (org.json.JSONObject);
}
# 有用到WEBView的JS调用接口不被混淆
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  public *;
}
#移除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(...);
  }

注意
butterknife 混淆不同版本混淆规则不同,见下面第三行

butterknife低版本混淆代码(7.0以下,我用的是5.1.1)

 -keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector{ *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

butterknife高版本混淆代码(7.0以上)

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

猜你喜欢

转载自blog.csdn.net/qq_35263273/article/details/80801621
今日推荐