Proguard 和 R8 有什么区别?

2023-12-27

新版本的 Android Studio (3.4) 刚刚发布,默认支持 R8 而不是 Proguard。有人可以解释一下两者之间的主要区别以及使用 R8 的任何明显好处吗?


Android 构建过程的历史不断变化,开发人员不断尝试使其在构建时间和生成的 .dex 文件大小方面更加高效。因此,纵观历史,从 .java 文件生成 .dex 文件的过程有很多变化。

在 R8 或 D8 之前,Android 构建过程涉及以下四个步骤:

源代码(.java) ---javac---> Java 字节码(.class) ---Proguard---> 优化的Java字节码(.class) ---德克斯---> Dalvik 优化字节码(.dex)

然后,Android 开发人员决定将其间的所有步骤合并为名为 Jack&Jill 的 1 个步骤以进行优化。然而,它于 2015 年引入,并于 2017 年被放弃,因为它不够灵活,无法与所有不断增长的开发工具配合使用。

然后,引入了 D8,它通过优化的 Dex 转换恢复到原始的 4 步构建过程。该实现产生了比 dx 更好质量的字节码,具有更少的指令和更好的寄存器分配。

现在到 R8,它有一个类似的目标,以 Jack&Jill 作为起点,将其中两个构建步骤合并为一个。 Proguard 和 Dex 步骤。因此,R8 不是先 Proguard 处理 .class 文件,再次返回 .class 文件,然后 Dex/D8 处理器接收 .class 并返回 .dex 文件,而是合并这两个步骤,接收 .class 文件,返回 .dex 文件。这个工具仍在变得更好,试图进一步优化构建过程。因此,现在将您的项目迁移到 R8 是明智之举,因为它是一个仍在不断发展的工具,很快将成为默认构建工具。 (可以看出Android Studio(3.4)升级时默认启用)

此外,Google 问题跟踪器中的开发人员很快就返回了有关 R8 的问题报告,因为他们渴望获得反馈并希望完善该工具。

据报道,使用 R8 会生成更小的 .dex 文件,并且可以更有效地缩小删除未使用的类。从某种程度上来说,这是一个优点和缺点。显然,这是一个优点,因为较小的尺寸总是更好(在编程中!),它是一个缺点,因为你必须复杂地检查你的代码,并检测你的入口点并相应地在你的 proguard 文件中重新实现 keep 规则,如 R8 所介绍的比 Proguard 更积极的缩小。

有关更多信息,您可以查看这篇文章,其中包含关于 R8 与 Proguard 的非常详细的解释:https://www.guardsquare.com/en/blog/proguard-and-r8 https://www.guardsquare.com/en/blog/proguard-and-r8

另外,Google I/O 2018 的官方演讲:

希望这可以帮助,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Proguard 和 R8 有什么区别? 的相关文章

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • Android第一次动画不流畅

    我正在尝试一个动画将 imageView 从屏幕底部滑动到屏幕中心 但是当我第一次执行此动画时 它不平滑 但当第二次执行动画时 它是正常且平滑的 我几乎尝试了所有方法 但无法解决我的问题 这是我的动画文件
  • 为什么将函数参数声明为最终的?

    我目前正在阅读 Sams 出版的 24 小时自学 Android 应用程序开发 一书 我对 Java Android 或其他方面还比较陌生 我对 ActionScript 3 有非常扎实的背景 它与 Java 有足够的相似之处 因此该语言本
  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 在 Google 地图上绘制线条/路径

    我很长一段时间都在忙于寻找如何在 HelloMapView 中的地图上的两个 GPS 点之间画一条线 但没有运气 谁能告诉我该怎么做 假设我使用扩展 MapView 的 HelloMapView 我需要使用叠加层吗 如果是这样 我是否必须重

随机推荐