Android Dalvikvm的学习笔记
什么是dvm
- 全称
Dalvik virtual machine
,是安卓虚拟机的缩写。Dalvik是Google公司自己设计用于Android平台的Java虚拟机。 - 每一个 Dalvik 应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
- 不同于其他堆栈结构的Java虚拟机,dalvik采用的是基于寄存器的架构。
- DVM可以支持已转为.dex格式的Java应用程序的运行,其中“.dex”格式是专为DVM设计的一种压缩格式,适合内存和处理器速度都有限的系统。
- DVM编译过程java->class->dex
Dalvik字节码
-
Android平台不用JVM来执行代码,而是把应用编译成Dalvik字节码,使用Dalvik虚拟机来执行。最终应用只包含Dalvik字节码。
-
Dalvik虚拟机与Java虚拟机的最显著区别是它们分别具有不同的类文件格式以及指令集。Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是class格式的类文件。
-
Dalvik虚拟机使用的指令是基于寄存器的,而Java虚拟机使用的指令集是基于堆栈的。
Android Dalvikvm的简单使用
- 打开Android模拟器Genymotion中的一台虚拟机,在命令行中使用
adb devices
指令查看该设备是否连接。
device
这个状态表示设备或者模拟器已经连接到adb服务器上- 使用
adb shell
命令远程登录该设备的linux系统
- 可以看到dalvikvm是Android系统自带的一个bin文件,它的作用就是创建一个虚拟机并执行参数中指定的Java类。
- 命令格式是:
dalvikvm -cp 类路径 类名
- 在自己主机上新建
Dalvikvm.java
public class Dalvikvm {
public static void main(String[] args) {
int a = 3;
int b = 7;
System.out.println(a + " + " + b + "=" + add(a, b));
}
private static int add(int a, int b) {
return a + b;
}
}
- 编译该文件,生成
.jar
文件,如下命令所示:
//生成 Dalvikvm.class
javac Dalvikvm.java
//生成 test.jar(使用dx工具将class文件打包压缩成dex文件jar包)
dx --dex --output=test.jar Dalvikvm.class
-
output
参数用于指定Jar文件的输出路径,输出的Jar包中存储着dex格式文件。
-
将生成的
test.jar
push
到Android手机的/data/app目录下,并且用dalvikvm
执行该jar
adb push test.jar /data/app
adb shell
cd /data/app
dalvikvm -cp test.jar Dalvikvm
-
dx工具位于SDK的build-tools里面,作用是将.class转换为dex文件,因为Dalivk虚拟机所执行的程序不是标准的jar文件,而是将jar文件通过特别转换以提高执行效率,而转换后的文件就是dex文件。
-
这里的问题是没有在PATH里配置
E:\Android\Sdk\build-tools\29.0.3
-
配置之后可以正常生成
test.jar
-
/data/app目录是每个应用程序安装后都会在这个目录下创建一个apk副本,apk运行的时候读取的一些应用内资源文件就是从这个apk文件里面获取的,对于本次实践不一定要放在/data/app下,其他path下也可以。
-
总结一下dalvikvm的作用就是创建一个虚拟机并执行指定参数中的java类。