Class文件、Dex文件、resources.arsc文件结构解读

Class文件解析

  1. class文件是能够被JVM识别,加载并在java虚拟机中执行的文件格式。.java通过编译器可以生成.class文件,具体来说通过javac命令编译得到,.class文件是二进制的形式,但是可以同过反编译得到类似java文件的形式,如图


    image.png
  2. 利用010Editor打开


    class文件十六进制代码
  • 可以看到,开头的是Cafebabe 用于快速判断一个文件是不是有可能为class文件,以及这个class文件有没有受损之后的每一个字节是何作用,知乎有篇博文解释的很棒,此处就不再ctrl C,crtl V了。只是要注意搭配这几张图食用会更佳:博客地址:https://zhuanlan.zhihu.com/p/23068093
    2.1. Class文件结构,其中u4代表四个字节,即八个十六进制位
    class文件结构

    2.2. 常量池的类型图
    注意到,像tag=1的常量字符串,长度是可变的,大小通过length字段决定。


    2.3. 各个字段的对应关系,就当目录了
常量池对应字段整理

2.4 当我自己javac 博文所讲的方法后,发现常量池中少了几个字段,为localvriable,this和第十三个常量。以下是我编译的类信息:


Foo

经过查阅得知:

LineNumberTable属性用于描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系。它并不是运行时必需的属性,但默认会生成到cass文件之中,在 Javac中使用none或-g;nes选项来取消或要求生成这项。如果选择不生成 LineNumberTable属性,对程序运行产生的最主要影响就是当抛出异常时,堆栈中将不会昰示出错的行号,并且在调试程序的时候,也无法按照源码行来设置断点

Dex文件解析

dex文件的十六进制代码

对比Class文件可以发现,在010editor中,dex文件多了dex.bt窗口,可以清晰的通过类比找到对应的十六进制数,而其具体的文件结构如下所示:

Dex文件的结构

dex文件的结构

下面将对各个部分进行解释

  1. Header包括:magicnumber、dex文件校验和、signature字段、文件大小、头部大小、指定cpu信息、linksize(链接段的大小)、linkoff(文件的偏移)、mapOff(DexMapList的文件偏移)、stringIdsSize 和 stringIdsOff字段(字符串的个数和位置偏移)、typeIdsSize和typeIdsOff(类的类型的数量和位置偏移)、protoIdsSize和protoIdsOff(dex文件中方法原型的个数和位置偏移)、fieldIdsSize和fieldIdsOff(字段名的信息)、methodIdsSize和methodIdsOff(方法所在的类、方法的声明以及方法名)、classDefsSize和classDefsOff(类的定义的相关信息)
  2. 各种Ids索引
  3. data: 数据真实存在的位置
  4. link_data: 静态链接 文件中使用的数据,用于指明上述信息存放的位置
    具体的内容参照这篇博客://www.greatytc.com/p/5658b5fd5806

特点:

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

Dex与Class的对比图

class文件和dex文件的解析

ps:一般来讲,一个应用程序都对应着一个.dex文件,就像openhub这样:


openhub解压

然而由于分包等原因,很多大型工程的.dex文件可以有多个,例如下图将微信apk解压:
微信apk解压

arsc文件解析

Resource.arsc是Apk打包过程中产生的一个资源索引文件,主要的作用为记录资源的id和文件路径的关系。

arsc文件的结构

资源文件的索引

在上篇博文//www.greatytc.com/writer#/notebooks/32769734/notes/80776168中有讲到,R.java中存储了资源文件的索id,而arsc文件的作用则是保存实际的路径或资源值。例如getDrawable(R.drawable.img)在编译后成了getDrawable(0x7f06013c),其存储在R.java之中。其格式如下所示:

image.png

面试问题:

  1. 为什么dex拆分成多个?
    方法最多的个数是65536,超过了以后则分多个dex
  2. 如何根据id获取对应png的bitmap
  • 通过arsc将id 解析成对应的资源路径
  • 通过bitmapfactory将资源路径中的资源取出
    注(bitmap和drawable的关系,Drawable 是一个抽象的概念, 而 Bitmap 是其存在的实体之一)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容