美文网首页Android
class与dex文件

class与dex文件

作者: 小楠总 | 来源:发表于2017-09-05 00:12 被阅读5169次

什么是class文件

class文件是一种能够被JVM识别,加载并且执行的文件格式。

class文件的生成

很多语言都可以直接或者间接生成class文件,如下图所示:

class文件生成.png
Tips:包括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文件.png

class文件中的字段如下所示:

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如下:

访问级别.png

constant_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文件信息.png

dex文件的结构如下图所示:

dex文件结构.png

需要注意的是:

  • 文件头包含了dex文件的信息,所有数据的大致分布情况
  • 链接数据区:主要是指so库

dex文件头信息的详细信息如下:

dex文件头.png

class文件与dex文件的比较

  • 本质上都是一样的,都是二进制流文件格式,dex文件是从class文件演变而来的
  • class文件存在冗余信息,dex文件则去掉了冗余,并且整合了整个工程的类信息。

结构对比图如下:

对比.png

相关参考文章

http://blog.csdn.net/zhangjg_blog/article/details/21486985

如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:

公众号:Android开发进阶

我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)

相关文章

网友评论

    本文标题:class与dex文件

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