class与dex文件

###什么是class文件

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

###class文件的生成

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

######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文件中的字段如下所示:

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

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文件的结构如下图所示:

需要注意的是:

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

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

###class文件与dex文件的比较

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

结构对比图如下:

###相关参考文章

blog.csdn.net/zhangjg_blo…

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值