注意点

首先,让我们来思考下面几个问题:

什么是Dalvik虚拟机?

Dalvik VM与JVM有什么区别?

Dalvik VM有什么新的特点?

Dalvik VM的架构是怎么样的?

首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息。

Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它有自己完善的硬件架构(如处理器、堆栈、寄存器等),还具有相应的指令系统。使用“Java虚拟机”程序就是为了支持与操作系统无关、在任何系统中都可以运行的程序。

因此,我们不妨对Dalvik虚拟机作出这样的描述:

Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

与Dalvik虚拟机关系最密切的非JVM莫属,在Android源码readme文档中有这样一段话:Much of the code under this directory originally came from the Apache Harmony project, and as such contains the standard Apache header comment. Some of the code was written originally for the Android project…

Dalvik VM与Apache Harmony 项目关系源远流长,因此,与JVM关系自然就密切了。

然而:Dalvik VM ≠Java VM

dalvik基于寄存器,而JVM基于stack

Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。

优势:1、在编译时提前优化代码而不是等到运行时

    2、 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例。

3、常量池已被修改为只使用32位的索引,以 简化解释器

JVM的字节码主要是零地址形式的,概念上说JVM是基于栈的架构。Google Android平台上的应用程序的主要开发语言是Java,通过其中的Dalvik VM来运行Java程序。为了能正确实现语义,Dalvik VM的许多设计都考虑到与JVM的兼容性;但它却采用了基于寄存器的架构,其字节码主要是二地址/三地址的混合形式。

基于栈与基于寄存器的架构,谁更快?现在实际的处理器,大多都是基于寄存器的架构,从侧面反映出基于寄存器比基于栈的架构更与实际的处理器接近。但对于VM来说,源架构的求值栈或者寄存器都可能是用实际机器的内存来模拟的,所以性能特性与实际硬件又有不同。一般认为基于寄存器架构的Dalvik VM比基于栈架构JVM执行效率更高,原因是:虽然零地址指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派(instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完成操作,指令分派与内存访问次数都较少。

转载于:https://www.cnblogs.com/Tesi1a/p/7624131.html

Android软件安全与逆向分析之Dalvik相关推荐

  1. Android软件安全与逆向分析下载电子书pdf下载

    Android软件安全与逆向分析下载链接: https://pan.baidu.com/s/1RB8tYECoGXwNh6_vlVV8sw 提取码获取方式:关注下面微信公众号,回复关键字: 1124

  2. 专访丰生强:Android软件安全与逆向分析

    [专家简介]   丰生强(@非虫)   Android软件安全专家:看雪论坛Android安全版版主,安卓巴士开发进阶板块版主.对Android软件与系统安全有狂热的爱好和独到的见解,对Android ...

  3. Android软件安全与逆向分析笔记

    Dalvik虚拟机概述 Google于2007年年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野.它的作者是丹·伯恩斯坦(Dan Bornstein),名字来源于他的祖 ...

  4. 《Android 软件安全与逆向分析》---- 学习笔记

    非虫大神的这本书,虽然比较老,但是思路可以参考,决定花几天时间看完,整理下学习的问题点再针对性的查漏补缺. 一.Window 环境搭建 因为书籍的方式已经比较老,不适应于目前的开发,提炼需要安装的软件 ...

  5. 有趣的二进制_软件安全与逆向分析

    有趣的二进制_软件安全与逆向分析 [日] 爱甲健二/著 周自恒/译 链接: https://pan.baidu.com/s/1mJKG01xq7gVYcTQmZL3Z_A 提取码: gmp2 都是买的 ...

  6. android app逆向分析,如何开始对Android应用的逆向分析?

    本文是我的关于如何开始Android逆向系列文章的第一部分.在文末提供了一个文档,你可以根据该文档说明部署同我一样的实验环境. 在了解android应用的逆向之前,你必须对android平台及其架构和 ...

  7. android逆向分析有什么用,如何开始对Android应用的逆向分析?

    本文是我的关于如何开始Android逆向系列文章的第一部分.在文末提供了一个文档,你可以根据该文档说明部署同我一样的实验环境. 在了解android应用的逆向之前,你必须对android平台及其架构和 ...

  8. 某android广告SDK逆向分析总结

    分析过程就不讲故事了,只说结论性的东西 0. 一张图胜过千言万语 1.  核心代码加密隐藏 该广告SDK即图中A.jar,使用时import进来即可.A.jar基本都是proxyfunction,核心 ...

  9. android逆向笔记,Android逆向分析笔记(1)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在读<Android软件安全与逆向分析>,虽然不从事逆向研究的工作,但作为一名Android开发者,觉得 ...

最新文章

  1. Go 中切片索引与 Python 中列表索引的差异
  2. vim插件的安装方式 -- vim注释插件和doxygen函数注释生成插件-ctrlp插件-tabular等号对齐 插件...
  3. scala入门-05继承类(extends)的使用
  4. Swift WKWebView读取本地html
  5. timer数据库总显示连接不上服务器,asp.net 上传服务器后,MSSQL数据库连接问题
  6. 【Elasticsearch】Limit of total fields [1000] in index [xxxxxx_index] has been exceeded
  7. ASP.NET的页面生存周期 [转]
  8. MCE公司:新型 EGFR 小分子抑制剂(克服 L858R/T790M 突变)的发现
  9. vue+d3实现横向树状图(节点使用矩形图展示信息)
  10. DL之RNN:人工智能为你写歌词(林夕写给陈奕迅)——基于TF利用RNN算法实现【机器为你作词】、训练测试过程全记录
  11. 计算机的单位换算字节,关于计算机的存储字节单位换算和使用
  12. 微信网页分享(配合微信公众平台)
  13. 给一个不多于5位的正整数,要求: 1.求出它是几位数; 2.分别输出每一位数字; 3.按逆序输出各位数字;
  14. 大学计算机基础方案一,《大学计算机基础》实验实施方案-学生用汇.docx
  15. 【无标题】Hadoop HA文件参数配置和HA启动
  16. oracle表删除提示对象不存在,查询表结构报“ORA-04043: 对象XXX不存在”解决-Oracle...
  17. linux mint安装账户,如何安装和配置Linux Mint的
  18. ios备忘录下载安卓版_苹果备忘录app下载-苹果备忘录 安卓版v2.0-PC6安卓网
  19. citrify免费在线图片处理云软件
  20. window10下Oracle 12c详细安装教程

热门文章

  1. solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中
  2. java内存模型 创建类_JVM内存模型及String对象内存分配
  3. 阶乘因式分解(一) -- ACM解决方案
  4. C++ 文件读写操作01
  5. Linux系统编程---6(信号的机制,信号4要素,Linu常规信号表,定时器)
  6. 比较zImage和uImage的区别
  7. 求序列第K大算法总结
  8. Ubuntu软件更新失败
  9. 【数字逻辑入门】计算机如何存储1位二进制数
  10. 1002. 写出这个数 (20)