Android 混淆

1.混淆介绍

Proguard 是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向。

2.混淆语法
关键字描述
keep保留类和类中的成员,防止被混淆或者移除
keepnames保留类和类中的成员,防止被混淆,但是当成员没有被引用时会被移除
keepclassmembers只保留类中的成员,防止被混淆或者移除
keepclassmembernames只保留类中的成员,防止被混淆, 但是当成员没有被引用时会被移除
keepclasseswithmembers保留类和类中的成员,前提是指明的类中必须含有该成员,没有的话还是会被混淆
keepclasseswithmembernames保留类和类中的成员,前提是指明的类中必须含有该成员,没有的话还是会被混淆。需要注意的是没有被引用的成员会被移除
关键字描述
< filed>匹配类中的所有字段
< method>匹配类中的所有方法
< init>匹配类中的所有构造方法
*匹配任意长度字符,但不含包名分隔符(.) 。如:com.strugglelin.* 匹配 com.strugglelin.proguard,不匹配 com.strugglelin.proguard.test
**匹配任意长度字符,并且包含包名分隔符(.)。如: com.strugglelin.** 匹配 com.strugglelin.proguard.test
***匹配任意参数类型。如:void set*(***) 匹配 void setName(String a) 等
匹配任意长度的任意类型参数。如:void test*(…) 匹配 void test(String a,int b) 等
3.开启混淆
android {

    buildTypes {
        release {
        	// 开启混淆
            minifyEnabled true
            // zipAlign 优化:帮助操作系统更高效率的根据请求索引资源,快速的在内存地址中定位相关资源
            zipAlignEnabled true
            // 开启资源压缩
            shrinkResources true
            // 混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // 签名
            signingConfig signingConfigs.release
        }
    }
}
4.混淆模板
#---------------------------------- Basic---------------------------------
## 表示 proguard 对代码进行迭代优化的次数,Android一般为5
-optimizationpasses 5
## 混淆时不使用大小写类名
-dontusemixedcaseclassnames
## 不跳过library中的非public的类
-dontskipnonpubliclibraryclasses
## 不跳过library中的非public的类成员
-dontskipnonpubliclibraryclassmembers
## 关闭优化,默认开启在字节码级别执行优化
-dontoptimize
## 关闭预校验
-dontpreverify
## 忽略警告
-ignorewarnings
## 这个过滤器是谷歌推荐的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
## 保留注解
-keepattributes *Annotation*
## 避免混淆泛型
-keepattributes Signature
## 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
## 允许访问修改
-allowaccessmodification
## 打印混淆的详细信息
-verbose
#-------------------------------------------------------------------------

#----------------------------------Android Platform API-----------------------
## 保留 Activity/Application 等子类
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-keep public class * extends android.app.MultiDexApplication
-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 * extends android.view.View
## 保留 android.support包及子包,下的所有类名及其内部所有内容
-keep class android.support.** {*;}
## 保留 android.support包及子包,下的所有类名
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
## 保留 Activity 子类,下的所有带View参数的方法,如:public void onClick(View view)
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
## 保留 View 子类的所有 get、set、构造器 方法
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
#-----------------------------------------------------------------------------

#-------------------------------------Global------------------------------------
## 保留 native 方法,没有被引用时还是会被移除
-keepclasseswithmembernames class * {
    native <methods>;
}
## 保留枚举 values、valueOf 方法
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
## 保留 Parcelable 子类及内部类 Creator 的静态成员变量
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
## Serializable 子类
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
## 保留R类和R类的所有域
-keep class **.R$* {
 <fields>;
}
## 保留R文件的所有所有静态域
-keepclassmembers class **.R$* {
    public static <fields>;
}

-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}
#-----------------------------------------------------------------------------------

#----------------------------- WebView(项目中没有可以忽略) -----------------------------
#-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
#   public *;
#}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class com.nobuytech.shop.module.web.NativeMessageJS {
    public void postMessage(java.lang.String);
}

#-----------------------------Glide---------------------------------------------------
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

#(可选)避免Log打印输出
-assumenosideeffects class android.util.Log {
   public static *** v(...);
   public static *** d(...);
   public static *** i(...);
   public static *** w(...);
 }

 #Bugly
 -dontwarn com.tencent.bugly.**
 -keep public class com.tencent.bugly.**{*;}

参考:
Proguard官方文档
Android 混淆基础语法
Android 混淆详解
Android 混淆插件自动生成混淆代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值