深耕实体创业,拒绝短期投机;聚焦可落地商业模式,与实干者共建长期事业。
商务合作关于我们联系我们投稿合作
创场创业创场创业让创业有方法、起步有赛道
创场创业
创场创业让创业有方法、起步有赛道
首页创业干货创业头条创业经验工商财税运营获客项目赛道轻资产线上项目小成本实体生意副业转型创业避雷项目盘点工具资料AI创业

Android 代码混淆教程

2026-08-12 综合 阅读量 2468

解读:

本文提供Android代码混淆的入门教程,解释混淆的概念、作用,并介绍如何使用Android Studio默认的R8混淆器进行配置,包括基础规则、常见保留规则和验证结果的方法。

Android代码混淆是发布应用前的重要步骤,它能让你的App更难以被逆向工程,同时还能减小包体积、优化性能。本教程将带你从零开始认识并配置Android代码混淆。

什么是代码混淆?

代码混淆是一种程序变换技术,它将原始的类名、方法名、字段名等标识符替换为无意义的短名称(如a、b、c),并删除无用的代码或资源,以增加代码被阅读和理解的难度。在Android开发中,混淆通常与资源压缩结合使用,共同达到保护代码和瘦身的目的。

Android混淆工具:R8与ProGuard

Android官方推荐使用R8作为混淆和优化工具,R8集成了ProGuard的核心功能,且在性能上更优。从Android Gradle Plugin 3.4.0开始,R8成为默认的混淆器。ProGuard是传统的第三方工具,现在仍可通过配置切换使用,但建议新项目直接使用R8。

启用混淆

在项目的build.gradle文件(Module: app)中,通过minifyEnabled来控制是否启用混淆,还需要设置shrinkResources来压缩资源。示例:

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

其中getDefaultProguardFile引入Android默认的混淆规则,proguard-rules.pro是项目自定义规则文件。

理解混淆规则

混淆规则由一系列关键字和通配符组成,用于指定哪些类、成员需要保留,哪些可以混淆。以下是最常用的规则:

  • -keep:保留类和类成员不被混淆,也不移除。例如:-keep class com.example.model.User
  • -keepclassmembers:保留指定类的成员(方法、字段),但类名可以混淆。
  • -keepattributes:保留某些JVM属性,如注解、异常等。例如:-keepattributes *Annotation*
  • -dontwarn:忽略警告,不中断构建。
  • -optimizationpasses:设置优化次数(R8已忽略)。

通配符规则:

  • *:匹配任意类名,但不包括包名分隔符。
  • **:匹配任意类名,包括包名分隔符。
  • ***:匹配任意类型(类或基本类型)。
  • $:内部类。

常见保留场景

  1. 模型类(POJO):如果保留以Model为例,可以写-keep class com.example.model.**
  2. 第三方库:如果库没有提供自己的混淆规则,需要在项目中添加。例如,对于Gson:-keep class com.google.gson.**
  3. 注解使用:如果使用自定义注解,需保留注解类及处理逻辑。
  4. 通过反射调用的类:例如,使用Gson解析JSON时,若类被混淆,则无法反射创建实例,需要保留。
  5. Activity、Service等组件:这些类在AndroidManifest中注册,不能被混淆,通常使用-keep public class * extends android.app.Activity等。

实战:编写proguard-rules.pro

下面是一个通用的proguard-rules.pro示例:

# 保持Android组件不混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver

# 保持实体类不混淆
-keep class com.yourpackage.model.** { *; }

# 保持注解
-keepattributes *Annotation*

# 保持JS接口(如果与WebView交互)
-keepclassmembers class * {
    @android.webkit.JavascriptInterface ;
}

# 忽略缺失库的警告
-dontwarn okhttp3.**
-dontwarn retrofit2.**

注意:-keep class ... { *; }表示保留该包下所有类的所有成员,不进行任何优化和混淆,会增大包体,应尽量缩小范围。

验证混淆结果

生成Release包后,可以通过以下方式验证混淆是否生效:

  • 使用jadxdex2jar反编译APK,检查类名是否变成了a、b、c。
  • 查看build/outputs/mapping/release/mapping.txt文件,它记录了原始类名与混淆后类名的映射,可用于错误排查。
  • 运行应用,确保核心功能正常,特别是涉及反射、JSON解析、WebView等环节。

常见问题与坑

错误:类被混淆后,使用Gson解析JSON报错。解决方法:保留模型类,或使用@SerializedName并保留注解。

如果第三方库不兼容R8,可以临时在gradle.properties中关闭R8(android.enableR8=false),但不建议长期使用。

注意:混淆不是绝对安全,只能增加逆向难度,不能完全防止破解。

结语

通过本教程,你应该能初步掌握Android代码混淆的核心配置。实际项目中,建议根据依赖和具体业务完善规则,并定期通过反编译工具检查混淆效果,确保发布版本的安全和稳定。

仅供创业知识参考,如涉及法律、财税、政策或具体经营决策,请结合实际情况进一步核验。