最全面的Android混淆

bat365在线官网平台 2025-10-29 17:37:56 admin 阅读 4588

1、日常开发Debug包时不用混淆,正式发布Release包前开启代码混淆;

2、混淆好处① → 类、方法、变量名变成短且无意义的名字,提高反编译后代码的阅读成本;

3、混淆好处② → 删除无用的类、方法与属性,缩减了APK包的大小;

4、混淆好处③ → 对字节码进行优化,移除无用指令,应用运行更快;

5、怎么混淆 → 主项目的 build.gradle 设置 minifyEnabled true,proguard-rules.pro 加入混淆规则;

6、混淆规则哪里来 → 网上搜索通用混淆模板复制粘贴,项目依赖到的第三方库官方文档复制粘贴;

app层级的build.gradle加下release的签名和编译配置:

signingConfigs {

release {

storeFile file('../test.jks')

storePassword '123456'

keyAlias 'test'

keyPassword '123456'

}

}

buildTypes {

release {

// 启用代码压缩、优化及混淆

minifyEnabled true

// 启用资源压缩,需配合 minifyEnabled=true 使用

shrinkResources true

// 指定混淆保留规则

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

// 包签名

signingConfig signingConfigs.release

}

}

1. 混淆设置参数

-optimizationpasses 5 # 代码混淆的压缩比例,值介于0-7,默认5

-verbose # 混淆时记录日志

-dontoptimize # 不优化输入的类文件

-dontshrink # 关闭压缩

-dontpreverify # 关闭预校验(作用于Java平台,Android不需要,去掉可加快混淆)

-dontoptimize # 关闭代码优化

-dontobfuscate # 关闭混淆

-ignorewarnings # 忽略警告

-dontwarn com.squareup.okhttp.** # 指定类不输出警告信息

-dontusemixedcaseclassnames # 混淆后类型都为小写

-dontskipnonpubliclibraryclasses # 不跳过非公共的库的类

-printmapping mapping.txt # 生成原类名与混淆后类名的映射文件mapping.txt

-useuniqueclassmembernames # 把混淆类中的方法名也混淆

-allowaccessmodification # 优化时允许访问并修改有修饰符的类及类的成员

-renamesourcefileattribute SourceFile # 将源码中有意义的类名转换成SourceFile,用于混淆具体崩溃代码

-keepattributes SourceFile,LineNumberTable # 保留行号

-keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod # 避免混淆注解、内部类、泛型、匿名类

-optimizations !code/simplification/cast,!field/ ,!class/merging/ # 指定混淆时采用的算法

复制代码

2. 保持不被混淆的设置

语法组成:

[保持命令] [类] {

[成员]

}

复制代码

保持命令:

-keep # 防止类和类成员被移除或被混淆;

-keepnames # 防止类和类成员被混淆;

-keepclassmembers # 防止类成员被移除或被混淆;

-keepclassmembernames # 防止类成员被混淆;

-keepclasseswithmembers # 防止拥有该成员的类和类成员被移除或被混淆;

-keepclasseswithmembernames # 防止拥有该成员的类和类成员被混淆;

复制代码

类:

具体的类访问修饰符 → public、private、protected通配符(*) → 匹配任意长度字符,但不包含包名分隔符(.)通配符(**) → 匹配任意长度字符,且包含包名分隔符(.)extends → 匹配实现了某个父类的子类implements → 匹配实现了某接口的类$ → 内部类成员:

匹配所有构造器 → 匹配所有域 → 匹配所有方法 → 访问修饰符 → public、private、protected除了 * 和 ** 通配符外,还支持 *** 通配符,匹配任意参数类型... → 匹配任意长度的任意类型参数,如void test(...)可以匹配不同参数个数的test方法常用自定义混淆规则范例:

# 不混淆某个类的类名,及类中的内容

-keep class cn.coderpig.myapp.example.Test { *; }

# 不混淆指定包名下的类名,不包括子包下的类名

-keep class cn.coderpig.myapp*

# 不混淆指定包名下的类名,及类里的内容

-keep class cn.coderpig.myapp* {*;}

# 不混淆指定包名下的类名,包括子包下的类名

-keep class cn.coderpig.myapp**

# 不混淆某个类的子类

-keep public class * extends cn.coderpig.myapp.base.BaseFragment

# 不混淆实现了某个接口的类

-keep class * implements cn.coderpig.myapp.dao.DaoImp

# 不混淆类名中包含了"entity"的类,及类中内容

-keep class **.*entity*.** {*;}

# 不混淆内部类中的所有public内容

-keep class cn.coderpig.myapp.widget.CustomView$OnClickInterface {

public *;

}

# 不混淆指定类的所有方法

-keep cn.coderpig.myapp.example.Test {

public ;

}

# 不混淆指定类的所有字段

-keep cn.coderpig.myapp.example.Test {

public ;

}

# 不混淆指定类的所有构造方法

-keep cn.coderpig.myapp.example.Test {

public ;

}

# 不混淆指定参数作为形参的方法

-keep cn.coderpig.myapp.example.Test {

public (java.lang.String);

}

# 不混淆类的特定方法

-keep cn.coderpig.myapp.example.Test {

public test(java.lang.String);

}

# 不混淆native方法

-keepclasseswithmembernames class * {

native ;

}

# 不混淆枚举类

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

#不混淆资源类

-keepclassmembers class **.R$* {

public static ;

}

# 不混淆自定义控件

-keep public class * entends android.view.View {

*** get*();

void set*(***);

public ;

}

# 不混淆实现了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();

}

# 不混淆实现了parcelable接口的类成员

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

# 注意事项:

#

# ① jni方法不可混淆,方法名需与native方法保持一致;

# ② 反射用到的类不混淆,否则反射可能出问题;

# ③ 四大组件、Application子类、Framework层下的类、自定义的View默认不会被混淆,无需另外配置;

# ④ WebView的JS调用接口方法不可混淆;

# ⑤ 注解相关的类不混淆;

# ⑥ GSON、Fastjson等解析的Bean数据类不可混淆;

# ⑦ 枚举enum类中的values和valuesof这两个方法不可混淆(反射调用);

# ⑧ 继承Parceable和Serializable等可序列化的类不可混淆;

# ⑨ 第三方库或SDK,请参考第三方提供的混淆规则,没提供的话,建议第三方包全部不混淆;

来源: https://juejin.cn/post/6966526844552085512

相关文章

梦幻西游孩子悟性有什么用

“四喜临门”是哪四喜?原来古人最在意的是这个!

谷歌验证要多久?实时解答!

揭秘:西班牙2026世界杯主场球衣曝光,传统红衣蓝裤设计亮相!