当前位置: 首页 > news >正文

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,我拉你进群交(♂)流(♀)

相关文章:

  • 嵌入式Linux:基于ARM11下Android应用点亮LED灯 【PDF版论文下载】
  • 11.24 静态元素过期时间
  • AWS的登录认证。。。
  • 05 Objective C数组的四种遍历方法总结
  • 关于Ubuntu12.04笔记本触摸板的无法使用的问题
  • form表单提交后不刷新不跳转
  • 五险一金
  • springboot web应用 jar 启动 ant脚本
  • 中国移动与苹果联姻 三星在华霸主地位或遭取代
  • 微信公众号支付PHP-SDK的一个BUG
  • 一致性hash的C++实现
  • Swift枚举相关值
  • 去重排序
  • .NET Core中的去虚
  • php获取数组长度的方法
  • 2017-08-04 前端日报
  • 2017年终总结、随想
  • Date型的使用
  • JavaScript类型识别
  • Ruby 2.x 源代码分析:扩展 概述
  • tensorflow学习笔记3——MNIST应用篇
  • windows-nginx-https-本地配置
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 笨办法学C 练习34:动态数组
  • 读懂package.json -- 依赖管理
  • 构造函数(constructor)与原型链(prototype)关系
  • 观察者模式实现非直接耦合
  • 京东美团研发面经
  • 如何解决微信端直接跳WAP端
  • 入手阿里云新服务器的部署NODE
  • 使用agvtool更改app version/build
  • 世界上最简单的无等待算法(getAndIncrement)
  • 思维导图—你不知道的JavaScript中卷
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 用Canvas画一棵二叉树
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 转载:[译] 内容加速黑科技趣谈
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​configparser --- 配置文件解析器​
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $().each和$.each的区别
  • ()、[]、{}、(())、[[]]命令替换
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4)事件处理——(7)简单事件(Simple events)
  • (C#)一个最简单的链表类
  • (java)关于Thread的挂起和恢复
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)c52学习之旅-中断实验
  • (搬运以学习)flask 上下文的实现
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)Linux下编译安装log4cxx
  • (转载)(官方)UE4--图像编程----着色器开发
  • .gitignore文件设置了忽略但不生效
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Micro Framework初体验(二)