Android安全与逆向之Java虚拟机和Dalvik虚拟机的区别

Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。 依赖于底层Posix兼容的操作系统,它可以简单的完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例, 其代码在虚拟机的解释下得以执行。 
很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同:


Java虚拟机运行的是Java字节码,生成的字节码文件也就是class文件(class文件:二进制处理过的文件),然后再由java虚拟机去执行编译运行过程。而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。
在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文 件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的 CLASS文件转换成一个.dex文件(dex文件是压缩成zip文件,这样可以减少占用空间),而后Dalvik虚拟机会从其中读取指令和数据。
Dalvik和Android系统Android作为新一代的基于Linux的开源手机操作系统,其系统架构由下而上可以分为以下几部分:


1)Linux内核


2)本地库


3)Android运行库


4)应用框架


5)应用    


Dalvik VM (Android虚拟机),它可以支持已转换为.dex(即Dalvik Exacutable)格式的java应用程序。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。


每一个Android应用都运行在一个Dalvik VM实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制、内存分配和管理、Mutex等都是依赖底层操作系统实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多依赖操作的线程调度和管理机制。


   


 


 java虚拟机:                                  


  java虚拟机                                
  java虚拟机基于栈。                    
  java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)
 

Dalvik虚拟机:

基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的

Dalvik运行的是自定义的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据)
  常量池已被修改为只使用32位的索引,以 简化解释器。dalvik的堆和栈的参数可以通过-Xms和-Xmx更改
  一个应用,一个虚拟机实例,一个进程(所有android应用的线程都是对应一个linux线程,都运行在自己的沙盒中,不同的应用在不同的进程中运行。每个android dalvik应用程序都被赋予了一个独立的linux PID(app_*))
 


 

Dalvik和标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器,而JVM基于栈。Dalvik基于寄存器指令体大,但是指令不多。JVM指令体小,但是指令多。
Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。
(1)虚拟机很小,使用的空间也小;
(2)Dalvik没有JIT编译器;
(3)常量池已被修改为只使用32位的索引,以简化解释器;
(4)它使用自己的字节码,而非Java字节码。
 备注:


JIT编译器,英文写作Just-In-Time Compiler,中文意思是即时编译器。
JIT编译器能够将MSIL编译成为各种不同的机器代码,以适应对应的系统平台,最终使得程序在目标系统中得到顺利地运行。
Dalvik虚拟机架构:


     在android源码中,Dalvik虚拟机的实现位于“dalvik/”目录下,其中“dalvik/vm”是虚拟机的实现部分,将会编译成libdvm.so;而"dalvik/libdex"将会编译成libdex.a静态库作为dex工具;“dalvik/dexdump”是.dex文件的反编译工具;虚拟机的可执行程序位于“dalvik/dalvikvm”中,将会编译成dalvikvm可执行文件。


  dalvik虚拟机架构:


 Dalvik进程管理:


         dalvik进程管理是依赖于linux的进程体系结构的,如要为应用程序创建一个进程,它会使用linux的fork机制来复制一个进程(复制进程往往比创建进程效率更高)。


         Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,它通过init进程启动。首先会孵化出System_Server(android绝大多系统服务的守护进程,它会监听socket等待请求命令,当有一个应用程序启动时,就会向它发出请求,zygote就会FORK出一个新的应用程序进程).每当系统要求执行一个android应用程序时,Zygote就会运用linux的FORK进制产生一个子进程来执行该应用程序。


        每当执行一个Android应用程序,Zygote就会孵化一个子线程去执行该应用程序(系统内部执行dvz指令完成的)。这样做的好处是显而易见的,Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速地提供一个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,这样可以大大节省内存开销。


       相对于基于堆栈的虚拟机实现,基于寄存器的虚拟机实现虽然在硬件通用性上要差一些,但是它在代码的执行效率却更胜一筹。在基于寄存器的虚拟机中,可以更加有效地减少多余指令的分发和减少内存的读写访问。


 


 


 JVM和Dalvik进程管理:


        linux中进程间通信的方式有很多,但是dalvik使用的是信号方式来完成进程间通信。


 


Android的初始化流程:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?

一个多月前,Apple 发布了 2019 款 MacBook Air 和 MacBook Pro,经过这一次的更新之后,MacBook 产品线总算变得更加清晰了,同时也减少了之前存在的价格和定位产生冲突的现象。不过从购买决策来看,我发现还是有些问题难倒…

只要300页!火遍全网的NET6+linux知识手册!拿走不谢!

这是微软公司基于最新的.net 6编写,循序渐进地对.net6/C#10进行讲解。对于零基础可以作为.net的快速入门教材,对于高级程序员而言,这也是你的进阶之路!NO.1资料介绍该手册,全面的介绍.net6和c#的新特性,看完这个资料&a…

Linux0.11内核剖析--内核体系结构

一个完整可用的操作系统主要由 4 部分组成:硬件、操作系统内核、操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序、 Internet 浏览器程序或用户自行编制的各种应用程序; 操作系统服务程序是指那些向用户所…

centos 6安装报错

Missing ISO 9660 imageThe installer has tried to mount image # 1. but cannot find it on the hard drive.Please copy this image to the drive and click Retry. Click Exit to abort the installation. 这个是安装过程中你没有把iso镜像拷贝到你的U盘所导致!…

ubuntu上最使用jni最简单易懂的例子

第一步:爆结果照,让你有坚持下去的信心 二、NDK解释 NDK全称:Native Development Kit。 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的m…

buck变换器设计matlab_一种用于Boost PFC变换器的改进关断时间控制策略

随着我国工业的发展,越来越多的非线性负荷接入电网,各种换流设备的使用,使电网的电压波形发生畸变,造成电能质量下降,威胁电网和各种用电设备的安全、经济运行。为了能够确保电网安全,研制出了各种PFC变换器…

你初吻啥时候没有的​?​

1 ???(素材来源网络,侵删)▼2 世界上最难受的三件事(via.惨绿少年金三坨,侵删)▼3 漏网之鱼▼4 有哪里不太对劲?(素材来源网络,侵删…

乡亲们,我们创建了 Dapr 中文交流频道

我们创建了 Dapr 中文交流 QQ 频道,欢迎大家加入!加入方式在文章最后一节。为什么要创建频道? 解决什么问题**专业性,“你可以在我们群里面钓鱼,因为都是水”** 你肯定加过非常多的这种叫什么技术交流群。你会发现这个…

Maven搭建SpringMVC+Mybatis项目详解【转】

为什么80%的码农都做不了架构师?>>> 前言 最近比较闲,复习搭建一下项目,这次主要使用SpringSpringMVCMybatis。项目持久层使用Mybatis3,控制层使用SpringMVC4.1,使用Spring4.1管理控制器,数据库…

IOS 代码块

1.关系式表示 <returnType>(^BlockName)(list of arguments)^(arguments){body;}; 转载于:https://www.cnblogs.com/keithmoring/p/4077686.html

web前端url传递值 js加密解密

一&#xff1a;Js的Url中传递中文参数乱码问题&#xff0c;重点&#xff1a;encodeURI编码&#xff0c;decodeURI解码&#xff1a; 1.传参页面Javascript代码&#xff1a; <script type”text/javascript”>// <![CDATA[ function send(){ var url "test01.html…

Linux下最简单的修改文件名后缀的命令行技巧

在linux上面一直没有找到好的修改文件的方法&#xff0c;今天找到了一个 mv file.{cpp,c} 上面的意思就是说把文件file结尾为cpp改成c文件格式 看下图 &#xfeff;&#xfeff;

python123可以复制粘贴吗_使用win32com和python复制和粘贴隔离

有没有办法使用python和win32com进行复制和粘贴,以便python脚本可以在后台运行而不会弄乱“用户”复制和粘贴功能&#xff1f; from win32com.client import Dispatch import win32com.client xlApp Dispatch("Excel.Application") xlWb xlApp.Workbooks.Open(file…

mongoDB 高级查询之取模查询$mod

http://hancang2000.i.sohu.com/blog/view/235140698.htm$mod取模运算查询age取模10等于0的数据db.student.find( { age: { $mod : [ 10 , 1 ] } } )举例如下:C1表的数据如下:> db.c1.find(){ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age…

如何在并发中给 HttpClient 设置不同的超时时间?

咨询区 boot4life为了能够复用 HttpClient 所打开的TCP链接&#xff0c;我不得不让所有的request共享一个单例&#xff0c;但问题来了&#xff0c;如果我简单的在每一次request之前修改 timeout 属性的话&#xff0c;会存在下面两个问题。线程不安全。并发时可能会错用到其他 r…

实时事件日志记录和聚合的平台——Sentry

不管你用什么编程语言&#xff0c;都会面临如何处理错误日志的问题。很多程序员对错误日志放任自流&#xff0c;直到出现故障了才追悔莫及&#xff0c;如果问小编怎么办&#xff0c;我会给你推荐 Sentry&#xff01;什么是Sentry&#xff1f;无论测试如何完善的程序&#xff0c…

如何在html里加入验证码_如何把crc校验加入到对应的程序里?看高手怎么做

我们现在已经搞清楚了crc校验的算法&#xff0c;本文我就向大家具体讲解一下如何把crc校验加入到我们的程序里。1 、crc校验使用原理crc校验在程序中运行的原理主要可以分为以下几步。第一步&#xff1a;主站发送数据前把要发送的数据进行crc校验&#xff0c;将要发送的数据和c…

Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)

&#xfeff;&#xfeff;1、Dalvik虚拟机架构和Java虚拟机的架构不同 1、Java虚拟机基于栈结构&#xff0c;需要频繁从栈读取或写入数据&#xff0c;这个过程需要更多的指令与内存访问次数&#xff0c;会消耗cpu时间 2、Dalvik虚拟机基于寄存器&#xff0c;数据访问通过寄存器…