class与dex文件
2017-09-05 本文已影响5169人
小楠总
什么是class文件
class文件是一种能够被JVM识别,加载并且执行的文件格式。
class文件的生成
很多语言都可以直接或者间接生成class文件,如下图所示:
class文件生成.pngTips:包括Kotlin、C++等等也能够生成class文件
下面举例,我们有一个Hello.java:
public class Hello {
public static void main(String[] args) {
System.out.println("hello android");
}
}
我们可以通过下面的命令去生成class文件(IDE实际上帮我们封装好了):
javac -target 1.6 -source 1.6 Hello.java
通过下面的命令执行:
java Hello
Tips:通常为了兼容低版本,例如Android系统,我们一般指定比较低版本的JDK,否则无法运行
class文件的作用
class文件的作用是记录一个类文件的所有信息。
例如记住了当前类的引用this、父类super等等。class文件记录的信息往往比java文件多。
class文件的结构
- 8位字节的二进制流文件
- 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
- 每个类或者接口单独占据一个class文件,每个类单独管理,没有交叉
使用010Editor可以查看class文件的详细信息(注意需要安装模板):
查看class文件.pngclass文件中的字段如下所示:
magic 加密字段,虚拟机判断当前的class文件是否被篡改过
minor_version 支持最低版本的jdk
major_version 编译使用的jdk版本
constant_pool_count 常量池的数量,一般为一个
cp_info constant_pool 常量池的结构体,数量不定(类型是cp_info结构体)
access_flags 访问级别,例如public等
this_class 当前类
super_class 父类
interfaces_count 类实现接口的数量
fields_count 类成员变量的数量
methods_count 类方法的数量
method_info methods 类方法的结构体
attributes_count 类属性的数量
attribute_info attributes 类属性的结构体
其中,access_flags如下:
访问级别.pngconstant_pool包括:
- CONSTANT_Integer_info、CONSTANT_Long_info、CONSTANT_String_info等等
- CONSTANT_Class_info:类的相关信息,包括当前类、引用到的类的信息
- CONSTANT_Fieldref_info:类的域信息
- CONSTANT_Methodref_info:类的方法信息
class文件的弊端
- 内存占用大,不适合于移动端
- 堆栈的加载模式导致加载速度慢
- 文件IO操作多,类查找慢
什么是dex文件
能够被DVM或者Art虚拟机执行并且加载的文件格式。
dex文件的生成
先生成class文件(注意执行低版本的JDK版本,否则手机无法运行),然后执行:
dx --dex --output Hello.dex Hello.class
然后把生成的dex文件拷贝到手机:
adb push C:\Users\nan\Hello.dex /sdcard/
然后进入shell,执行:
dalvikvm -cp /sdcard/Hello.dex Hello
dex文件的作用
dex文件的作用是记录整个工程(通常是一个Android工程)的所有类文件的信息。
dex文件的结构
- 8位字节的二进制流文件
- 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
- 整个工程的类信息都存放在一个dex文件中(不考虑dex分包的情况下)
同样地,可以通过010Editor来查看dex文件信息:
查看dex文件信息.pngdex文件的结构如下图所示:
dex文件结构.png需要注意的是:
- 文件头包含了dex文件的信息,所有数据的大致分布情况
- 链接数据区:主要是指so库
dex文件头信息的详细信息如下:
dex文件头.pngclass文件与dex文件的比较
- 本质上都是一样的,都是二进制流文件格式,dex文件是从class文件演变而来的
- class文件存在冗余信息,dex文件则去掉了冗余,并且整合了整个工程的类信息。
结构对比图如下:
对比.png相关参考文章
http://blog.csdn.net/zhangjg_blog/article/details/21486985
如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:
公众号:Android开发进阶我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)。