工程实践

Smali与Dex

· 三面体

Dex就是可以在安卓Java虚拟机上运行的Java程序

什么是Dex

概括来说, Dex就是可以在安卓Java虚拟机上运行的Java程序。 展开来说, Dex 文件格式是专为 Dalvik 设计的一种压缩格式。所以可以简单的理解为:Dex 文件是很多 .class 文件处理后的产物,最终可以在 Android 运行时环境执行。 通俗的讲, 一般情况下,我们编写java程序源文件,文件格式是.java。Java源程序通过编译器生成Java字节码(.class文件),然后就可以直接在Java虚拟机上运行了。但是,鉴于移动设备的特殊属性,例如内存很少、电量很珍贵等理由吧,谷歌针对编译生成的Java字节码文件进行二次加工,生成以.dex结尾的程序代码文件,这种文件可以在为移动设备设计的Java虚拟机上执行。

什么是Smali

概括来说, Smali是一种编程语言。就像Java、C、汇编等语言一样。

Dex与Smali的联系

概括来说, 他们之间没啥联系。

但是:

Converting a .dex file to smali (called baksmaling) gives us readable code in smali language. 

.dex文件是一种压缩的文件格式,不具备可读性。所以我们需要将其转换为可读的文件格式,而Smali就是.dex文件反编译后生成的文件格式,具备较好的可读性。同时smali代码与Java源代码还可以互相进行转换。

但鉴于Smali是较为偏向汇编的底层语言,与Java这样的高级语言存在较大的差异,所以在他们之间互相转换时可能存在信息丢失的现象。也就是说不会百分之百完整转换。