第二章 android 热修复系列文章 之 认识class与dex





目录

1. 前言

2. class文件结构

3. 3. class文件的弊端

4. dex文件结构

5. class和dex文件对比




1. 前言

android本身就是java的延伸,对比java开发技术我们很容易掌握android开发技术,整个编译流程也不例外




2. class文件结构

-什么是class文件

可以被jvm识别,加载并执行的文件格式

-class文件是如何生成

要求电脑安装jdk环境,并通过javac 命令编译生成的

-格式

  • 一种8位字节的二进制流文件

  • 各个数据按顺序紧密排列紧密的排列,无间隙

  • 每个类或接口都单独占据一个class文件


> class 文件结构

每一个 class 文件的都记录这个类或接口的完整信息,并包含以下目录结构

对应描述

字段名称 作用 备注
magic 加密段,主要防止class字节码文件被篡改
minor_version 描述class 文件最小可以被哪个版本的jdk加载,即最小适配版本
majar_version 描述当前class文件是由jdk哪个版本变音产生的
constant_pool_count 内存中常量池的数量 通常数量下内存中常量池唯一
constant_pool 内存中常量池 长度constant_pool_count-1
access_flag 当前class文件作用域标识
this_class 当前类或接口
super_class 父类
interfaces_count 当前类直接继承的接口,间接继承不在这里统计
interfaces 当前类直接继承的接口,间接继承不在这里统计 interfaces_count-1
fields_count 标记当前class文件所有成员变量的数量
fields 标记当前class文件所有成员变量 field_info是一个结构体,结构体里面包含了成员变量的name,所处的类以及他的类型
methods_connt 记录class文件中所有的方法的数量
methods 记录class文件中所有的方法 methods_connt-1
attribute_count 记录当前class文件中所有其他的属性的数量
attribute 记录当前class文件中所有其他的属性 attribute_count-1

其中access_flags

constant_pool中包含的内容(这里仅列举几种)

字段名称 作用 备注
CONSTANT_Integer_info 存储所有int类型的参数
CONSTANT_Long_info 存储所有long类型的参数
CONSTANT_String_info 存储所有String类型的参数
CONSTANT_Class_info 记录class文件中类的相关信息同时记录了应用类的信息
CONSTANT_fieldref_info 记录class文件中field的相关信息
CONSTANT_Methodref_info 记录class文件中method的相关信息
  • 总结每一种基本数据结构都会有一种常量结构与之对应



3. class文件的弊端

  • 每个class文件都会记录这个类加载搜需要的全部信息,冗余信息大,内存占用大不适合移动端
  • 堆栈加载模式,加载速度慢
  • 文件IO操作多,类加载慢(每个class只记录单个class的信息,需要加载的文件多)



4. dex文件结构

什么是dex文件

dex是Android平台上可执行文件的类型,是一种紧凑格式文件,记录整个工程(通常是一个Android工程)的所有类文件的信息。

如何生成一个dex文件

这个我在前面的博客中已经详细描述了,感兴趣的可以再看一下 Adroid ADB实现执行任意代码及完成apk上传安装

dex文件的作用

dex文件的作用是记录整个工程(通常是一个Android工程)的所有类文件的信息。

dex文件格式详解

需要注意的是:

  • 文件头包含了dex文件的信息,所有数据的大致分布情况

  • 索引区则是记录了字符串、类型、方法原型、作用域、方法的索引

  • 数据区:分为普通数据区, 链接数据区

    • 链接数据区:主要记录了引入so库的索引,这也是为什么apk在运行时会报错.so找不到

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




5. class和dex文件对比
  • 本质上都是一样的,都是二进制流文件格式,dex文件是从class文件演变而来的

  • class文件存在冗余信息,dex文件则去掉了冗余,并且整合了整个工程的类信息。

为了更加清晰这里用图的方式来表现

更多相关文章

  1. Android(安卓)Button及TextView动态变换颜色
  2. Android(安卓)RadioButton设置选中时文字和背景颜色同时改变
  3. Android(安卓)中自定义属性(attr.xml,TypedArray)的使用!
  4. Android(安卓)NDK编程中Application.mk和Android.mk写法
  5. Ubuntu Linux下android源码下载方法
  6. Android(安卓)文件路径详解
  7. Android(安卓)DiskLruCache完全解析,硬盘缓存的最佳方案
  8. 从头学Android之Android的数据存储--File
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android(安卓)好的学习资料
  2. Android(安卓)-- 网络相关的系统服务启动
  3. Android(安卓)Studio 使用技巧
  4. Android(安卓)资源和国际化
  5. Android(安卓)报表工具FusionCharts解析
  6. android-基础知识:实现简单的拨打电话功能
  7. IT 网站收藏
  8. Android(安卓)学习之界面跳转
  9. Android(安卓)时间显示问题
  10. 将android launcher2导入eclipse中运行