「万物生长」一个APK从诞生到活跃在Android手机上,android驱动开发权威指南pdf
可能到这里你还没有感觉,但如果看了这张图呢?
是否能切实的感受到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个部分:
shrink
—— 代码删减optimize
—— 指令优化obfuscate
—— 代码混淆preverify
—— 代码校验
Shrink
作为代码删减肯定是有删减的入口的。ProGuard
会根据Configuration Roots
开始标记, 同时根据Roots
为入口开始发散。标记完成以后, 删除未被标记的类或成员。最终得到的是精简的ClassPool
。
Q1:那这些Roots
的来源是什么呢?
A1:Roots
包括类,方法字段,方法指令, 来源主要有2种。
- 通过
keep
同时allowshrinking
不为true
。计算class_specification
中类限定和限定成员 - 通过
keepclasseswithmembers
关键字allowshrinking
不为true
。如果类限定和成员限定都存在。计算class_specification
中类限定和成员限定。
Q2:删除的是那些代码?
A2: 其实删除的内容就是在全局范围内并没有调用点并且没有用keep
去保留的方法或者类。
Optimize
Optimize
会在该阶段通过对 代码指令、 堆栈, 局部变量以及数据流分析。来模拟程序运行中尽可能出现的情况来优化和简化代码. 为了数据流分析的需要Optimize
会多次遍历所有字节码ProGuard
会开启多线程来加快速度。
具体的优化策略详见于ProGuard 初探的 Optimize 部分
Obfuscate
代码混淆想来是我们最为常见的部分了。
混淆部分一共会带来两部分的收益:
- 代码失去直观的语义(因为我们的方法或者函数命名时都会有一定的规则)
- 代码内容缩短,缩小整体的包体积
Preverify
对代码进行预校验。 主要校验StackMap / StackMapTable
属性。android
虚拟机字节码校验不基于StackMap /StackMapTable
。
具体内容详见于 ProGuard 初探
D8
是
Dex
的替代产品
这一解析器的引入非常重要的目的是为了适应Java 8
上新概念Lambda
。Java
底层是通过invokedynamic
指令来实现,由于Dalvik/ART
并没有支持invokedynamic
指令或者对应的替代功能。简单的来说,就是Android
的dex
编译器不支持invokedynamic
指令,导致Android
不能直接支持Java 8
。
所以Android
做的事情就是间接支持,将Lambda
变化为可以解析的语法然后执行。
将代码编译以后,我们能够发现生成的代码中会同时生成以Lambda
来标识的类,这就是说明了他的解析方案,而代码的实现方式就是我们在Java 7
中常见的方案了。
不过你觉得新产品的提升会止步于此吗?
用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件.但是有的同学是做实现层的开发,不直接做View层的 ... 导读:为了启发青年学者研究思路,激发科研灵感,智源社区推出青年学者访谈栏目.北京邮电大学副教授王啸是国内图学习领域的佼佼者.回顾他的科研历程,从探寻网络研究的本质,到在物理学家的论文中寻找灵感,他对图 ... 九分喜欢,一分尊严,放弃你,也放过自己,愿你安好,在多年以后不要记起深爱你的我. 絮絮叨 工作不长不短,之前未曾考虑过深处,只是停留写出来了,便是完美. 而今的处境,不尴不尬,岁月刚好,背起行囊,继续 ... 主题:分享一个简单高效的公众号文章排版软件 作者:水墨 hi,大家好,我是水墨.这篇文章将会分享一个颜值高.操作简单.免费的排版软件.之前写文章,水墨会花掉大量的时间在排版上,最后做得还不一定漂亮.导 ... https://www.sqlsec.com/2020/10/upload.html#toc-heading-1 或者 https://xz.aliyun.com/t/8435 直接使用别人的靶场总感 ... "在钉钉的应用开发不仅为企业提供智能积分.福利.文化.绩效等整体解决方案,同时也能让企业通过"打怪升级"的游戏化管理帮助企业解放生产力,让企业运营管理升级.通过与钉钉的 ... 伴随智能座舱在市场端逐步深入消费者心智,从显示.语音到视觉交互,各细分赛道都在蓬勃发展. 高工智能汽车研究院监测数据显示,2022年1-10月,智能座舱前装搭载量同比增长58.06%%,高阶智能座舱同 ... 来源:机器之心 将快速傅里叶卷积引入网络架构,弥补感受野不足的缺陷,来自三星.洛桑联邦理工学院等机构的研究者提出了 LaMa(large mask inpainting)方法,在一系列数据集上改进了 ... 一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...「万物生长」一个APK从诞生到活跃在Android手机上,android驱动开发权威指南pdf相关推荐
最新文章
热门文章