文档章节

《逆向分析》 Android Dalvik虚拟机

k
 kim366
发布于 2016/05/13 19:10
字数 1171
阅读 16
收藏 0

       Dalvik虚拟机的特点--Android应用程序的运行原理

        

       虚拟机特点:

               # 体积小,占用内存空间小

               # 专有的DEX可执行格式,体积更小,执行速度更快

               # 常量池采用32位索引值,寻址方法名,字段名,常量更快

               # 基于寄存器架构,并有一套完整的指令系统

               # 提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能

               # 所有的Android程序都运行在Android系统进程里,每个进程对应着一个Dalvik虚拟机实例  


       Dalvik虚拟机与Java虚拟机的区别

               1. Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码。

                传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序 。而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中。Dalvik虚拟机通过解释DEX文件来执行这些字节码。

                2. Java虚拟机与Dalvik虚拟机架构不同

                Java虚拟机基于栈架构。程序在运行时,需要频繁地从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会消耗不少CPU时间,对于像手机设备资源有限的设备来说,这是相当大的一笔开销。

                Dalvik虚拟机基于寄存器架构。数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。

                对于Java程序而言,每个线程在执行时,都有一个PC计数器与一个Java栈。PC计数器以字节为单位记录当前运行位置距离方法开头的偏移量,它的作用类似于ARM架构CPU的PC寄存器与x86架构CPU的IP寄存器,不同的是PC计数器只对当前方法有效,Java虚拟机通过他的值来取指令执行。Java栈用于记录Java方法调用的“活动记录”,Java栈以帧为单位保存线程运行的状态,每调用一个方法,就会分配一个新的栈帧压入Java栈上,每从一个方法返回,则弹出并撤销相应的栈帧,每个栈帧包括局部变量区,求值栈和其他一些信息,局部变量区用于存储方法的参数和局部变量,其中参数按源码中从左到右的顺序保存在局部变量开头的几个slot中。求值栈用于保存求值的中间结果和调用别的方法的参数等。

                Dalvik虚拟机运行时,同样为每个线层维护一个PC计数器和调用栈,与Java虚拟机不同的是,这个调用栈维护一份寄存器列表,寄存器的数量在方法结构体的register字段中给出,Dalvik虚拟机会根据这个值来创建一份虚拟的寄存器列表

                由此可见,给予寄存器架构的Dalvik虚拟机与基于栈架构的Java虚拟机相比,由于生成的代码指令少了,程序执行速度会更快一些。


        Dalvik虚拟机是如何执行程序的

        Android系统的架构采用分层的思想,这样的好处是减少各层之间的依赖性,便于独立分发,容易收敛问题和错误等优点。Android系统优Linux内核,函数库,Android运行时,应用程序框架和应用程序组成。Dalvik虚拟机属于Android运行时环境,它与一些核心库共同承担Android应用程序的运行工作。

        Android系统启动加载完内核后,第一个执行的是init进程,init进程首先要做的是设备的初始化工作,然后读取inic.rc文件并启动系统中的重要外部程序zygote。zygote进程是Android所有进程的孵化器进程,它启动后会首先初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令。当执行一个Android应用程序时,system_server进程通过socket方式发送命令给Zygote,Zygote收到命令后通过fork自身,创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。

 

本文转载自:http://blog.csdn.net/oyangyujun/article/details/48062311

共有 人打赏支持
k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
私信 提问
Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。 而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 什么是and...

天王盖地虎626
01/12
0
0
进入Android Dalvik虚拟机之Dalvik虚拟机的特点

Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野。它的作者是丹.伯恩斯坦(Dan Bornstein)。Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点: 体...

柳哥
2015/01/08
0
0
android -------- java虚拟机和Dalvik虚拟机

java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚...

切切歆语
2018/04/29
0
0
[学习笔记一]、Android体系与系统架构

1、Android系统架构 2、Linux Linux层,Android最底层最核心的部分。我们打款手机Setting,选择about phone选项,这一选项所显示的内核版本,就是我们所用的Linux内核的版本。 Linux层包含了A...

2tman
2015/11/20
0
0
Android程序是以独立的用户身份运行的吗?

正在阅读《Andoird - 移动开发一本就够》,作者在介绍Android系统的时候,画了一张Android体系结构的图表:每个Android App运行的时候都会创建一个Dalvik虚拟机实例,每一个Dalvik虚拟机实例...

虫虫
2011/09/27
847
4

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部