• [转]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:AndroidSdkuild-tools29.0.3

    • 配置之后可以正常生成 test.jar

    • /data/app目录是每个应用程序安装后都会在这个目录下创建一个apk副本,apk运行的时候读取的一些应用内资源文件就是从这个apk文件里面获取的,对于本次实践不一定要放在/data/app下,其他path下也可以。

    • 总结一下dalvikvm的作用就是创建一个虚拟机并执行指定参数中的java类

  • 相关阅读:
    如何自动生成参考文献格式
    VS2010+OpenCV 项目生成EXE文件如何在其他电脑上直接运行
    从多核CPU Cache一致性的应用到分布式系统一致性的概念迁移
    【译】为什么永远都不要使用MongoDB Why You Should Never Use MongoDB
    团队技能提升的二三事儿
    从微信朋友圈的评论可见性,谈因果一致性在分布式系统中的应用
    我所认为的软件可靠性的三重境界
    Redis核心原理与实践--事务实践与源码分析
    Redis核心原理与实践--Redis启动过程源码分析
    选择SaaS平台的那些事
  • 原文地址:https://www.cnblogs.com/beansoft/p/15495826.html
Copyright © 2020-2023  润新知