【问题标题】:Which kind of code in the process of android platfrom, Dalvik byte-codes or native machine code?android平台进程中的哪种代码,Dalvik字节码还是本机机器码?
【发布时间】:2017-08-30 03:05:51
【问题描述】:

我不太确定android平台上的linux进程中加载​​了哪种代码。

如果android采用Dalvik,进程中包含一个Dalvik VM和应用程序的代码,代码是Dalvik字节码的形式吗?如果是,代码是否和.apk文件中的classes.dex一样?

如果android采用Android Runtime (ART),由于classes.dex已经被翻译成native机器码,所以我认为app在Linux进程中的代码不会是Dalvik字节码,而是native机器码。如果我的理解是正确的,那么 Dalvik VM 是否仍然包含在进程中?

【问题讨论】:

  • Dalvik 已停产,ART 使用 AOT 编译,所以我假设二进制文件是原生的。
  • 意思是,你想知道采用ART之后Android使用什么VM,因为ART只是一个运行环境?
  • @AnkurSamarya 我想知道,如果使用 ART,VM 是否仍然需要。

标签: java android linux dalvik android-runtime


【解决方案1】:

从 Android 5.0(Lollipop)开始,Dalvik 已完全被 Android Runtime 取代(ART) ,它处理 native 二进制文件。

Verifying App Behavior on the Android Runtime

Android 运行时(ART) 是运行 Android 5.0(API 级别 21)及更高版本的设备的默认运行时


在安装时,ART 使用设备上的 dex2oat 工具编译应用程序。此实用程序接受 DEX 文件作为输入,并为 目标 设备生成一个已编译的应用可执行文件

更具体地说,Dalvik 提倡使用 odex 文件,这些文件是 dex 文件的预处理优化版本,供 Dalvik 解释或 JIT 编译。

ART 提倡使用 ELF 文件,这是一种通用格式,可指导将某些功能和对象链接到设备的本机指令,在安装时执行。

Wikipedia - Android Runtime

与 Dalvik 不同,ART 通过在安装时将整个应用程序编译为本机机器代码,引入了提前 (AOT) 编译的使用。


ART 使用与 Dalvik 相同的输入字节码,通过标准 .dex 文件作为 APK 文件的一部分提供,而 .odex 文件被替换为可执行和可链接格式 (ELF) 可执行文件。使用 ART 的设备上 dex2oat 实用程序编译应用程序后,它将仅从已编译的 ELF 可执行文件中运行

Executable and Linkable Format - Applications

Android 使用 ELF .so(共享对象)库作为 Java 原生接口。使用 Android Runtime (ART),自 Android 5.0 "Lollipop" 以来的默认设置,所有应用程序在安装时都会编译为原生 ELF 二进制文件

ART 不包含 Dalvik 的实例,虽然大部分是兼容的,但有人提到,Dalvik 支持的某些功能不受 ART 支持。

Verifying App Behavior on the Android Runtime

但是,一些适用于 Dalvik 的技术不适用于 ART。本文档让您了解在迁移现有应用程序以与 ART 兼容时需要注意的事项。大多数应用应该只在使用 ART 运行时才能工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多