持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
前言
-
如果您使用 gradle 3.4.0 或更高版本构建项目,则据说该插件不使用 ProGuard 来优化您的编译时代码,而是使用 R8 编译器来优化您的编译时代码。
-
使用 Android Studio 创建新项目时,默认情况下不会启用应用瘦身、混淆和代码优化,因为会增加构建时间以及开发人员配置错误导致的潜在错误。
因此,最好在构建应用程序的最终版本时启用这些编译时操作。
什么是R8?
- R8 是一个本机编译器,可将项目的 Java 字节码转换为在 Android 平台上运行的 DEX 格式。
- R8 使用 ProGuard 规则文件。
R8 的作用
-
代码收缩(Tree shaking)
- 删除未使用的代码。
- R8 确定的删除代码的过程在运行时不需要。
- 应用程序和库依赖项中未使用的类、字段、方法和属性
-
减少资源
- 删除未使用的资源。
- 打包应用未使用的资源,包括应用库依赖项中未使用的资源
- 资源收缩仅在与代码收缩结合使用时才有效
-
混淆
- 缩短类和成员名称。
- 混淆的目的是通过缩短应用程序的类、方法和字段的名称来减小应用程序的大小。
- 总之,混淆减少了 DEX 文件的大小。
-
优化
- 代码检查和重写。
- 进一步减小 DEX 文件大小。
keep
这意味着开发人员适当地定制了要保留的代码。 换句话说,keep 规则指定了 R8 在折叠应用程序时不得删除的类,并且 R8 认为该类可用作应用程序的入口点。
- 将keep行添加到ProGuard 规则文件
- 在要保留的代码中 添加Keep注解
- 整个类保持不变(方法、字段、类名保持不变)
- 这些保留规则强制 R8 保留原始命名以及将代码保留在应用程序的最终 DEX 中。