运行Android应用的“艺术”
我们知道Android本身是一个Linux操作系统,其应用程序(Apps)大多使用Java语言编写,而Java语言本身是一种解释型语言,在以前的推送中,我介绍过,Java源程序经过javac命令编译后能得到字节码,字节码可以被JVM解释执行,JVM所解释的字节码其实是一种“汇编语言”。
一、Android中的应用程序
Android Apps既然采用Java语言进行编写,其源代码也必然是需要经过“编译成字节码”和“解释执行”两个阶段才能使Apps跑起来。
Android Apps 的Java源代码在一个特定的项目构建工具的帮助下进行编译,得到一些“只能在Android上解释运行的字节码”。
Android中每一个App都是一个单独的APK文件,即“Android应用包”,它类似于Java的可执行JAR文件。
每个APK文件包含了“只能在Android上解释运行的字节码”“运行相关库”“应用相关资源”等内容。
二、什么是“艺术”(ART)?
Android通常用于使用电池的移动设备,也就是说Android Apps的运行环境注定受到了功耗、内存等方面的限制。
每一个传统的Java应用运行时都需要一个单独的JVM进程,因此会占用大量的内存。
Android使用一种方案解决了这个问题。在Android中,它并不使用JVM来运行应用,而采用了一种完全不同的虚拟机,叫作Android运行时(Android Runtime,即ART) (Android 4.4以前使用Dalvik虚拟机)。
三、只能在Android上解释运行的字节码
因为实际的Android应用在ART中运行,而非JVM,所以Android使用了一种格式为DEX而非class的字节码。
你可以用带有特定的项目构建工具的编译程序编译Android程序的Java源代码,这些源代码最终会形成适用于ART的高效、简短的DEX字节码。
ART可以把DEX字节码解释成为不同设备能识别的机器语言,直接在设备的CPU上运行。
因此,Android Apps可以跨设备运行。