大家都知道Java的跨平台性,主要体现在Java代码由虚拟机先编译再运行。
Android运行Java代码是通过一个名为Dalvik的虚拟机来实现的,
那么问题来了,为什么Android系统为什么不使用JVM虚拟机呢?
这要从一个故事说起:
其实Android最早是使用的Linux版的JVM虚拟机,虽然JAVA是开源免费但是不代表JVM是开源免费.
所以当时Java的东家Sun公司不乐意了
2006年6月Sun公司便向谷歌索要2000万美元以及10%的Android相关收益并许诺其3年的Java授权
谷歌肯定也不乐意啊觉得Sun公司是脑子进水了
于是07年11月份谷歌便开始了自主开发Android平台虚拟机Davik来避开Sun的诉讼。
10年1月Oracle收购Sun公司获得Java的相关专利和版权,但这并没有结束对谷歌的诉讼
10年8月Oracle诉讼谷歌侵犯Java专利和知识产权,声明是谷歌抄袭了JVM的8行代码,然后谷歌胜诉。
Dalvik 与 JVM的比较
JVM Dalvik
编译后文件的格式 .java -> .class ->.jar .java -> .class -> .dex -> .apk
架构 基于栈的架构 基于寄存器的架构
1.栈是内存当中的数据结构而寄存器是CPU当中的一个储存单元,显然CPU读取寄存器中的数据是快于内存的。那么DVM当中的所有东西都是保存在寄存器的么? 答案:不是,寄存器的容量仅仅保存的是内存指针(内存地址)而已。
2.Java代码需要运行首先需要编译为 .class 文件 那么Dalvik编译为.class文件之后还需要全部编译成一个.dex文件再打包到apk当中,所以我们在apk当中是找不到.class文件的。
将所有.class 编译为一个.dex文件有什么优势呢?
大家可以联想一下我们复制一堆总共加起来是10G的文件快 还是一个10G的.zip快呢?
显然是一个文件复制的快,那么这是为什么呢? 从上图我们可以知道每一个文件无论是多大,它都会有一个Header,而这个Header在操作文件的时候系统都会进行处理检测的,所以会多花费很多时间的。
所以谷歌这样设计Dalvik是一个极大的优化。