首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android编译优化:D8和R8

如果日常做Android开发的你不关注Google针对编译优化的话做的努力的话,会对D8和R8这两个名词会比较陌生。...最近要升级工程的Gradle版本,正好涉及到开启D8和R8的问题,笔者就简单整理解释下这两者的作用和概念。 一张图概括Android编译器进化 ?...开始引入的新语言特性不能直接用在Android开发中,为了能够用上Java8新特性,Google增加了一步编译过程—脱糖(desugaring),但这一步会导致更长的编译时间,这也是为什么Google会推出D8和R8...R8 R8是用来替代Proguard的一个工具,是新一代的代码压缩工具。R8之前采用D8+Proguard的形式构建,R8则将混淆和D8工具进行整合,目的是加速构建时间和减少输出apk的大小。 ?...Gradle插件版本达到3.4.0及以上,默认会开始R8进行代码优化。

2.5K40

Kotlin Vocabulary | 枚举和 R8 编译器

我会讨论一些和 when 语句相关的潜在开销,以及 Android R8 编译器是如何优化您的应用并减少这些开销的。 编译器 首先,我们讲一讲 D8 和 R8。...不过,您也可以选择继续使用第三个编译器 —— R8。 3. R8 (可选,但推荐使用) R8 以前是用来优化和缩减应用体积的,它基本上就是 ProGuard 的一个替代方案。...在模块的 build.gradle 里添加 minifyEnabled = true ,就可以强制打开 R8 。它将在所有其他编译工作后执行,来保证您获得的是一个缩减和优化过的应用。...无论在 Java 还是 Kotlin 中,枚举的功能和消耗本质上都是一样的。有趣的地方在于引入了 R8 之后,我们能对其中的一些开销做些什么。 枚举本身不包含任何隐藏开销。.../studio/buil… Jake Wharton 的博客,详细介绍了 D8 和 R8 的工作原理,并为各种功能提供了示例,以及如何直接运行编译器、如何获得反编译的结果等 jakewharton.com

1K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    R8 编译器: 为 Kotlin 库和应用 瘦身

    R8 现在支持维持和重写 Kotlin 的元数据,从而全面支持使用 Kotlin 反射来压缩 Kotlin 开发库和应用。...R8 重写 Kotlin 元数据 为了解决上述问题,扩展后的 R8 增加了维护和重写 Kotlin 元数据的功能。它内嵌了 JetBrains 在 R8 中开发的 Kotlin 元数据开发库。...元数据信息被存储在 R8 的内部数据结构中。当 R8 完成对开发库或者应用的优化和缩小工作后,它会为所有声明被保留的 Kotlin 类合成新的正确元数据。 来一起看一下我们的示例有哪些变化。...它还告诉 R8 保留注解,尤其是 kotlin.Metadata 注解。这些规则仅仅适用于那些被显式声明保留的类。...我们可以在保留规则中使用 allowobfuscation 修饰符来允许 R8 重命名类,生成 Kotlin 元数据,这样 Kotlin 编译器和 Android Studio 都会将该类视为 Kotlin

    1K30

    关于eslint使用规则,和各种报错对应规则

    NCZ 的初衷不是重复造一个轮子,而是在实际需求得不到 JSHint 团队响应 的情况下做出的选择:以可扩展、每条规则独立、不内置编码风格为理念编写一个 lint 工具。...ESLint 主要有以下特点: 默认规则包含所有 JSLint、JSHint 中存在的规则,易迁移; 规则可配置性高:可设置「警告」、「错误」两个 error 等级,或者直接禁用; 包含代码风格检测的规则...(可以丢掉 JSCS 了); 支持插件扩展、自定义规则。...ESLint: 使用 .eslintrc 文件(支持 JSON 和 YAML 两种语法); 在 package.json 中添加 eslintConfig 配置块;直接在代码文件中定义。...以下是.eslintrc 文件示例和解释:为了方便查看,特记录如下,需要用的规则,到时候直接搜索就可以了,简直开心极了: { "env": { "browser": true,

    3.8K50

    关于eslint使用规则,和各种报错对应规则。

    NCZ 的初衷不是重复造一个轮子,而是在实际需求得不到 JSHint 团队响应 的情况下做出的选择:以可扩展、每条规则独立、不内置编码风格为理念编写一个 lint 工具。...ESLint 主要有以下特点: 默认规则包含所有 JSLint、JSHint 中存在的规则,易迁移; 规则可配置性高:可设置「警告」、「错误」两个 error 等级,或者直接禁用; 包含代码风格检测的规则...(可以丢掉 JSCS 了); 支持插件扩展、自定义规则。...eslint.org/docs/rules/quotes Strings must use singlequote 警告的意思就是字符串必须用单引号 如下图: 这时候,你就可以在.eslintrc.js配置你的规则...使用 .eslintrc 文件(支持 JSON 和 YAML 两种语法); 2. 在 package.json 中添加 eslintConfig 配置块; 直接在代码文件中定义。 3.

    8.8K70

    R8 编译器: 为 Kotlin 库和应用 瘦身

    R8 现在支持维持和重写 Kotlin 的元数据,从而全面支持使用 Kotlin 反射来压缩 Kotlin 开发库和应用。...R8 重写 Kotlin 元数据 为了解决上述问题,扩展后的 R8 增加了维护和重写 Kotlin 元数据的功能。它内嵌了 JetBrains 在 R8 中开发的 Kotlin 元数据开发库。...元数据信息被存储在 R8 的内部数据结构中。当 R8 完成对开发库或者应用的优化和缩小工作后,它会为所有声明被保留的 Kotlin 类合成新的正确元数据。 来一起看一下我们的示例有哪些变化。...它还告诉 R8 保留注解,尤其是 kotlin.Metadata 注解。这些规则仅仅适用于那些被显式声明保留的类。...我们可以在保留规则中使用 allowobfuscation 修饰符来允许 R8 重命名类,生成 Kotlin 元数据,这样 Kotlin 编译器和 Android Studio 都会将该类视为 Kotlin

    91720

    as-if-serial规则和happens-before规则的区别

    为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度,我们需要了解as-if-serial规则和happens-before规则 文章目录 as-if-serial规则 happens-before...规则 happens-before定义 具体规则 as-if-serial与happens-before的区别 as-if-serial规则 as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度...因此在最终执行的指令序列中,C不能被重排序到A和B的前面(C排到A和B的前面,程序的结果将会被改变)。但A和B之间没有数据依赖关系,编译器和处理器可以重排序A和B之间的执行顺序。...因此,JMM为程序员在上层提供了六条规则,这样我们就可以根据规则去推论跨线程的内存可见性问题,而不用再去理解底层重排序的规则。...上面的2)是JMM对编译器和处理器重排序的约束原则。 正如前面所言,JMM其实是在遵循一个基本原则:只要不改变程序的执行结果(指的是单线程程序和正确同步的多线程程序),编译器和处理器怎么优化都行。

    91820

    非规则浮点数和规则浮点数

    本文由量化、数据类型、上溢和下溢衍生,将浮点数看作是实数域的一种量化方式,分析浮点数,尤其是非规则浮点数和规则浮点数之间的差异。 0....背景、动机和目的 为了更好理解本文内容,可先行阅读《量化、数据类型、上溢和下溢》中内容。这里依旧将浮点数看作是一种量化方式,将连续的不可数的集合映射到有限的集合上去。...已有多位博主撰写过关于非规则浮点数(Denormalized Number)和规则浮点数之间的区别,这里首推卢钧轶的你应该知道的浮点数基础知识。...非规则浮点数的问题 非规则浮点数的表示能力依旧是有限的,同时由于其与规则浮点数不相同的定义方式,会导致计算速率方面的问题,即 非规则浮点数的计算速度慢于规则浮点数(一般而言)...对于溢出的讨论,可参见量化、数据类型、上溢和下溢。

    2.3K20

    kotlin 和 r8 的量子纠缠 | 类加载机制偷鸡

    元数据 大家可以参考下官方的这篇文章R8 编译器: 为 Kotlin 库和应用 "瘦身"。...元数据确定了类文件中的类和方法是由哪些 Kotlin 代码构成的。比如,Kotlin 元数据可以告诉 Kotlin 编译器类文件中的一个方法实际上是 Kotlin 扩展函数。...其中如果元数据丢失了可能就会影响到的就是一些kotlin和java的互相调用,还有就是一些kotlin-reflect的调用。...单独升级R8 接下来我们就需要偷偷的使用上面的方法,跳过AGP 7.0.3中低版本的R8,直接使用高版本AGP 7.2.1的R8就能修复这个异常了。...参考文献 Data class metadata is removed with proguard / R8 for Kotlin 1.6.0 R8 编译器: 为 Kotlin 库和应用 "瘦身"

    68020

    [eslint配置和rule规则解释

    eslint配置和rule规则解释 ESLint 是一个ECMAScript/JavaScript 语法规则和代码风格的检查工具,它的目标是保证代码的一致性和避免错误。...借助 ESLint,可将 静态代码分析 和 问题代码协助修复 集成到 编码、提交 和 打包 过程中,及早发现并协助修复代码中: 有语法错误的部分 不符合约定的样式准则的部分 不符合约定的最佳实践的部分...在项目开发中获得如下收益: 在执行代码之前发现并修复语法错误,减少调试耗时和潜在 bug 保证项目的编码风格统一,提高可维护性 督促团队成员在编码时遵守约定的最佳实践,提高代码质量 配置 配置文件中包含的相对路径和...规则 ESLint 附带有大量的规则。你可以使用注释或配置文件修改你项目中要使用哪些规则。...改变一个规则设置,你必须设置规则 ID 等于这些值之一: "off"或0 -关闭规则 "warn" 或1 - 开启规则, 使用警告 程序不会退出 "error"或2 - 开启规则, 使用错误 程序退出

    3K40

    sentinel和本地配置规则文件

    使用 Sentinel 来进行资源保护,主要分为几个步骤: 定义资源 定义规则 检验规则是否生效 先把可能需要保护的资源定义好,针对资源配置各种流量控制规则,就可以使用了。...比如 我写一个 /order/some2 接口,那么资源名就是 /order/some2 ,我可以对这个资源直接配置规则。 以本地文件方式加载 规则 sentine 支持多种方式配置 规则。...比如下面的示例配置了 flowrule.json 和 degraderule.json 两个配置文件。...Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。...监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。 规则管理和推送:统一管理推送规则。

    1.2K20

    10.19 iptables规则备份和恢复

    iptables规则的备份和恢复 保存和备份iptables规则 service iptables save //会把规则保存到/etc/sysconfig/iptables 把iptables规则备份到...my.ipt文件中 iptables-save > my.ipt 恢复刚才备份的规则 iptables-restore < my.ipt 将iptables规则保存到其他文件中 service iptables...——>这里的和视频的不同,感觉nat表应用哪里挂掉了 # Generated by iptables-save v1.4.21 on Fri Dec 1 23:01:03 2017 *nat -A PREROUTING...先将之前备份的规则清空下iptables -t nat -F 再用iptables -t nat -nvL查看到规则都被清空了 再恢复之前备份的规则,命令iptables-restore < /tmp.../ipt.txt 在使用命令iptables -t nat -nvL 会查看到清空的规则又回来了 备份的规则,只有恢复的时候会用到,若是服务器一重启,就想要加载一些规则,那最好将规则放到/etc/sysconfig

    3.3K100

    Git忽略规则和.gitignore规则不生效的解决办法

    Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果没有这个文件,则需自己手工建立此文件)。...这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.sample    # 忽略所有 .sample 结尾的文件 !...TODO build/    # 忽略 build/ 目录下的所有文件 doc/*.txt   # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt .gitignore规则不生效的解决办法...把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

    1K30

    图解 == 操作符规则和不同类型间转换规则

    图解 == 操作符规则和不同类型间转换规则 很多人包括我在内很抵触这种问题?,因为很长一段时间我一直弄不明白 == 和 === 到底是怎么个规则。...如果你也没闹明白 == 和 ===,读了这篇文章应该至少不会见到这俩操作符就觉得恶心了吧?。...查看是否是 undefined 和 null 比较 ✅ 返回 `true` ⬇️ 如果不是继续下一条规则 2....是否在比较 string 和 number ✅ 如果是,那么将 `string` 转为 `number` 并回到最初重新比较 ♻️ ⬇️ 如果不是继续下一条规则 3....是几个例子: 20190311000041.png 附上一张不同类型间转换规则: 20190311001627.png 就写到这里,基本上 == 和类型转换就是这个样子❕ EOF 参考: http://

    70020

    Go语言的编程规则和秘籍

    Go语言有一些严格的编码规则,这些规则旨在帮助你避免常见的错误和漏洞,同时也使你的代码更易于被Go社区理解。本文将介绍其中两条重要的规则。...包的使用规则 Go对包的使用有非常严格的规定。你不能随意引入可能需要的包而在代码中不使用它们。即使在使用go run命令时,Go编译器仍然会创建一个可执行文件。...} 虽然代码看起来没有问题,但如果你尝试执行它,你会发现编译器会给出如下的语法错误信息,代码无法编译和运行: $ go run curlyBraceExample.go 命令行参数 ....为避免此问题,Go要求大括号 { 必须和函数声明在同一行。...} 现在,这段代码将正常编译和运行,输出如下: $ go run curlyBraceExample.go Go 对大括号的使用有严格的要求!

    5710
    领券