什么是Smali Code Android

28 android dalvik dex smali vm-implementation

我将学习一些关于Dalvik VM,dex和Smali的知识.

我读过关于smali的内容,但仍然无法清楚地了解它在编译器链中的位置.它的目的是什么.
这里有一些问题:

  1. 据我所知,dalvik作为其他虚拟机运行字节码,在Android的情况下它是dex字节码.
  2. 什么是小?Android OS或Dalvik Vm是否直接使用它,或者它只是相同的dex字节码,但对人类更具可读性?
  3. 它是像Windows的dissasembler(如OllyDbg)程序可执行程序由不同的机器代码(例如D3,5F)组成,并且每个机器代码都有适当的汇编命令,但Dalvik Vm也是软件,因此smali是字节码的可读表示
  4. 有新的ART环境.它仍然使用字节码或直接执行本机代码吗?

先感谢您.

Ant*_*ony 41

当您创建应用程序代码时,apk文件包含.dex文件,其中包含二进制Dalvik字节码.这是平台实际理解的格式.但是,读取或修改二进制代码并不容易,因此有一些工具可以转换为人类可读的表示形式.最常见的人类可读格式称为Smali.这与您提到的解码器基本相同.

例如,假设你有类似的Java代码

int x = 42
Run Code Online (Sandbox Code Playgroud)

假设这是第一个变量,那么该方法的dex代码很可能包含十六进制序列

13 00 2A 00
Run Code Online (Sandbox Code Playgroud)

如果你在它上运行baksmali,你会得到一个包含该行的文本文件

const/16 v0, 42
Run Code Online (Sandbox Code Playgroud)

这显然比二进制代码更具可读性.但是该平台对smali一无所知,它只是一个使字节码更容易使用的工具.

Dalvik和ART都采用包含dalvik字节码的.dex文件.它对应用程序开发人员完全透明,唯一的区别是安装和运行应用程序时幕后发生的事情.

  • 只是为了澄清,反编译为Java是有损的(正如Antimony所提到的)意味着代码可能足够好以获得它正在做的但不足以重新构建apk的要点.用apktool反编译成smali的apk可以修改(更改资源,注入代码,修改代码),然后再次内置到工作的apk中. (4认同)
  • 您可以在https://source.android.com/devices/tech/dalvik/dex-format.html上查看dex格式的详细信息。 (2认同)