有了 R8 编译器,您可以通过压缩、混淆和优化,更全面的缩小应用体积。 本文我们将对 R8 的特性进行一个简要的介绍,并介绍可预期的代码缩减程度以及如何在 R8 中启用这些功能。 这些入口点由 R8 keep 规则定义。例如,在此 Java 代码示例中,R8 会在 main 方法处开始运行。 在该示例中,R8 从 main 方法跟踪到 greeting 方法。 跟踪完成后,R8 使用摇树优化来删除未使用的代码。在此示例中,摇树删除了未使用的方法,因为 R8 的跟踪过程检测到从任何已知的入口都无法到达该方法。 这是因为 R8 仅将字段名视为写入 (在 Person 构造函数中),但从未读取,因此 R8 会将其移除。最后 Person 丢失了字段值,造成空的 JSON 对象。 请参考 R8 开发者文档 了解更多!
如果日常做Android开发的你不关注Google针对编译优化的话做的努力的话,会对D8和R8这两个名词会比较陌生。 最近要升级工程的Gradle版本,正好涉及到开启D8和R8的问题,笔者就简单整理解释下这两者的作用和概念。 一张图概括Android编译器进化 ? R8 R8是用来替代Proguard的一个工具,是新一代的代码压缩工具。R8之前采用D8+Proguard的形式构建,R8则将混淆和D8工具进行整合,目的是加速构建时间和减少输出apk的大小。 ? Gradle插件版本达到3.4.0及以上,默认会开始R8进行代码优化。 如果你不想开启R8,可以在gradle.properties里添加如下配置: android.enableR8=false 开启R8的好处 代码缩减: 规避64引用限制 资源缩减: 移除不使用的资源 混淆代码
,R8 同时也支持缩减 Android 库大小。 本文接下来的内容为大家介绍了 Kotlin 元数据的相关信息以及 R8 中对于重写 Kotlin 元数据的支持。 R8 重写 Kotlin 元数据 为了解决上述问题,扩展后的 R8 增加了维护和重写 Kotlin 元数据的功能。它内嵌了 JetBrains 在 R8 中开发的 Kotlin 元数据开发库。 元数据信息被存储在 R8 的内部数据结构中。当 R8 完成对开发库或者应用的优化和缩小工作后,它会为所有声明被保留的 Kotlin 类合成新的正确元数据。 来一起看一下我们的示例有哪些变化。 现在 R8 可以在所有保留类中正确重写 Kotlin 元数据,我们可以通过使用下面的缩减器配置启用重写。
我会讨论一些和 when 语句相关的潜在开销,以及 Android R8 编译器是如何优化您的应用并减少这些开销的。 编译器 首先,我们讲一讲 D8 和 R8。 不过,您也可以选择继续使用第三个编译器 —— R8。 3. R8 (可选,但推荐使用) R8 以前是用来优化和缩减应用体积的,它基本上就是 ProGuard 的一个替代方案。 R8 不是默认开启的,如果您希望使用它 (例如您想要这里讨论到的那些优化时),就需要启用它。 幸运的是,我们可以做一些事情来减少开销: 这就是 R8 发挥作用的时候了。 使用 R8 来解决问题 R8 是一个有趣的优化器,它能 "看" 到与应用相关的所有内容。 探索 R8 与 Kotlin,然后用 Kotlin 写出更好的应用吧。
R8作为一个新工具,鲁棒性不如proguard,在面对手Q这个庞然大物时,出现了一些问题,本文主要分享一下R8在手Q应用遇到的问题,供后面有需要的同学参考。 一 、 背景Android Gradle 插件 3.4.0 或更高版本构建APP时,系统已经默认使用R8作为混淆和Dex的工具,但和公司内部大型APP交流后,目前使用R8的团队还比较少。 但我们经过对比测试,打开R8后构建耗时有6分钟左右的优化,因此开启了R8在手Q应用的故事。 二、R8整体流程目前在手Q中使用的R8版本为2.1.75 ,官网的r8版本已经到了3.2.35, 因为AGP版本的限制(目前手Q版本为4.1.3),无法单独升级R8,否则会有错误,因此本文对R8的分析都是基于 R8本身性能还有很多路要走,希望有更多团队和同学能加入到R8的应用和建设上来,欢迎大家交流。
,R8 同时也支持缩减 Android 库大小。 本文接下来的内容为大家介绍了 Kotlin 元数据的相关信息以及 R8 中对于重写 Kotlin 元数据的支持。 R8 重写 Kotlin 元数据 为了解决上述问题,扩展后的 R8 增加了维护和重写 Kotlin 元数据的功能。它内嵌了 JetBrains 在 R8 中开发的 Kotlin 元数据开发库。 元数据信息被存储在 R8 的内部数据结构中。当 R8 完成对开发库或者应用的优化和缩小工作后,它会为所有声明被保留的 Kotlin 类合成新的正确元数据。 来一起看一下我们的示例有哪些变化。 现在 R8 可以在所有保留类中正确重写 Kotlin 元数据,我们可以通过使用下面的缩减器配置启用重写。
orion是一个做IO测试的小巧工具,可以测试随机读写,模拟混合负载等。 在oracle 11g已经自带包含了这一工具,无须额外的安装了,为IO方面的测试带来了不少的便利。 当然如此简单的小工具我在使用时还是碰到了些小问题。简单总结一下。 首先是使用orion,直接提示依赖链接库的问题 [oracle@db117 bin]$ orion orion: error while loading shared libraries: libclntsh.so.11.1: cannot open shared obj
元数据 大家可以参考下官方的这篇文章R8 编译器: 为 Kotlin 库和应用 "瘦身"。 但是我们在release混淆包中,这部分kotlin 1.7.10生成出来的元数据竟然被R8代码优化掉了,导致了release包的部分功能异常。 单独升级R8 接下来我们就需要偷偷的使用上面的方法,跳过AGP 7.0.3中低版本的R8,直接使用高版本AGP 7.2.1的R8就能修复这个异常了。 这次我们只需要把这个R8的版本放到settings.gralde中就可以解决这个问题了。 参考文献 Data class metadata is removed with proguard / R8 for Kotlin 1.6.0 R8 编译器: 为 Kotlin 库和应用 "瘦身"
Oralce中的命令非常丰富,oerr命令是一个不错的辅助工具,很多看起来没有眉目的错误代码,可以让DBA很快定位问题的缘由,我们根本不需要去记有哪些ORA错误,除非那些错误已经完全和你的工作分不开。 绝大多数的命令都是二进制的形式,比如sqlplus我们可一窥其中的奥妙,oerr是一个shell脚本,而且实现原理也不难,我们来剖析一下,看看这个工具的设计思想。 首先这个工具位于$ORACLE_HOME/bin下,直接看还看不出是个shell脚本。 [oracle@db117 ~]$ ll $ORACLE_
全志R8平台 fantasy调频策略配置方法 【适用范围】 适用于R8 Tina1.0 平台 【问题现象】 目前R8平台的如果选择fantasy 的调频策略无法编译通过。
线上有一台服务器上,里面有一个mysql数据库服务,其实库也很小,就几个G,一直以来是保留了多天的备份集,但是因为业务的关系,这个库其实只有一些 基本的数据查询,但奇怪的是没有从库,一直以来是每天都会备份,保留了近一周的备份集,这种情况也倒相安无事。不过不巧的是这台服务器上还部署有 Oracle数据库,空间要大很多,随着业务的增长,这个数据量就上去了,结果空间的使用是越来越紧俏。保留一周的备份集,空间是越来越紧张。所以在一台 Oracle的备库机器上使用gtid创建了一个mysql从库。这种情况基本可以满足
最近测试了使用datapump来迁移百G数据的场景,因为实际需要,需要把Unix下10gR2的库迁移到Linux下11gR2,所以这个过程相对来说牵制也较多。考虑了多种方案,最后权衡后决定使用datapump来迁移。 其实整个迁移的过程还算顺利,完整模拟了整个生产环境的迁移情况,datapump的全库导入还是比较方便省心,只要导出得当,导入基本不需要太多的检查 选项,导入的过程中的可操作选项也非常有限。如果数据库里存在大量的结构信息,而且关系错综复杂,使用datapump还是比较通用快捷。 datapump
自从入了数据库这条路,什么都喜欢用这种技术思路来思考问题。不知不觉融入了生活之中,有时候我却全然不知。 记得有一次在泰国出差,有一个男同事生病了,但是生病了还得吃点东西,然后我就一顿软硬劝说,带着他到附近的中国馆子吃点东西,因为他嗓子疼,头疼。所以 到了饭馆之后他点了粥和馒头,刚吃了几口就开始说往下咽的时候嗓子里真疼。当然我马上给了他一个建议,先不要咽,等吃几口,然后一次性再咽,这叫批量提 交。 当然看起来他是听进去了,不过更可喜的是他回去睡了一大觉就身体舒服多了,没几天就好了。 我们做技术的
最近看了一个问题,看问题的表现着实比较奇怪,困扰了我好一会儿。 问题的背景是帮助开发的同学解决一个数据库问题,最后问题解决之后,我想做一个操作系统级的检查,帮他们看看还有什么需要注意的地方。然后在命令行中国登陆到了这台数据库服务器,切换到oracle用户之后,查看到数据库实例为cytj,然后准备做一番检查。 #ps -ef|grep smon root 3657 32596 0 17:37 pts/2 00:00:00 grep smon oracle 5433 1 0
最近测试了一下PCIE-SSD在数据库环境的迁移 和加压情况,IOPS无可置疑,比起机械硬盘确实是高了很多个量级,在数据环境中的IO方面确实有很稳定的提升,目前使用闪存产品系列,看官网最新的发布 已经
今天开发的同事找到我,让我帮他们补一部分数据,因为有一个表的数据已经快一个月没有增量数据了,这个需求听起来有些奇怪是不? 问题的背景是在统计库中存在一个表,供部分应用做统计分析,每天会根据时间生成一条记录,这条记录汇总的数据会作为统计分析所用。但是每天的这一条增量数据的源头来自于另外两个在线交易库。两个库中的数据会做一些关联,大体的实现思路就是下面的形式。 现在OLAP的库中的表里的部分增量数据没有按照时间增加,所以对前端应用的统计造成了一定的影响。 当然对于DBA而言,这部分逻辑还是未知的,可能跨业务部
开发同学前几天给我提了一个数据查询的需求,大体是查询某个表的数据,然后把查询结果以csv的形式提供给他们,一般来说这种定制查询,开发的同学都会提供好语句,DBA同学只需要简单执行即可。 每次看到语句,我都要简单评估一下,今天的语句看起来非常简单,需要在一个历史库中进行数据查取,从开发同学提供的语句来看,这个查询看起来真不简单。提 供的数据都是近5年内的历史数据,所以我简单看了下,这个表有10亿的记录,而符合条件的数据就有1亿多条。从数据量来看,这个我是真没法提供了,数据结 果集就肯定几十上百G了,发
pt工具是非常实用有效的一个工具集,对于诊断常规问题还是非常有效的,相比于Oracle的工具,MySQL中没有那么多复杂的数据字典,在实现方式上相对更加轻巧,主要都是针对日志的挖掘。在庞大复杂的日志中能够找出一些非常有效的信息,确实难能可贵。 image.png 在官网上查看Percona的系列产品,可以看到Percona Toolkit的一个Logo好像是条鹿犬。 image.png 如果查看用户手册,可以看到里面有非常多的命令,如果没有分门别类还是没有任何的方向。 在此找到同事之前的分享,工具的分类如下
最近开发提了几个需求,需要把几个线上的分布式的表整合到统计系统中方便统计,看来分久必合,合久必分,当时的分开考虑,肯定没有想到以后会整合起来,这 可对我们是一些额外的工作,这个时候增量数据的问题就摆在
今天开发的同事找到我说,他们发现一个应用今天应该会同步过来一部分数据,但是今天却没有,所以想让我帮忙看看到底是怎么回事。 对于这类需求也算是轻门熟路,不光维护管理数据,补数据也在行。看来今天又不可避免要修复数据了,不过还是得明白原因是什么。 首先查看了近几天的数据同步情况,时间范围是5月1日~5月6日,但是查看却唯独缺少了5月5日的数据,因为是计算前一天的数据变化情况,所以5月6日应该会同步5月5日的数据变化。 TRUNC(UPDATE_DATE) COUNT(*) ------------------