可能到这里你还没有感觉,但如果看了这张图呢?

是否能切实的感受到Gradle所提供的强大能力了,因为对我们我们开发者而言其实只干了一件运行按钮的触发操作,但是背后Gradle给我们所带来的收益是无穷无尽的。

在这里我们知道他很有用了,但是为什么还要提一下他的兄弟Maven呢?主要是为了让你转化手头的构建工具,根据官网的构建速度对比。

具体请参考文档Gradle vs Maven:性能比较

因为公司里一般的项目都是组件化的,而且接入方会很多很多很多,所以我们拿一个大型构建的时间对比可能更服人心。对于干净的构建,Gradle的速度提高了2-3倍,对于增量更改,Gradle的速度提高了约7倍,而对Gradle任务输出进行缓存时,Gradle的速度提高了3倍。 如此之高的构建效率提升对我们开发者而言肯定也是有利有“弊”的,比如说我作为一个抖音开发者,原本抖音的构建工具使用的是Maven他的增量编译构建速度原本20分钟完成一次,那说明我现在有20分钟的摸鱼时间了,但是如果我一天要编译10次20次呢?总体这样折算下来一天的工作效率可以说骨折式缩短,可能因为编译效率过低,导致你无法按时完成需求年终奖一无所有。但是用了Gradle以后,效率翻倍,每次增量编译只用10分钟就完成了,虽然摸鱼时间短了,但是效率上来了,老板说你表现优异又给你加了3个月的奖金。

回归这个主题的内容,Gradle是怎么为我们提供能力的?

Proguard + Dex

Dex工具就是将Class文件转换成二进制这里就不做介绍

在关于proguard的内容上,对于8成的开发者阮大概最熟悉的内容就是混淆了。

Q1:混淆带给我们的好处有什么?

A1: 为什么我们要混淆?很简单,不想让第三者轻易获得我们开发的app源码,那他的第一个优势就出来了,让代码失去直观的语义,让一部分想窃取公司机密的外部业余黑客望而却步。其实这个工具还给我们带来了第二个优势,就是代码内容缩短,在整体的包体积缩小起到了至关重要的作用。

Proguard只有这么点作用吗??显然并不是这样的。

从图中可以得知,Proguard针对的部分是抛去系统库的,所以在混淆的图中能够发现android.support的库还是清晰的显示着,个人考虑是因为如果加上系统库进行混淆的话,可能引来奇怪的Bug

我们将整体分为4个部分:

  1. shrink —— 代码删减
  2. optimize —— 指令优化
  3. obfuscate —— 代码混淆
  4. preverify —— 代码校验

Shrink

作为代码删减肯定是有删减的入口的。ProGuard会根据Configuration Roots开始标记, 同时根据Roots为入口开始发散。标记完成以后, 删除未被标记的类或成员。最终得到的是精简的ClassPool

Q1:那这些Roots的来源是什么呢?

A1:Roots包括类,方法字段,方法指令, 来源主要有2种。

  1. 通过keep同时allowshrinking不为true。计算class_specification中类限定和限定成员
  2. 通过keepclasseswithmembers关键字allowshrinking不为true。如果类限定和成员限定都存在。计算 class_specification中类限定和成员限定。

Q2:删除的是那些代码?

A2: 其实删除的内容就是在全局范围内并没有调用点并且没有用keep去保留的方法或者类。

Optimize

Optimize会在该阶段通过对 代码指令、 堆栈, 局部变量以及数据流分析。来模拟程序运行中尽可能出现的情况来优化和简化代码. 为了数据流分析的需要Optimize会多次遍历所有字节码ProGuard会开启多线程来加快速度。

具体的优化策略详见于ProGuard 初探的 Optimize 部分

Obfuscate

代码混淆想来是我们最为常见的部分了。

混淆部分一共会带来两部分的收益:

  1. 代码失去直观的语义(因为我们的方法或者函数命名时都会有一定的规则)
  2. 代码内容缩短,缩小整体的包体积

Preverify

对代码进行预校验。 主要校验StackMap / StackMapTable属性。android虚拟机字节码校验不基于StackMap /StackMapTable

具体内容详见于 ProGuard 初探

D8

Dex的替代产品

这一解析器的引入非常重要的目的是为了适应Java 8上新概念LambdaJava底层是通过invokedynamic指令来实现,由于Dalvik/ART并没有支持invokedynamic指令或者对应的替代功能。简单的来说,就是Androiddex编译器不支持invokedynamic指令,导致Android不能直接支持Java 8

所以Android做的事情就是间接支持,将Lambda变化为可以解析的语法然后执行。

将代码编译以后,我们能够发现生成的代码中会同时生成以Lambda来标识的类,这就是说明了他的解析方案,而代码的实现方式就是我们在Java 7中常见的方案了。

不过你觉得新产品的提升会止步于此吗?

「万物生长」一个APK从诞生到活跃在Android手机上,android驱动开发权威指南pdf相关推荐

  1. 用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件。但是有的同学是做实现层的开发,不直接做View层

    用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件.但是有的同学是做实现层的开发,不直接做View层的 ...

  2. 北邮王啸:挖掘图神经网络中的「万物真理」 | 青源专栏

    导读:为了启发青年学者研究思路,激发科研灵感,智源社区推出青年学者访谈栏目.北京邮电大学副教授王啸是国内图学习领域的佼佼者.回顾他的科研历程,从探寻网络研究的本质,到在物理学家的论文中寻找灵感,他对图 ...

  3. 神操作 之 「玲珑宝塔」优化 Apk 包大小

    九分喜欢,一分尊严,放弃你,也放过自己,愿你安好,在多年以后不要记起深爱你的我. 絮絮叨 工作不长不短,之前未曾考虑过深处,只是停留写出来了,便是完美. 而今的处境,不尴不尬,岁月刚好,背起行囊,继续 ...

  4. 「好软安利」一个使用简单还高效率的写作排版软件

    主题:分享一个简单高效的公众号文章排版软件 作者:水墨 hi,大家好,我是水墨.这篇文章将会分享一个颜值高.操作简单.免费的排版软件.之前写文章,水墨会花掉大量的时间在排版上,最后做得还不一定漂亮.导 ...

  5. 「造轮子」一个文件上传靶场知识总结记录

    https://www.sqlsec.com/2020/10/upload.html#toc-heading-1 或者 https://xz.aliyun.com/t/8435 直接使用别人的靶场总感 ...

  6. 「开发者说」“游戏化管理”上钉钉,关于悦积分的应用开发故事

     "在钉钉的应用开发不仅为企业提供智能积分.福利.文化.绩效等整体解决方案,同时也能让企业通过"打怪升级"的游戏化管理帮助企业解放生产力,让企业运营管理升级.通过与钉钉的 ...

  7. 智能座舱开启「万物交互」新革命,隐形冠军们如何突围?

    伴随智能座舱在市场端逐步深入消费者心智,从显示.语音到视觉交互,各细分赛道都在蓬勃发展. 高工智能汽车研究院监测数据显示,2022年1-10月,智能座舱前装搭载量同比增长58.06%%,高阶智能座舱同 ...

  8. 傅里叶卷积实现「万物隐身」,这个神器可试玩

    来源:机器之心 将快速傅里叶卷积引入网络架构,弥补感受野不足的缺陷,来自三星.洛桑联邦理工学院等机构的研究者提出了 LaMa(large mask inpainting)方法,在一系列数据集上改进了 ...

  9. pcb可以给用户进程读吗_「TCP/UDP」一个端口号可以同时被两个进程绑定吗? - 一口Linux...

    一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...

最新文章

  1. 批处理 bat 提取项目war包
  2. Centos下通过SMTP发送邮件失败解决
  3. 内建控制结构之if表达式
  4. 人民币对美元汇率中间价报6.7665元 下调73个基点
  5. android进出动画有白屏,Android启动白屏原因及解决方案
  6. 光纤收发器的实际应用范围介绍
  7. of_property_read_string 剖析~
  8. 无人驾驶三 卡尔曼滤波及无迹卡尔曼滤波的几何意义
  9. .net 数据存储 mysql_asp.net实现存储和读取数据库图片
  10. mysql sql 限制条数据类型_数据库的数据类型和约束条件
  11. FTP,SFTP,FTPS,TF区别
  12. Bugzilla 下载和安装
  13. Infoq专访:Maven中文用户组创始人许晓斌
  14. 湖南科技大学EDA作业
  15. C#根据出生日期计算年龄的源码
  16. AI面相手相V3.2.0无限多开版h5公众号版本源码(含搭建教程+运营文案图片)
  17. 机电开关的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. Css Html / Summary of Interview Questions
  19. c语言switch中文版,C语言 switch语句小陷阱
  20. qBittorrent一个替代 µTorrent 的开源软件

热门文章

  1. 【Python】P1008 [NOIP1998 普及组] 三连击
  2. win10网络图标变成地球加禁止符号但能上网解决办法
  3. 微端和网站可以放同一台服务器吗,微端放云服务器可以吗
  4. 【初学者知识】了解一下BASIC语言
  5. 语音入口大战升级,Echo音箱还不是杀手锏,等所有汽车都用上Alexa就不一样了
  6. Java实现积分过期保证时间_商城会员积分过期的实现方案
  7. 怎么做好WMS系统项目的验收
  8. 惠普打印机故障代码_HP打印机故障代码
  9. Zookeeper:Zookeeper的主从选举机制
  10. 大学生活该如何度过?思维导图告诉你