博客
关于我
深入理解Android虚拟机及编译系统
阅读量:368 次
发布时间:2019-03-04

本文共 1985 字,大约阅读时间需要 6 分钟。

从源代码到安装文件:Android应用程序的运行机制

作为一名有几年Android开发经验的程序员,我一直对Android应用程序从源代码到安装文件的整个过程感到好奇。经过一番研究,我逐渐了解到,这个过程涉及Java虚拟机、Android运行时、编译流程等多个技术层面。下面,我将从多个角度为大家详细解析这个过程。

虚拟机技术:跨平台开发的关键

在移动开发中,虚拟机技术扮演着至关重要的角色。不同设备的CPU架构(如ARM、x86等)存在差异,这使得直接编译和运行程序变得复杂。虚拟机通过提供一层抽象层,允许程序在虚拟环境中运行,从而实现跨平台兼容。

现代虚拟机通常采用解释执行和即时编译相结合的方式。Interpreter在运行时解释字节码,而JIT则将热点代码即时编译为机器码,以提高执行效率。这种设计使得虚拟机能够在不同的硬件平台上高效运行。

Java字节码与Android运行时

Java语言的独特之处在于其虚拟机层的存在。Java代码经过编译生成字节码(ByteCode),运行在JVM上。然而,Android开发引入了新的变数——Dalvik字节码和Android Runtime(ART)。

Dalvik字节码是JVM字节码的子集,基于寄存器架构,而ART则在其基础上进行了优化。ART通过AOT(ahead of time)技术,将Dex文件预编译为Oat文件,从而提升了应用的运行效率。这种设计特别适合移动设备的资源受限环境。

Android应用程序的编译流程

一个Android应用程序从源代码到最终的APK文件,经历了多个编译步骤。以下是详细的流程:

  • 资源编译:使用AAPT工具将资源文件(如布局、图片、字符串等)打包编译,并生成R.java文件。
  • Java代码编译:通过javac工具将.java源代码编译为.class字节码文件。
  • Dex编译:将.class字节码转换为Dalvik字节码,生成.dex文件。
  • APK打包:将编译后的资源和.dex文件打包,生成APK文件。
  • 这个过程确保了应用程序能够适应不同的Android版本和设备配置。

    Android应用程序的运行流程

    Android应用程序的运行流程分为两种情况:基于Dalvik运行时和基于ART运行时。

    Dalvik运行时下的启动流程

    在Dalvik运行时下,应用程序的启动和运行经历了以下步骤:

  • 解释执行:首次启动时,虚拟机通过Interpreter解释执行Dex文件,生成机器码。
  • 热点探测:在运行过程中,虚拟机监测代码的热点部分,并使用JIT将其编译为机器码以提高效率。
  • Dalvik运行时的 Interpreter 模式虽然启动快,但执行效率较低。Android 2.2之后引入了JIT技术,显著提升了运行效率。

    ART运行时下的优化

    为了解决Dalvik运行时的性能问题,Google提出了ART运行时。ART采用AOT技术,在应用安装时预编译Dex文件为Oat文件,减少运行时的解释执行开销。这种方式虽然增加了安装时间,但提升了应用的运行效率。

    ART运行时的优化策略包括:1. 首次启动时使用Interpreter解释执行。2. 监测热点代码并使用JIT编译。3. 在空闲时间(如充电时)使用AOT预编译热点代码。4. 预编译后的Oat文件直接运行,提升应用启动和运行效率。

    这种多层次的优化策略使得ART运行时在资源受限的移动设备上表现更优。然而,预编译过程增加了存储空间需求,同时可能带来安装时间的延长。

    Android编译器:从Dex到Oat的转换

    Android编译器负责将Java字节码转换为Dalvik字节码,并在ART运行时下进一步优化。Dex编译器的核心任务是确保应用程序能够适应不同版本的Android系统。

    为了支持最新的Java语言特性和API,Dex编译器需要进行脱糖处理。例如,Kotlin语言无需脱糖,而Java语言则需要将语法糖转换为传统Java代码。最新的Dex编译器(如D8和R8)能够更高效地完成脱糖和优化任务。

    D8与R8:Dex编译器的新一代

    D8是Android最新的Dex编译器,集成了脱糖和优化功能,能够更高效地将Java字节码转换为Dalvik字节码。R8则是在D8基础上的高级执行模式,进一步优化了字节码生成过程。

    R8在生成Dalvik字节码时,会根据设备的虚拟机版本和API版本进行适配,确保兼容性。这解决了不同设备版本之间的兼容性问题,是对开发者和用户都有利的优化。

    总结

    从源代码到安装文件,从运行到优化,Android应用程序的整个生命周期涉及多个技术层面。理解这些机制有助于开发者更好地优化应用性能和兼容性。通过学习虚拟机技术、编译流程和运行时优化策略,开发者可以更高效地开发和维护Android应用程序。

    转载地址:http://xlee.baihongyu.com/

    你可能感兴趣的文章
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>
    Node-RED中使用JSON数据建立web网站
    查看>>
    Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>