项目开发混淆从初识到理解

本文详细介绍Android项目中使用R8进行代码混淆的方法与流程,包括混淆的目的、编译器选择、功能介绍、编译流程及规则文件配置等关键信息。

项目开发流程系列

  1. 项目开发混淆从初识到理解
  2. 项目开发代码分支管理

博客创建时间:2022.08.28
博客更新时间:2023.03.29

以Android studio build=7.0.0,SDKVersion 31来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已。


前言

Java 是一种跨平台、解释型语言,Java 源代码编译成的class文件中有大量包含语义的变量名、方法名的信息,很容易被反编译为Java 源代码。

为了项目的软件安全,提高对手的逆向破解难度,应该对项目进行合理的代码混淆,尽量少的keep类,保持代码正常运行的情况下编译生成的代码是无序随机的。

混淆编译器

Android的代码混淆编译器有两种

  • ProGuard:一个通用的 Java 字节码优化工具
  • R8:ProGuard 的继承者,专为 Android 设计,编译性能和编译产物更优秀

在Android Gradle 4.0.0以后基本使用的是R8混淆编译器。

// 显式启用 R8
android.enableR8 = true
// 只对 Android Library module 停用 R8 编译器
android.enableR8.libraries = false
// 对所有 module 停用 R8 编译器
android.enableR8 = false

其他关键词:D8 & DEX


混淆功能

ProGuard 与 R8 都提供了混淆编辑的四大功能:

  • 压缩(shrinker):也称摇树优化,tree shaking,从「应用及依赖项」 中移除「未使用」 的类、方法和字段,有助于规避 64 方法数的瓶颈。

    zipAlignEnabled true
    // 移除无用的resource
    shrinkResources true
    
  • 优化(optimizer):通过代码 「分析」 移除更多未使用的代码,甚至重写代码

  • 混淆(obfuscator):使用无意义的简短名称 「重命名」 类/方法/字段,增加逆向难度

  • 预校验(preverifier):对于面向 Java 6 或者 Java 7 JVM 的 class 文件,编译时可以把 「预校验信息」 添加到类文件中(StackMap 和 StackMapTable属性),从而加快类加载效率。预校验对于 Java 7 JVM 来说是必须的,但是对于 Android 平台无效。


编译流程

1. ProGuard编译流程

  • Javac编译器将java编译成.class文件
  • ProGuard 对 .class 文件执行代码压缩、优化与混淆
  • D8 编译器执行脱糖,并将 .class 文件转换为 .dex文件
    在这里插入图片描述
    2. R8编译流程
  • R8 对 .class 文件执行代码压缩、优化与混淆
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值