在baksmali进行源码分析之前,需要读者掌握一条主线,因为本身笔者只是由于项目需要用到这套源码,在工作之余的时间里面来进行学习也没有时间和精力熟读源码的每个文件每个方法,但是依据这条主线,至少能够猜出并且猜对baksmali里面的源码的文件大概的作用是什么,这样在修改问题和移植的时候才能做到游刃有余。
这条主线是,baksmali其实只是利用了dexlib2提供的接口,将dex文件读入到一块内存中,这块内存或者说数据结构开辟的大小是跟输入的dex文件相关的,而这块内存所映射的数据结构是一个列表形式的数组,以类为单位,将dex文件全部解析出来,可以简单理解为比如这个dex文件中有100个类,这个数组就有100个对象,每个对象数据结构相同,但大小,内容各异。
baksmali通过 dexlib2提供的接口获取到这个对象中以后,自己定义了一种文件组织规则,当然这种组织规则也绝非无中生有,而是在指令方面遵循 google的dalvik 指令规范,在文件组织方面遵循了 java jar包对于各个class的组织规范,自己在寄存器和函数组织方面有些自己的规则.
而这套规则也将来要跟smali这个生成dex文件的工具一一对应。通过这样的一种规则,baksmali 将获取的对象生成了一个一个的smali文件,让冰冷的二进制的dex文件变得栩栩如生,方便大家的阅读。