项目开发流程系列
博客创建时间: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 文件执行代码压缩、优化与混淆

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

被折叠的 条评论
为什么被折叠?



