这一节,主要介绍一下 baksmali代码的框架。


我们经常在反编译android apk包的时候使用apktool这个工具,其实本身这个工具里面对于dex文件解析和重新生成就是使用的baksmali 和smali这两个jar包
其中 baksmali是将 dex文件转换成便于阅读的smali文件的,
具体使用命令如下:
java -jar baksmali.jar classes.dex -o myout
其中myout是输出的文件夹

而smali是将smali文件重新生成回 dex文件的
具体使用的命令如下:
java -jar smali.jar myout -o classes.dex

这两个工具在源码中分别对应两个文件夹,下面见图三,源码文件夹的样子

baksmali和smali源码分析(二)_第1张图片


在分析源码之前,这里我先将这些文件夹下的主要作用来说明一下,让大家有个总体的认识

baksmali     该文件夹下面主要实现的是将 dex转换成smali文件的代码,需要分析的重点

deodexerant  该文件夹下面的文件是一个可执行文件,笔者尝试用ndk编译了一下,能够编译出可执行文件根据里面的描述,是为了 拷贝出来dalvik虚拟机中的函数表,有兴趣的同学可以试试,就是用dlopen 将 libdvm.so 打开,然后得到 dvmGetInlineOpsTable 这个导出表,看看里面的内容

dexlib2      这个文件夹其实是dex和smali转换真正起到作用的代码,不管是baksmali还是smali都需要用到这个库中的接口和方法,才能解析和生成相应的smali文件,这个在后面会重点分析的

examples     一些有代表意义的smali文件

externaljar  这个是我为第三方jar建立的一个目录

gradle       管理工具,没有特别关注,跟源码分析无关

scripts      执行smali和baksmali的脚步文件,跟源码无关

smali        该文件夹下面主要实现的是将 smali文件转换成dex文件的代码,需要重点分析

smali-integration-tests   整合测试的一个文件夹,里面也是一些smali文件,跟源码无关

util         一些能够提取出来的辅助类的实现