baksmali和smali源码分析(三)

baksmali的源码分析

在baksmali进行源码分析之前,需要读者掌握一条主线,因为本身笔者只是由于项目需要用到这套源码,在工作之余的时间里面来进行学习也没有时间和精力熟读源码的每个文件每个方法,但是依据这条主线,至少能够猜出并且猜对baksmali里面的源码的文件大概的作用是什么,这样在修改问题和移植的时候才能做到游刃有余。


这条主线是,baksmali其实只是利用了dexlib2提供的接口,将敏捷文件读入到一块内存中,这块内存或者说数据结构开辟的大小是跟输入的敏捷文件相关的,而这块内存所映射的数据结构是一个列表形式的数组,以类为单位,将敏捷文件全部解析出来,可以简单理解为比如这个敏捷文件中有100个类,这个数组就有100个对象,每个对象数据结构相同,但大小,内容各异。


baksmali通过dexlib2提供的接口获取到这个对象中以后,自己定义了一种文件组织规则,当然这种组织规则也绝非无中生有,而是在指令方面遵循谷歌的dalvik指令规范,在文件组织方面遵循了java jar包对于各个类的组织规范,自己在寄存器和函数组织方面有些自己的规则。


而这套规则也将来要跟smali这个生成敏捷文件的工具一一对应。通过这样的一种规则,baksmali将获取的对象生成了一个一个的smali文件,让冰冷的二进制的敏捷文件变得栩栩如生,方便大家的阅读。


以这条主线,我们来看一下baksmali源码的文件组织结构

baksmali源码有50多个文件,分别是由图4图5图6三副图表示


 baksmali和smali源码分析(三)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,图4


其中图4下面直接的四个文件

baksmali。java
通过主要函数得到敏捷文件的内存布的局,将其生成smali文件

baksmaliOptions。java
生成smali文件的一些选项配置文件


转储。java
类似与dexdump这个工具的作用,是在控制台输出敏捷文件中的各个段的信息的函数,
本身和baksmali源码无关


主要。java,
主程序入口文件,主要检测参数,通过调用
//读取和解析dex文件
DexBackedDexFile dexFile=DexFileFactory。loadDexFile (dexFileFile options.apiLevel);
将敏捷映射到内存中去,然后再调用
baksmali。disassembleDexFile (dexFile、期权);
这个函数来生成smali文件



,,,,,,,,,,,,,,,,,,,, baksmali和smali源码分析(三)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,图5


图5中文件众多

为了能够比较好的理解这些文件的作用,这里需要补充一点smali文件生成的规则,smali文件的生成其实
只有三种定义,对于一个smali文件而言只有类,成员变量,和方法,对应与文件来说就是

ClassDefinition。java
FieldDefinition。java
MethodDefinition。java

不管再复杂的类,baksmali源码也认为一个类中只有这三种基本元素,当然生成一个类的时候是需要从

ClassDefinition。java文件中的用writeTo写起的,而在这过程中肯定有成员变量,而写成员变量的时候
就需要从FieldDefinition。java文件中的用writeTo写起

当写成员函数的时候就需要从MethodDefinition。java文件中的用writeTo写起了

在理解了上面概念后,我用思维导图画了一下这个文件夹下的文件的组织形式,以供读者整体理解
如图7


 baksmali和smali源码分析(三)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,图7



看完图5的文件夹了,再看图6中的文件,就很好理解了

 baksmali和smali源码分析(三)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,图6



这个文件夹下的文件主要是实现生成smali文件的时候的一些基本数据类型的写入,比如

布尔类型的真和假

字符类型的写入等等


好理解完了整个源码的目录组织,以及大部分文件的作用,现在我们可以进入baksmali源码,开始进行分析了





baksmali和smali源码分析(三)