• 面试:dex文件结构


    dex文件 - 简书

    浅谈 Android Dex 文件

            dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。
      当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右

    1、文件布局

      dex 文件可以分为3个模块,头文件索引区数据区头文件概况的描述了整个 dex 文件的分布,包括每一个索引区的大小跟偏移。索引区表示每个数据的标识,索引区主要是指向数据区的偏移。

    • aapt :会把 application Resources 编译成 R.java 和 Compiled Resources。 Compiled Resources 命名为 .ap_ 文件
    • zipalign(resource mode):压缩时会进行 四字节对齐,优点:apk 运行快,RAM 内存减小。

    打包流程

    • 1、资源文件通过 aapt 工具 生产 R.java 文件,xx.aidl 文件通过 aidl 工具生成 java 文件;
    • 2、把 Java 文件和上面生成的 Java 和通过java 编译工具并并编译成 class 文件
    • 3、通过 dx.bat 工具把 class 文件生产 dex 文件
    • 4、把资源文件(Resources)包和 dex 文件压缩成 apk 包
    • 5、最后包压缩后的 apk 包经过签名,就成为可以运行的 apk 包。

    文件头

    文件头区域决定了该怎样来读取这个文件。具体的格式如下表(在文件中排列的顺序就是下面表格中的顺序):

    id 区

    id 区存储着字符串,type,prototype,field, method 资源的真正数据在文件中的偏移量,我们可以根据 id 区的偏移量去找到该 id 对应的真实数据。

    字符串 id 区域

    这个区块是一个偏移量列表,每个偏移量对应了一个真正的字符串资源,每个偏移量占32位。我们可以通过偏移量找到对应的实际字符串数据。具体格式如下:

    最终这个偏移的位置应该是落在数据区的。找到这个偏移量的位置后,根据下面的格式就可以读取出这个字符串资源的具体数据:

    类型 id 区

    这个区块是一个索引列表,索引的值对应字符串id区域偏移量列表中的某一项。数据格式如下:

    如果我们要找到某个类型的值,需要先根据类型id列表中的索引值去字符串id列表中找到对应的项,这一项存储的偏移量对应的字符串资源就是这个类型的字符串描述。

    方法原型 id 区

    这个区块是一个方法原型 id 列表,数据格式为:

    成员 id 区

    这个区块存储着原型 id 列表,数据格式为:

    方法 id 区

    这个区块存储着方法 id 列表,数据格式为: 这个区块存储着原型 id 列表,数据格式为:

    类定义区

    这个区域存储的是类定义的列表,具体的数据结构如下:

  • 相关阅读:
    项目资源管理从学会向上管理开始
    企业数据治理价值解读与场景实践
    小学生加减乘除闯关运算练习流量主微信小程序开发
    ElasticSearch Client问题整理2
    Git常用指令整理【新手入门级】【by慕羽】
    成员函数中的形参的缺省值是否可以使用成员变量?
    力扣第151题 反转字符串中的单词 c++双指针
    SaaSBase:什么是INFOR ERP?
    蓝桥杯【第14届国赛】Python B组
    【深入浅出Spring6】第十期——尾声
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127793572