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类

posted @ 2020-04-24 00:16  Ylxxxxx  阅读(1655)  评论(0编辑  收藏  举报