android - 什么是 Smali Code Android

标签 android dalvik dex vm-implementation smali

我将学习一点关于 Dalvik VM、dex 和 Smali 的知识。

我读过关于 smali 的文章,但仍然无法清楚地理解它在编译器链中的位置。以及它的目的是什么。
这里有一些问题:

  1. 据我所知,dalvik 与其他虚拟机一样运行字节码,而对于 Android,它是 dex 字节码。
  2. 什么是 smali? Android OS 或 Dalvik Vm 是否直接使用它,或者它只是相同的 dex 字节码但对人类来说更具可读性?
  3. 它是否类似于 Windows 的反汇编程序(如 OllyDbg)程序可执行文件由不同的机器代码(例如 D3、5F)组成,并且每个机器代码都有适当的汇编命令,但 Dalvik Vm 也是软件,所以 smali 是可读的字节码的表示
  4. 有新的 ART 环境。它仍然使用字节码还是直接执行 native 代码?

提前谢谢你。

最佳答案

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

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

int x = 42

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

13 00 2A 00

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

const/16 v0, 42

这显然比二进制代码更具可读性。但该平台对 smali 一无所知,它只是一个工具,可以更轻松地处理字节码。

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

关于android - 什么是 Smali Code Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30837450/

相关文章:

java - Android xml错误多根

java - android dalvik验证错误: register1 v1 type 0,想要引用

android studio 3.0.1 显示无法合并 dex 为什么?

android - 构建 Gradle 需要互联网连接

android - 无法在 Ubuntu 中执行 adb。下载的文件适用于 x86-64,而我有 i686

java - 如何在 Java 代码中获取崩溃点

android - ClassLoader 来替换一个预加载的类?

android - 将 Jar 导入 Android 项目时出错

android - 使用 Toast 的替代方法

java - 在 Android 上初始化 Myo hub 时出现不满意的链接错误