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

Java文件是如何编译成Dex文件的?如何执行Dex文件?相关推荐

  1. Java的class文件批量反编译成Java文件

    Java的class文件批量反编译成java文件 Class文件是java文件编译后产生的一个文件,class文件便于在软件上运行,但是我们无法阅读中间的程序,所以我们需要将class文件转换成jav ...

  2. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

  3. JavaCompiler实战:将Java源代码字符串动态编译成java类

    .首先我们来认识一下 java中的一个对象 JavaCompiler JavaCompiler : 不知道肯定很陌生,其实这个api出来很久了,他是jdk6的特性,用来编译java的源程式的,详细介绍 ...

  4. 批量将很多文件夹打包压缩成多个ZIP和7z压缩包文件

    概要:我们有时候需要将很多不同类型的文件夹单独打包成一个 ZIP 压缩包或者单独的打包成一个 7z 压缩包,我们一个一个处理的话比较慢,但是有没有一种批量将文件夹转成 ZIP 和 7z 压缩包的方法呢 ...

  5. java的class文件批量反编译成java

    近来刚做完项目闲来无事就研究起了反编译,之前做一个orc识别vin码功能在度娘出来的全是那几家公司在做广告,后在在公司数据破解的同事帮助下弄了个apk过来.反编译看看是怎么实现的,后面反编译出来看到是 ...

  6. Java文件是怎么编译成Class文件的

    其实就是我们前端的编译过程,是通过javac(编译器)把java文件变成.class字节码文件. javac HelloWorld.java javap -verbose HelloWorld.cla ...

  7. 用 clang 编译成 IR 汇编 和 目标机器汇编语言文件

    $ clang -emit-llvm -c sum.c -o sum.bc $ clang -emit-llvm -S -c sum.c -o sum.ll $ clang -S sum.c -o s ...

  8. java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...

    理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么 最近在看<深入理解Java虚拟机>弄明白了很多java的底层知识,决定分几部分总结下,从.java文件编译,到 ...

  9. java程序编译成exe文件_将java程序编译成独立运行的exe文件

    将java程序编译成独立运行的exe文件 众所周知java的程序可以"一次编译,到处运行",这个特性不错,但是实现这个特性的前提是当前的平台 必须有相应的jvm,而且如果当前平台的 ...

最新文章

  1. matlab如何加随机噪声
  2. Pycharm回退操作+常用批量操作
  3. Kingbase金仓更改表空间
  4. 数据库、记录、字段、文档
  5. 高流量大并发Linux TCP性能调优
  6. Spring中的后置处理器BeanPostProcessor讲解
  7. codeforces B. Friends and Presents(二分+容斥)
  8. django-单表的增删改查-用户部门表
  9. 8086CPU的寄存器
  10. PUSHA/POPA
  11. Silverlight --- Behavior技术(三)
  12. centos查询是否有安装软件包
  13. 鳗鱼刺多怎么处理图像_图像二值化处理
  14. 如何借助ArrayAdapter和Spinner实现下拉列表
  15. cad字体安装_拿了CAD字体不知道怎么装?看过来
  16. xmapp教程及扩展
  17. STM32F103使用TIM DMA DAC实现播放WAV音乐
  18. 诚风老师-十年了,当年那帮做直销的穷小子都成了富豪
  19. 手把手教你开发红外遥控器
  20. element-ui表格列排序错乱问题解决方案

热门文章

  1. instagram发布工具_如何将全景图发布到Instagram
  2. AR识别场景中UI被挡住的问题
  3. 人工智能--条件生成对抗网络
  4. 完美解决Failed to determine a suitable driver class的问题
  5. 办公软件word在任一页开始设置页码
  6. Vue 中 title 的动态修改
  7. 民间最大社区,倒闭了。
  8. 中海达activesync_通过Exchange ActiveSync将Hotmail与iPhone或iPod Touch同步
  9. 解决onedrive启动问题
  10. js抛硬币按钮动画js特效代码