【Android】Android虚拟机

这篇具有很好参考价值的文章主要介绍了【Android】Android虚拟机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

虚拟机

Android的虚拟机主要有两种:Dalvik 虚拟机 ART(Android Runtime)虚拟机

Dalvik 虚拟机
Dalvik 虚拟机是 Android 早期使用的虚拟机,它基于寄存器架构。从Android 2.2版本开始,支持JIT即时编译(Just In Time)在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。Dalvik 执行的是经过转换优化后的 dex(Dalvik Executable)字节码文件,而不是传统的 Java 字节码。Dalvik 虚拟机针对移动设备的特点进行了优化,具有较小的内存占用和较高的执行效率。每个应用程序都在独立的 Dalvik 虚拟机实例中运行,实现了应用程序之间的隔离。

ART 虚拟机
自 Android 5.0(Lollipop)起,Android 引入了 ART 虚拟机作为默认的运行环境。ART 使用 Ahead-Of-Time(AOT)编译技术,将 dex 字节码在应用安装时预先编译成本地机器码,这样在运行时就无需再进行实时的字节码转换,提高了应用程序的启动速度和执行效率。与 Dalvik 不同,ART 的执行方式更接近于传统的 Java 虚拟机,采用基于堆栈的指令集

区别

基于寄存器的虚拟机

在基于寄存器的虚拟机中,将数据保存在寄存器中。虚拟寄存器可以看作是一个数组,用于存储局部变量、参数和临时变量等运行时数据。每个虚拟寄存器都有自己的编号,可以通过编号来访问和操作寄存器中的值。

在 Dalvik VM 中,每个线程都有自己的程序计数器(Program Counter,PC)和调用栈。程序计数器用于记录当前线程执行到的指令位置,而调用栈则用于保存方法调用的活动记录,每个活动记录称为一个帧(frame)。每个帧包含了方法的局部变量表和操作数寄存器等信息。

因此,对于基于寄存器的虚拟机来说,数据存放在寄存器中,虚拟寄存器是一个数组,保存在运行时栈中。每个线程都有自己的程序计数器和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。

基于栈的虚拟机

每个虚拟机运行时线程都有自己独立的栈。栈用来记录方法调用的历史,每当一个方法被调用时,就会在栈中创建一个新的栈帧(stack frame)。栈帧包含了方法的局部变量表、操作数栈以及一些额外的信息。

栈的顶部栈帧被称为当前栈帧,代表当前正在执行的方法。栈帧中的局部变量表用于存储方法中定义的局部变量和参数,而操作数栈用于执行方法中的操作。

基于栈的虚拟机通过操作数栈进行所有的指令操作。指令可以从操作数栈中取出操作数,执行相应的操作,然后将结果再次压入操作数栈中。这种基于栈的指令集设计简洁紧凑,并且不依赖于具体的硬件架构,因此能够实现较好的跨平台性。

方法执行完成或者遇到方法调用时,当前栈帧会被弹出,并且恢复到上一个栈帧,继续执行上一个方法。这样,通过不断创建和销毁栈帧,基于栈的虚拟机能够实现方法之间的无缝切换和控制流的管理。

总结起来,基于栈的虚拟机使用独立的栈来记录方法调用历史,每个栈帧代表一个方法的执行上下文,包含局部变量表和操作数栈。通过操作数栈进行指令操作,实现方法间的切换和控制流管理。这种设计具有简洁、紧凑和跨平台等特点。

Android程序安装优化

当一个应用在 Android 系统上被安装时,会根据所使用的运行时环境(Dalvik 或 ART)执行不同的优化过程。

Dalvik 虚拟机中,应用在安装过程中会进行一次优化,将应用的 dex 字节码转换为优化的可执行文件 odex(Optimized DEX)文件。这个优化过程由 dexopt 工具完成。dexopt 根据设备配置和系统策略,对 dex 文件进行字节码优化、预解析和预验证等操作,并生成 odex 文件。odex 文件包含了已经优化过的字节码以及相关的元数据信息,加速了应用运行时的加载和执行速度。

而在 ART(Android Runtime)中,引入了预先编译机制(Ahead Of Time Compilation)。在应用安装时,ART 使用设备自带的dex2oat工具将应用的 dex 字节码直接编译成本地机器码,也就是将应用的 dex 文件转换为 ELF(Executable and Linkable Format)可执行文件。这个编译过程可以发生在应用安装期间,也可以在应用首次运行时发生,具体取决于设备和系统策略。

通过将 dex 字节码编译为本地机器码,ART 提供了更高的应用执行性能和更低的内存占用。与 Dalvik 不同,ART 在应用运行时无需进行即时编译(Just-In-Time Compilation),而是直接执行本地机器码,提高了应用的响应速度和效率。

android 虚拟机,Android学习笔记,android文章来源地址https://www.toymoban.com/news/detail-730842.html

到了这里,关于【Android】Android虚拟机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android学习笔记 - Camera(1)

    在APP开发中会有很多业务使用到Camera,对于一些基础的功能,调用系统的拍摄功能就可以满足要求。但是需要自定义UI界面时,例如将摄像头捕获的视图展示在页面上的时候就需要使用到Camera这个类了。 本篇会介绍哪些知识点: 什么是SurfaceView?有什么作用?何为双缓冲机制

    2024年02月03日
    浏览(28)
  • 【Android】setContentView的学习笔记

    performLaunchActivity() ActivityThread.performLaunchActivity() 方法是 Android 系统中负责启动一个 Activity 的关键方法。 当调用 startActivity() 方法启动一个 Activity 时, ActivityThread 对象会接收到该请求,并调用 performLaunchActivity() 方法。 在 performLaunchActivity() 方法内部,首先会创建一个新的

    2024年02月15日
    浏览(26)
  • 【Android】APP启动优化学习笔记

    用户体验: 应用的启动速度直接影响用户体验。用户希望应用能够快速启动并迅速响应他们的操作。如果应用启动较慢,用户可能会感到不满,并且有可能选择卸载或切换到竞争对手的应用。通过启动优化,可以提高应用的启动速度,让用户获得更好的使用体验。 竞争优势

    2024年02月14日
    浏览(27)
  • 【Android学习笔记】事件监听机制详解

    两种事件处理机制 基于监听的事件处理 基于回调的事件处理 涉及到的三类对象 Event Source事件源,指各个组件。 Event 界面组件上发生的特定的事情,。 Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。 Event Handler事件处理器,当事件监听器捕获事件后,由响

    2024年02月11日
    浏览(47)
  • Android学习笔记 - 广播的注册与接收

    目录 一、简介 二、广播接收器的注册 广播是Android四大组件之一,是以intent为媒介在组件间进行传播数据的一种机制。 从整体来看,广播主要有三个动作和三个角色。三个动作包含“注册广播接收器”、“发送广播”和“接收广播”;三个动作包含发送方、接收方和中间人

    2023年04月23日
    浏览(77)
  • 【Android】底层逻辑深入了解(学习笔记)(未完)

    step by step. 目录 init启动 Zygote进程:  SystemServer处理过程 Binder: Launcher启动过程 Android系统启动流程 四大组件 Activity Service  BroadcastReceiver广播 ContentProvider内容提供者(进程内和进程间的数据共享)  Context上下文  AMS(ActivityManagerService) (在图书馆看了《Android进阶解密》,

    2024年02月15日
    浏览(28)
  • Android ContentProvider基础知识学习笔记

    1、动态申请权限 2、读取手机联系人 3、创建自己的ContentProvider (1) onCreate()。初始化ContentProvider的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回true表示ContentProvider初始化成功,返回false则表示失败。 (2) query()。从ContentProvider中查询数据。uri参数用于确定查

    2024年04月10日
    浏览(34)
  • 《Android 移动应用基础教程(Android Studio)(第2版)》【学习笔记】【2023春】【附源码】

    《Android 移动应用基础教程(Android Studio)(第2版)》黑马程序员 源代码 Android——六大基本布局总结/CSDN@小马 同学 【Android】线性布局(LinearLayout)最全解析/CSDN@Teacher.Hu 一个不错的计算器界面👇 Android Studio App LinearLayout多层布局嵌套/CSDN@pythontojava 一个简单的布局👇 Andro

    2024年02月01日
    浏览(31)
  • Android基础学习笔记8:常用布局 - 线性布局

    能说出安卓界面元素层次 能说出安卓常用的布局 能说出线性布局常用的属性 能利用线性布局实现简单的界面设计 能利用线性布局嵌套实现比较复杂的界面 应用界面包含用户可查看并与之交互的所有内容。安卓提供丰富多样的预置 UI 组件,例如结构化布局对象和 UI 控件,您

    2024年02月05日
    浏览(36)
  • Android Studio 学习笔记--LogCat的使用

    LogCat是Android中的命令行工具, 用于获取程序从启动到关闭的日志信息 。Android中的应用运行在一个单独的设备中,应用的调试信息会输出到这个设备单独的日志缓冲区中,要想从设备日志缓存区中取出信息,就需要学会使用LogCat Log类所输出的日志内容分为 6 个级别,由低到

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包