Smali
是一种反汇编语言,用于表示Android
应用中的 DEX 字节码,而 ART 字节码 主要指代 Android 应用运行时的机器代码。
在 Android
应用中,Smali
和ART
字节码是两种相关但不同的概念。
Smali
smali
是DEX
(Dalvik Executable) 文件的反汇编形式, 用于表示应用的字节码, 与Java字节码紧密相关- 当 Android 应用的 APK 包被反编译时,开发者通常会看到
Smali
代码,Smali
代码可以让开发者看到应用程序的低级实现,包括方法、字段和类的定义 Smali
代码通常与Dalvik
虚拟机(DVM)
或ART(Android Runtime)
一起使用,因为它是将Java
字节码转化为DEX
格式后的结果
APK 包
APK(Android Package)包是 Android 应用程序的安装包文件格式,APK 文件是 Android 操作系统用来分发和安装应用程序的标准格式
一个 APK 文件包含了 Android 应用的所有必要文件和资源,这些文件会在设备上被解压缩并执行
主要包含:
- AndroidManifest.xml:
该文件描述了应用的基本信息,如包名、版本、权限声明、组件(如活动、服务、广播接收器)等。它是应用的核心配置文件,定义了应用的结构和行为。 - classes.dex:
包含了应用的 DEX(Dalvik Executable) 字节码文件,Android 系统通过这些文件运行 Java 代码。这个文件保存了应用的编译代码。 - resources.arsc:
包含应用的所有资源的预编译版本,例如字符串、颜色、样式、布局等。 - res/ 文件夹:
这个文件夹包含应用的所有资源文件,比如图片、布局 XML 文件、动画等。 - assets/ 文件夹:
存储应用的原始资源文件,这些文件会以原始格式存储,并可以通过应用程序的AssetManager
访问。 - META-INF/ 文件夹:
这个文件夹包含与 APK 文件签名相关的信息。它包括签名证书和相关的验证文件,确保 APK 文件的完整性和来源可信度。 - lib/ 文件夹:
包含应用的原生库(通常是.so
文件,使用 C 或 C++ 编写),这些库针对不同的处理器架构(如 ARM、x86)进行编译。
APK 文件是 Android 应用的打包格式,包含了应用运行所需的所有代码、资源和配置文件。通过这个格式,开发者可以将 Android 应用打包并分发给用户进行安装和使用。
Smali 文件的结构
通常包含:
- 类声明:定义类名,访问修饰符,继承关系等。
- 字段:类的的成员变量
- 方法:类的方法及其具体的字节码实现
- 字节码指令:每个犯法的具体实现是由一系列 Smali 指令构成,
Smali 文件的特点
Smali
是Android
应用的反汇编语言,通常用于调试,反汇编工程或修改APK。它由多条指令构成,每条指令通过对应一段Java字节码的实现;这些指令直接操作寄存器,调用方法或执行其他任务
Smali 的应用场景
- 逆向工程和调试:通过查看和修改
Smali
字节码,开发者可以理解和修改应该程序的逻辑,尤其是在进行安全研究或修改应用行为时。 - 修改APK:修改
Android
应用的行为或去除某些限制(如广告或权限)时,往往需要通过Smali
进行字节码层面的修改。
Smali 和 ART 字节码的关系
ART
字节码和 Smali
不完全相同。Smali
是 DEX
字节码的可读形式,而 ART
字节码是针对目标设备 CPU
的机器代码,这部分是在应用运行时直接执行的
Smali
主要是 DEX 字节码 的一种反汇编表示,便于开发者对应用进行修改、调试或逆向工程。ART
则是Android
运行时的环境,它负责将Smali
中的DEX
字节码进行 AOT 编译,生成特定设备的机器代码,进而提升性能。
总结:
- Smali 是
Android
应用的字节码的反汇编版本,通常用于逆向工程和调试。 - ART 字节码 是
Android Runtime
环境下,将 DEX 字节码提前编译为机器代码后的格式,专为提高运行时性能设计