知方号

知方号

android为什么要虚拟机 安卓为什么要用虚拟机<安卓为什么有虚拟机游戏>

众所周知,Android 最开始面世时,使用的开发语言是 Java,而 Java 是运行在 Java 虚拟机上的,即 JVM。那么为什么 Google 要单独设计一套新的 Dalvik 虚拟机来执行 Android 程序呢?可能是为了解决移动端设备上软件运行效率问题,可能是 JVM 虚拟机无法满足当时移动端的使用场景,也可能是为了规避与 Oracle 公司的版权纠纷问题,最终 Google 专门为 Android 平台设计了一套虚拟机来运行 Android 程序,它就是 Dalvik Virtual Machine(Dalvik 虚拟机)。

随着 Android 发展至今,虽然目前开发 Android 程序的语言已经越来越多样性,如 Java,Kotlin,Dart,Flutter 等等,但无论使用哪种语言开发 Android,最终都需要运行在虚拟机上,本篇文章将站在 Android 虚拟机的视角来分析 Android 程序的运行原理。

1、Dalvik 虚拟机概述及特点

Google 于 2007 年底正式发布了 Android SDK, Dalvik 虚拟机也正式进入我们的视野,而 Dalvik 命名的由来是取至其作者 丹·伯恩斯坦(Dan Bornstein) 曾居住过一个名叫 Dalvik 的小渔村。Dalvik 虚拟机作为 Android 平台的核心组件,拥有如下几个特点:

体积小,占用内存空间小;专有的 DEX 可执行文件格式,体积更小,执行效率更快;常量池采用 32 位索引值,寻址类方法名、字段名、常量更快;基于寄存器架构,并拥有一套完整的的指令系统;提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能;所有的 Android 程序都运行在 Android 系统进程里,每个进程对应着一个 Dalvik 虚拟机实例;2、Dalvik 虚拟机与 Java 虚拟机的区别

从 Dalvik 虚拟机的特点我们可以看出 Dalvik VM 和 JVM 还是有许多的不同点的,两者并不兼容,他们显著的不同点主要有以下几个方面:

2.1、Java 虚拟机运行的是 Java 字节码,Dalvik 虚拟机运行的是 Dalvik 字节码

传统的 Java 程序经过编译,生成 Java 字节码保存在 .class 文件中,Java 虚拟机通过解码 .class 文件中的内容来运行程序。而 Dalvik 虚拟机运行的是 Dalvik 字节码,所有的 Dalvik 字节码由 Java 字节码转换而来,并被打包到一个 DEX(Dalvik Executable) 的执行的文件中,Dalvik 虚拟机通过解释 DEX 文件来执行这些字节码。

2.2、Dalvik 可执行文件的体积更小

Android SDK 中有一个叫 dx 的工具负责将 Java 字节码转换成 Dalvik 字节码。dx 工具对 Java 类文件重新排列,消除在类文件中出现的所有冗余的信息,避免虚拟机在初始化时出现重复的文件加载与解析过程。

一般情况下,Java类文件中包含多个不同的方法签名,如果其他的类文件引用该类文件中的方法,方法签名也会被复制到其类文件中,也就是说,多个不同的类会同时包含相同的方法签名,同样的,大量的字符串常量在多个类文件中也被重复使用,这些冗余信息会直接增加文件的体积,同时也会严重影响虚拟机解析文件的效率。dx 工具针对这个问题专门做了处理,它将所有的 Java 类文件中的常量池进行分解,消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享一个常量池。

由于 dx 工具对常量池的压缩,使得相同的字符串、常量在 DEX 文件中只出现一次,从而减少了文件的体积。其转换过程可参考下图:

2.3、Dalvik 虚拟机与 Java 虚拟机架构不同

Java 虚拟机基于栈结构。Java 程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。