Java文件是如何编译成Dex文件的?如何执行Dex文件?「建议收藏」

Java文件是如何编译成Dex文件的?如何执行Dex文件?「建议收藏」本文将介绍Dex文件,以及Java文件如何生成Dex文件的?最后介绍Dex文件通过什么方式来执行?

大家好,又见面了,我是你们的朋友全栈君。

Dex文件介绍


Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。

为什么要使用dex文件来存储呢?

Java源码经过编译后,得到很多个class文件,考虑到手机的内存较小,google改进了字节码的组织形式,将一个app中的所有class文件合到了一起构成dex文件,当然并不是简单的拼接在一起,而是遵从dex的格式重新组织。

在dex中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加紧凑,实验表明,dex文件是传统jar文件大小的50%左右。

dex文件最终会和资源文件等一起打包成为apk,签名后安装到手机上。

Java文件编译成Dex文件


Java文件编程成dex文件,要经历以下几个步骤:

  1. Java文件生成.class文件。
  2. .class文件生成dex文件。

1. Java文件生成.class文件

Java文件是Java的源文件。
.class文件是Java的字节码文件,它可以被JVM识别、加载和执行。

我们想要生成dex文件,第一步是要把Java文件编译成.class文件,也就是字节码文件。

生成.class文件的方式,Android和Java并无不同,都可以使用javac类生成:

// 打开命令行窗口,输入如下命令,即可将.java文件编译成.class文件
javac -source 1.7 -target 1.7 Demo.java

2. .class文件生成Dex文件

生成.class文件之后,就需要我们转换成dex文件了。

这一步是通过Android提供的工具包充的dx工具来实现的。

dx工具是Android源码的一部分,其路径是在out目录下,因此在执行dx之前,可以将该工具添加到PATH路径。

示例:

//进入dx所在目录,.class文件复制到该目录下,命令行执行命令:
dx --dex --output demo.dex Demo.class

dex文件的执行


打包成.apk文件,安装运行

通常情况下我们的dex文件会通过apkbuilder工具,将所有没有编译过的资源(eg: images)、编译过的资源和.dex文件打包到最终的.apk文件中去。

打包成.apk文件之后,会对Apk文件签名,apk文件只有被签名才能被安装在设备上。

另外,在生成最终apk之前,打包器会使用zipalign工具对应用进行优化,位于android-sdk/tools目录下。

最终,.apk文件将会运行在Android系统上。

dalvikvm工具

dalvikvm工具,可以直接运行.dex文件中的代码,而不必通过.apk的形式安装运行。

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

我们用一个示例来看如何使用?

  1. dex文件生成,这里指定生成产物为demo.jar
dx --dex --output=demo.jar Demo.class
  1. 将demo.jar 通过adb push到/data/app目录,并使用dalvikvm工具来执行Demo类:
adb push demo.jar /data/app
adb shell
cd /data/app
dalvikvm -cp demo.jar Demo
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153548.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【SCOI补全记】SCOI2016 bzoj4567-4572

    【SCOI补全记】SCOI2016 bzoj4567-4572T1:背单词(bzoj4567)题解代码T2:幸运数字(bzoj4568)题解代码T3:萌萌哒(bzoj4569)T4:妖怪(bzoj4570)T5:美味(bzoj4571)题解代码T6:围棋(bzoj4572)T1:背单词(bzoj4567)题解关键词:trie树贪心题意有些难懂,简单解释一下。对于在位置xxx的单词:…

    2022年7月26日
    8
  • 奔图M6506驱动_三星M2071是一体机吗

    奔图M6506驱动_三星M2071是一体机吗奔图PantumM6608一体机驱动是官方提供的一款一体机(打印/扫描)驱动,本站收集提供高速下载,用于解决一体机与电脑连接不了,无法正常使用的问题,本动适用于:WindowsXP/Windows7/Windows8/Windows1032/64位操作系统。有需要的朋友可以来本站下载安装。奔图PantumM6608一体机驱动http://www.equdong.net/qudong/bt_Pantum/7833.html…

    2022年9月25日
    3
  • getmethods和getdeclaredmethods_java中的method

    getmethods和getdeclaredmethods_java中的methodMethodgetDeclaredMethod(Stringname,Class…parameterTypes)d返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。Method[]getDeclaredMethods()返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访…

    2022年9月23日
    2
  • NO6_no6625

    NO6_no66251、自建yum仓库,分别为网络源和本地源2、编译安装http2.4,实现可以正常访问,并将编译步骤和结果提交。3、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项4、创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录…

    2025年8月15日
    7
  • xampp环境配置下出现的问题解决 — mysqli_real_connect(): (HY000/1045): Access denied for user ‘root‘@‘localhost‘

    xampp环境配置下出现的问题解决 — mysqli_real_connect(): (HY000/1045): Access denied for user ‘root‘@‘localhost‘XAMPP环境配置下出现的问题版本:xampp7.3.1    今天,柳妹在虚拟机上面又一次搭建xampp的环境的时候,在mysql的管理界面对于root@localhost管理用户进行密码设定的时候,修改了密码,当再一次点击进入的时候,报错如下:MySQL返回:无法连接:无效的设置。mysqli_real_connect():(HY000/1045):Accessde…

    2022年7月12日
    22
  • linux启动nginx命令_linuxzip解压命令

    linux启动nginx命令_linuxzip解压命令1,首先找到nginx的安装目录whichnginx会找到对应的目录,如图2,查看进程是否存在ps-ef|grepnginx3,杀死进程kill-QUIT1282强制停止kill-912824,进入到nginx的sbin目录,启动nginxcd/usr/local/nginx/sbin/./nginx./nginx-sstop./nginx-squit./nginx-sreload4,但是上面这个..

    2022年10月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号