美文网首页
将java文件直接运行在JVM和Dalvik中

将java文件直接运行在JVM和Dalvik中

作者: 晓涵说 | 来源:发表于2019-10-06 17:42 被阅读0次

    本文通过学习:聊聊 APK —— 直接运行 Dex 总结。

    1.运行工具分析

    在java学习时,如果想顺利的运行java程序,需要安装JRE,对于开发者而言,需要安装JDK,但最终执行Java程序的是在JVM中运行。将**.java文件转为一个或多个字节码.class文件,然后将其打包到.jar包中,JVM从相应的.class文件和.jar中获取相应的字节码。

    .java---.class--JVM运行加载

    对于Android程序,除了将.java文件转为.class文件外,还需要在.class文件的基础上转为.dex(Dalvik Execuable)格式,该格式是转为Dalvik设计的,适合内存和处理器速度有限的系统中运行,同时Dalvik允许在有限的内存中同时运行多个虚拟机实例,每个实例作为独立的Linux进程执行,互相之间不影响(安卓中的APP,每个APP运行在独立的虚拟机实例中,作为独立的Linux进程)。

    .java---.class--.dex--ART/Dalvik运行加载

    安卓中有两种虚拟机Dalvik和ART,其中ART(Android Runtime)是在2014年I/O大会上正式代替Dalvik,两者区别如下:

    对比项 ART Dalvik
    安装 安装时间久,占用内存空间大 安装时间较短,占用内存空间较小
    编译 预编译(AOT:Ahead-Of-Time ) :应用在第一次安装时字节码预先编译成机器码 运行时编译(JIT:Just-In-Time) :在每次运行时编译
    运行 运行效率较高,不需要再次编译字节码(空间换时间) 运行效率较低,需要每次编译字节码(时间换空间)
    性能 减少编译,手机电池续航能力和CPU运行效率提高 耗费较多电量和cpu资源

    以下关于安卓运行的虚拟机都简称为Dalvik。

    2、Java运行

    在文本中编辑一个.java的程序,如下所示:

    public class HelloWorld {
        public static void main (String [] args){
            System.out.println("Hello World!");
        }
    }
    

    在cmd中通过javac命令将其转为.class文件,如果运行javac命令不成功,可参考javac配置后通过cmd操作时显示不是内部命令

    javac HelloWorld.java
    

    生成.class文件后,执行java命令后,会打印出程序中运行的输出字段。如下所示:

    java -cp . HelloWorld
    
    在这里插入图片描述

    以上操作是在HelloWorld.java所在的目录中运行的,如在其他文件中运行,需要先指定文件目录,否则会提示“错误: 找不到或无法加载主类 HelloWorld”,上面语句中的“cp”
    就是类似于classpath的意思,指明文件的目录。例如将cmd切换至C根目录,则执行如下语句:

    java -cp C:\Users\XK\Desktop\APKtest\ HelloWorld
    

    其中HelloWorld位于桌面(Desktop)的APKtest文件中,在指定目录时,需要注意按照以下方式:

    java空格 -cp 空格C:\Users\XK\Desktop\APKtest(文件根目录)\空格 HelloWorld

    在这里插入图片描述

    3、Android中运行

    3.1生成dex文件

    在第二部分中生成的.class文件,需要通过dx生成dex文件,才可运行在Dalvik中。在AndroidStudio开发时,该IDE自动将文件帮我们转换好,可通过查看Project Structure中SDK Location\build-tools,获取版本信息,如下所示:


    在这里插入图片描述

    这里使用28.0.3中的dx.bat生成dex文件,直接在该目录打开cmd,并执行如下所示:

    dx --dex --output=classes.dex HelloWorld.class
    

    dx可以将class文件转为.dex.jar.apk.zip。

    3.2 运行dex文件

    将生成的dex文件push至手机的sdcard目录下,如下所示:

    adb push classes.dex /sdcard
    

    通过class文件和dex文件生成的过程可以看出一个class文件由java生成,dex由class文件生成,class文件中包含多个public类,因此dex文件类似,其可以包含多个class文件,类似于jar。其过程类比于文件的压缩过程。
    将dex推送至手机目录后,执行adb shell,进入sdcard目录,执行如下执行,就会打印为程序运行的HelloWorld!信息。

    HWSTF:/sdcard $ dalvikvm -cp classes.dex HelloWorld
    Hello World!
    

    相关文章

      网友评论

          本文标题:将java文件直接运行在JVM和Dalvik中

          本文链接:https://www.haomeiwen.com/subject/ocnupctx.html