本帖最后由 Amanda小黑 于 2016-3-9 15:49 编辑
Dalvik 虚拟机概述
Google 于 2007 年底正式发布了 Android SDK, Dalvik 虚拟机也第一次进入了我们的视野。
它的作者是丹·伯恩斯坦(Dan Bornstein) ,名字来源于他的祖先曾经居住过的名叫 Dalvik
的小渔村。Dalvik 虚拟机作为 Android 平台的核心组件,拥有如下几个特点:
1) 体积小,占用内存空间小;
2) 专用的 DEX 可执行文件格式,体积更小,执行速度更快;
3) 常量池采用 32 位索引值,寻址类方法名,字段名,常量更快;
4) 基于寄存器架构,并拥有一套完整的指令系统;
5) 提供了对象生命周期管理、 堆栈管理、 线程管理、 安全和异常管理以及垃圾回收等
重要功能;
6) 所有的 Android 程序都运行在 Android 系统进程里,每个进程对应着一个 Dalvik 虚
拟机实例。
Dalvik 虚拟机与 Java 虚拟机的区别
Dalvik 虚拟机与传统的 Java 虚拟机有着许多不同点, 两者并不兼容, 它们显著的不同点
主要表现在以下几个方面:
1) Java 虚拟机运行的是 Java 字节码,Dalvik 虚拟机运行的是 Dalvik 字节码;
2) Dalvik 可执行文件体积更小;
3) Java 虚拟机基于栈架构,Dalvik 虚拟机基于寄存器架构。
Smali 概述
我们都知道, Dalvik 虚拟机 (Dalvik VM) 是 Google 专门为 Android 平台设计的一套虚拟
机。区别于标准 Java 虚拟机 JVM 的 class 文件格式,Dalvik VM 拥有专属的 DEX 可执行文件
格式和指令集代码。smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器,反
汇编后 DEX 文件会产生.smali 后缀的代码文件,smali 代码拥有特定的格式与语法,smali 语
言是对 Dalvik 虚拟机字节码的一种解释。
Smali 语言起初是由一个名叫 JesusFreke 的 hacker 对 Dalvik 字节码的翻译,并非一种官
方标准语言,因为 Dalvik 虚拟机名字来源于冰岛一个小渔村的名字,JesusFreke 便把 smali
和 baksmali 取自了冰岛语中的 “汇编器” 和 “反编器” 。 目前 Smali 是在 Google Code 上的一
个开源项目。
虽然主流的 DEX 可执行文件反汇编工具不少,如 Dedexer、IDA Pro 和 dex2jar+jd-gui,
但 Smali 提供反汇编功能的同时, 也提供了打包反汇编代码重新生成 dex 的功能, 因此 Smali
被广泛地用于 APP 广告注入、汉化和破解,ROM 定制等方面。
APK 组成 ———————————————————————————————————————
|-- HelloWorld/
|-- AndroidManifest.xml 被编译成二进制的配置文件
|-- class.dex Android 可执行文件
|-- resources.arsc 被编译成二进制的主资源文件
|-- assets/ 不需编译的原始资源文件目录
|-- res/ 资源文件目录
|-- lib/ 库文件目录
|-- META-INF/ APK 的签名信息
———————————————————————————————————————
Dalvik 虚拟机字节码的类型、方法和字段的表示方法
Dalvik 字节码有两种类型,基本类型和引用类型。对象和数组是引用类型,其它都是基
本类型。
每个 Dalvik 寄存器都是 32 位大小, 对于小于或者等于 32 位长度的类型来说, 一个寄存
器就可以存放该类型的值, 而像 J、 D 等 64 位的类型, 它们的值是使用相邻两个寄存器来存
储的,如 v0 与 v1、v3 与 v4 等。 Java 中的对象在 smali 中以 Lpackage/name/ObjectName;的形式表示。前面的 L 表示
这是一个对象类型,package/name/表示该对象所在的包,ObjectName 是对象的名字,“;”
表示对象名称的结束。 相当于 java 中的 package.name.ObjectName。 例 如: Ljava/lang /String;
相当于 java.lang.String。
“[”类型可以表示所有基本类型的数组。[I 表示一个整型一维数组,相当于 java 中的
int[]。对于多维数组,只要增加[就行了,[[I 相当于 int[][],[[[I 相当于 int[][][]。注意每一维
的最多 255 个。对象数组的表示:[Ljava/lang /String;表示一个 String 对象数组。
方 法
方法调用的表示格式:Lpackage/name/ObjectName;->MethodName(III)Z。
Lpackage/name/ObjectName;表示类型,MethodName 是方法名,III 为参数(在此是 3 个整
型参数) ,Z 是返回类型(bool 型) 。函数的参数是一个接一个的,中间没有隔开。
一个更复杂的例子:method(I[[IILjava/lang /String;[Ljava/lang /Object;)Ljava/lang /String;
在 java 中则为:String method(int, int[][], int, String, Object[])
字 段
字段,即 java 中类的成员变量,表示格式:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String; 即包名, 字段名
和字段类型,字段名与字段类型是以冒号“:”分隔。
以上内容均来自互联网,楼主只负责收集和整理,希望对你们有帮助!! |