Android高级进阶__class & dex文件详解

本章概述:

-class文件结构深入解析
-dex文件结构深入解析
-class与dex文件对比

-基本概念:

class文件就是一种文件格式,被JVM识别。如下图
java、scala、python等语言都可以编译生成class文件,让jvm识别在这里插入图片描述

如何生成class文件:

1、通过IDE自动帮我们build
2、手动通过javac去生成class文件
3、通过java命令去执行class文件

class文件的三个特点:

1、一种8位字节的二进制流文件
2、各个数据按顺序紧密的排列,无间隙
3、每个类或接口都单独占据一个class文件

class文件结构解析:

class文件记录java文件所有的信息(比如方法、变量等等),并且包含的信息远远大于java源文件, 比如类中没有定义 this 、super 关键字,为什么可以直接调用,因为再生成class文件的时候,java虚拟机就已经记录了当前的类this,和父类super
在这里插入图片描述
magic字段 :加密字段,比如md5加密,java虚拟机根据此字段判断class文件是否被篡改过,篡改过会用其他的加密手段。

minor-version字段:class文件最小被哪个jdk版本加载

magor-version字段: class文件是被那个jdk版本生成的

constant_pool_count字段: 常量池数量

constant_pool字段: 代表常量池 最核心部分,放在最后讲解

access_flags字段:class文件作用于域标志,class是公共还是私有类型

this_flags和super_flags字段:这就是上面所说,为什么在java文件里面没有定义this、super关键字,单可以直接调用。就是因为java虚拟机在生成class文件的时候填充的这两个字段。

interface_cout 和interface字段: 表面当前class文件继承了多少接口。但是注意它只会记录当前java文件继承接口的个数,父类的不记录

fields_cout 和fields字段 :java文件包含所有的成员变量

methods_count和methods 字段:记录方法的信息,所属的类等

attribute_count和attributes字段 :属性相关的信息

java虚拟机可以找到class文件中任何信息


access_flags作用域 取值范围

在这里插入图片描述


constant_pool常量池中包含的内容: 存储类里面所有的 integer、long、String、short等类型;还有类中的信息,右边图片只是存储的一些索引,索引最终指向的还是 左边的常量池,所以最终存储的还是在常量池里面
在这里插入图片描述
下面可以下载工具查看一个class文件
在这里插入图片描述

以上是对class文件的介绍,下面介绍一下dex文件


dex文件基本概念:

 能够被dvm识别,加载并执行的文件格式

如何生成dex文件

1、通过IDE自动帮我们build生成
2、手动通过dx命令去生成dex文件

手动运行dex在手机

在这里插入图片描述


dex文件作用

记录整个工程中所有类文件的信息,记住是整个工程

dex文件结构

一种8位字节的二进制流文件
各个数据按顺序紧密的排列,无间隙
整个应用中所有的java源文件都放在一个dex文件中

在这里插入图片描述
在这里插入图片描述


class文件和dex文件的对比

本质上他们都是一样的,dex是从class文件演变而来的
class文件存在许多有余信息, dex会去除有余,并合并

class文件弊端:

内存占用大,不适合移动端
堆栈的加栈模式,加载速度慢
文件IO操作多,类查找慢

在这里插入图片描述

dex的优点是 一个dex文件就存储了所有的.class文件,更加的适合移动端

总结:

如何生成class及dex文件
class文件与dex文件结构组成
dex与class相比它的优势

发布了51 篇原创文章 · 获赞 78 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_39079048/article/details/87601901