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

本文通过学习:聊聊 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!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容