首页 > 代码库 > baksmali和smali源码分析(三)
baksmali和smali源码分析(三)
baksmali 的源码分析
在baksmali进行源码分析之前,需要读者掌握一条主线,因为本身笔者只是由于项目需要用到这套源码,在工作之余的时间里面来进行学习也没有时间和精力熟读源码的每个文件每个方法,但是依据这条主线,至少能够猜出并且猜对baksmali里面的源码的文件大概的作用是什么,这样在修改问题和移植的时候才能做到游刃有余。
这条主线是,baksmali其实只是利用了dexlib2提供的接口,将dex文件读入到一块内存中,这块内存或者说数据结构开辟的大小是跟输入的dex文件相关的,而这块内存所映射的数据结构是一个列表形式的数组,以类为单位,将dex文件全部解析出来,可以简单理解为比如这个dex文件中有100个类,这个数组就有100个对象,每个对象数据结构相同,但大小,内容各异。
baksmali通过 dexlib2提供的接口获取到这个对象中以后,自己定义了一种文件组织规则,当然这种组织规则也绝非无中生有,而是在指令方面遵循 google的dalvik 指令规范,在文件组织方面遵循了 java jar包对于各个class的组织规范,自己在寄存器和函数组织方面有些自己的规则.
而这套规则也将来要跟smali这个生成dex文件的工具一一对应。通过这样的一种规则,baksmali 将获取的对象生成了一个一个的smali文件,让冰冷的二进制的dex文件变得栩栩如生,方便大家的阅读。
以这条主线,我们来看一下baksmali源码的文件组织结构
baksmali源码有50多个文件,分别是由图4 图5 图6 三副图表示
图4
其中图4 下面直接的四个文件
baksmali.java
通过main函数得到dex文件的内存布局,将其生成smali文件
baksmaliOptions.java
生成smali文件的一些选项配置文件
dump.java
类似与dexdump这个工具的作用,是在控制台输出dex文件中的各个段的信息的函数,
本身和baksmali源码无关
main.java
主程序入口文件,主要检测参数,通过调用
//Read in and parse the dex file
DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, options.apiLevel);
将dex映射到内存中去,然后再调用
baksmali.disassembleDexFile(dexFile, options);
这个函数来生成smali文件
图5
图5 中文件众多
为了能够比较好的理解这些文件的作用,这里需要补充一点smali文件生成的规则,smali文件的生成其实
只有三种定义,对于一个smali文件而言只有类,成员变量,和方法,对应与文件来说就是
ClassDefinition.java
FieldDefinition.java
MethodDefinition.java
不管再复杂的类,baksmali源码也认为一个类中只有这三种基本元素,当然生成一个类的时候是需要从
ClassDefinition.java 文件中的writeTo写起的,而在这过程中肯定有成员变量,而写成员变量的时候
就需要从 FieldDefinition.java文件中的 writeTo 写起
当写成员函数的时候就需要从 MethodDefinition.java 文件中的 writeTo 写起了
在理解了上面概念后,我用思维导图画了一下这个文件夹下的文件的组织形式,以供读者整体理解
如图7
图7
看完图5的文件夹了,再看图6中的文件,就很好理解了
图6
这个文件夹下的文件主要是实现生成smali文件的时候的一些基本数据类型的写入,比如
boolean类型的true和false
char 类型的写入等等
ok 理解完了整个源码的目录组织,以及大部分文件的作用,现在我们可以进入baksmali源码,开始进行分析了