插件化框架解读之Class文件与Dex文件的结构(一)

  • 属性表:属性表在字段表和方法表中都会出现,主要用于描述某些场景特有的信息。比如方法是否抛出异常,被final声明的变量的值,内部类列表等信息。

Dex文件

Dex是Android平台上(Dalvik虚拟机,art虚拟机)的可执行文件,每个APK压缩包中都包含一个(或者多个MultiDex)Dex文件,Dex文件中包含了app的所有源码。

Dex文件的结构

  • Dex文件是一组以8位字节为基础单位的的二进制流。
  • Dex文件的各数据项目之间也没有任何分隔符
  • Dex文件由文件头,索引区,数据区三个部分组成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 其各个元素的解释如下:
  • header:dex文件头部,记录整个dex文件的相关属性
  • string_ids:字符串数据索引,记录了每个字符串在数据区的偏移量
  • type_ids:类型数据索引,记录了每个类型的字符串索引
  • proto_ids:原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表
  • field_ids:字段数据索引,记录了所属类,类型以及方法名
  • method_ids:类方法索引,记录方法所属类名,方法声明以及方法名等信息
  • class_defs:类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量
  • data:数据区,保存了各个类的真实数据
  • link_data:连接数据区

header

文件头记录了dex文件的一些基本信息, 以及大致的数据分布。其各字段及解释如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

索引区

索引区中索引了整个dex中的字符串、类型、方法声明、字段以及方法的信息, 其结构体的开始位置和个数均来自dex文件头中的记录

  • 字符串索引区:描述dex文件中所有的字符串信息
  • 类型索引区:描述dex文件中所有的类型, 如类类型、基本类型、返回值类型等
  • 方法声明索引区:描述dex文件中所有的方法声明
  • 字段索引区:描述dex文件中所有的字段声明, 这个结构中的数据全部都是索引值, 指明了字段所在的类、字段的类型以及字段名称
  • 方法索引区:描述Dex文件中所有的方法, 指明了方法所在的类、方法的声明以及方法名字

数据区

索引区中的最终数据偏移以及文件头中描述的偏移都指向数据区, 还包括了即将要解析的class_def_item

  • class_def_item:这个结构由dex文件头中的classDefsSize和classDefsOff所指向, 描述Dex文件中所有类定义信息, 每一个DexClassDef中包含一个DexClassData的结构(classDataOff),每一个DexClassData中包含了一个Class的数据, Class数据中包含了所有的方法, 方法中包含了该方法中的所有指令

Class文件和Dex文件对比

  • Class文件是JVM的执行文件,而Dex文件是安卓虚拟机(Dalvik,art)的执行文件
  • Class文件对应Java中每一个类,而Dex文件则包含整个APK文件中的JAVA代码,故Dex文件可以大大缩小体积,减少Class文件的数据冗余,有利于在移动端中运行。(可以通过SDK中的dx命令将若干个Class文件转化为Dex文件)
    原文链接:https://www.jianshu.com/p/a9e12b1c0079
    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。

所以,长征路还长,大家还是好好地做个务实的程序员吧。

最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值