前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >class文件和dex文件「建议收藏」

class文件和dex文件「建议收藏」

作者头像
全栈程序员站长
发布2022-09-14 16:11:35
5620
发布2022-09-14 16:11:35
举报
文章被收录于专栏:全栈程序员必看

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

Class文件

1、什么是class文件
代码语言:javascript
复制
能够被JVM识别,加载并执行的文件格式。
2、class文件的生成
这里写图片描述
这里写图片描述
3、如何生成一个class文件(必须配置好java环境变量)
代码语言:javascript
复制
    通过IDE自定帮我们build
    手动通过javac去生成class文件
    通过java命令去生成class文件
这里写图片描述
这里写图片描述
4、class文件作用
代码语言:javascript
复制
    记录一个类文件的所有信息,记住所有。例如记住了当前类的引用this、父类super等等。class文件记录的信息往往比java文件多。
5、class文件的结构
代码语言:javascript
复制
    8位字节的二进制流文件
    各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
    每个类或者接口单独占据一个class文件,每个类单独管理,没有交叉

使用010Editor可以查看class文件的详细信息(注意需要安装模板):

这里写图片描述
这里写图片描述

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

代码语言:javascript
复制
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:类的方法信息

6、class文件的弊端
代码语言:javascript
复制
    内存占用大,不适合移动端
    堆栈的加栈模式,加载速度慢。
    文件IO操作多,类加载慢。

dex文件

1、什么是dex文件
代码语言:javascript
复制
能够被DVM或者Art虚拟机执行并且加载的文件格式。
2、dex文件的生成(需要配置android的adb环境变量)
代码语言:javascript
复制
先生成class文件(注意执行低版本的JDK版本,否则手机无法运行),然后执行:
dx --dex --output Test.dex Test.class
然后把生成的dex文件拷贝到手机:
adb push C:\Users\Administrator\Desktop\Test.dex /storage/emulated/0
adb shell
dalvikvm -cp /sdcard/Test.dex Test
3、dex文件的作用
代码语言:javascript
复制
 dex文件的作用是记录整个工程(通常是一个Android工程)的所有类文件的信息。
4、dex文件的结构
代码语言:javascript
复制
    8位字节的二进制流文件
    各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
    整个工程的类信息都存放在一个dex文件中(不考虑dex分包的情况下)

同样的,可以通过010Editor来查看dex文件信息:

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述
需要注意的是:
代码语言:javascript
复制
    文件头包含了dex文件的信息,所有数据的大致分布情况
    链接数据区:主要是指so库

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

这里写图片描述
这里写图片描述

class文件与dex文件的比较

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

结构对比图如下:

这里写图片描述
这里写图片描述

参考文献:https://www.jianshu.com/p/2eb518941681

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Class文件
  • dex文件
    • class文件与dex文件的比较
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档