1. 程式人生 > 其它 >[轉]Android Dalvikvm的學習筆記

[轉]Android Dalvikvm的學習筆記

https://www.cnblogs.com/yangdd/p/12764841.html

閱讀目錄

回到頂部

什麼是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類