什么是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類。