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類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM