Android(Android Runtime,ART)如何加载dex文件; 什么是主dex? Android Runtime (ART) 和 Dalvik\ dex2oat

80 篇文章 1 订阅

主dex是apk中的哪个dex

主要 DEX 文件 (classes.dex)

当您构建应用时,Android 构建工具会根据需要构造主要 DEX 文件 (classes.dex) 和辅助 DEX 文件(classes2.dex 和 classes3.dex 等)。然后,构建系统会将所有 DEX 文件打包到 APK 中。
在运行时,MultiDex API 使用特殊的类加载器来搜索适用于您的方法的所有 DEX 文件,而不是只在主 classes.dex 文件中搜索。

JVM,Dalvik 和 ART

在明白什么是 Dex 文件之前,要先了解一下 JVM,Dalvik 和 ART。JVM 是 JAVA 虚拟机,用来运行 JAVA 字节码程序。Dalvik 是 Google 设计的用于 Android平台的运行时环境,适合移动环境下内存和处理器速度有限的系统。ART 即 Android Runtime,是 Google 为了替换 Dalvik 设计的新 Android 运行时环境,在Android 4.4推出。ART 比 Dalvik 的性能更好。Android 程序一般使用 Java 语言开发,但是 Dalvik 虚拟机并不支持直接执行 JAVA 字节码,所以会对编译生成的 .class 文件进行翻译、重构、解释、压缩等处理,这个处理过程是由 dx 进行处理,处理完成后生成的产物会以 .dex 结尾,称为 Dex 文件。Dex 文件格式是专为 Dalvik 设计的一种压缩格式。所以可以简单的理解为:Dex 文件是很多 .class 文件处理后的产物,最终可以在 Android 运行时环境执行。

Android Runtime (ART) 和 Dalvik

Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。

ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。不过,Dalvik 采用的一些技术并不适用于 ART。有关最重要问题的信息,请参阅在 Android 运行时 (ART) 上验证应用行为。

ART 功能

以下是 ART 实现的一些主要功能。

预先 (AOT) 编译

ART 引入了预先编译机制,可提高应用的性能。ART 还具有比 Dalvik 更严格的安装时验证。

在安装时,ART 使用设备自带的 dex2oat 工具来编译应用。此实用工具接受 DEX 文件作为输入,并为目标设备生成经过编译的应用可执行文件。该工具应能够顺利编译所有有效的 DEX 文件。但是,一些后处理工具会生成无效文件,Dalvik 可以接受这些文件,但 ART 无法编译这些文件。如需了解详情,请参阅处理垃圾回收问题。

垃圾回收方面的优化

垃圾回收 (GC) 会耗费大量资源,这可能有损于应用性能,导致显示不稳定、界面响应速度缓慢以及其他问题。ART 通过以下几种方式对垃圾回收做了优化:

  • 大多采用并发设计,具有一次 GC 暂停
  • 并发复制,可减少后台内存使用和碎片
  • GC 暂停的时间不受堆大小影响
  • 在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短
  • 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见

开发和调试方面的优化

ART 提供了大量功能来优化应用开发和调试。

在 Android Runtime (ART) 中验证应用行为

Android Runtime (ART) 是运行 Android 5.0(API 级别 21)及更高版本的设备的默认运行时。此运行时提供大量功能,可提升 Android 平台和应用的性能和流畅度。如需了解关于 ART 新功能的更多信息,请参阅 ART 简介。
不过,部分适合 Dalvik 的技术并不适用于 ART。本文档可帮助您了解在迁移现有应用,使其与 ART 兼容时需要注意的事项。大多数应用在通过 ART 运行时都能正常工作。

解决垃圾回收 (GC) 问题

在 Dalvik 中,应用时常发现显式调用 System.gc() 有助于促进垃圾回收 (GC)。而在 ART 中,这种做法显得没那么必要,尤其是当您需通过垃圾回收来预防出现 GC_FOR_ALLOC 类型或减少碎片时。您可以通过调用 System.getProperty(“java.vm.version”) 来验证正在使用哪种运行时。如果使用的是 ART,则该属性值应为 “2.0.0” 或更高。

而且,Android 开源项目 (AOSP) 中正在开发一种紧凑型垃圾回收器,旨在改善内存管理。因此,您应避免使用与紧凑型 GC 不兼容的方法(例如保存对象实例数据的指针)。对于使用 Java 原生接口 (JNI) 的应用而言,这一点尤其重要。如需了解详细信息,请参阅预防 JNI 问题。

预防 JNI 问题

ART 的 JNI 比 Dalvik 的 JNI 更为严格一些。使用 CheckJNI 模式来捕获常见问题是一种特别实用的方法。如果您的应用使用 C/C++ 代码,则您应阅读以下文章:
使用 CheckJNI 调试 Android JNI

错误处理

ART 的 JNI 会在多种情况下抛出错误,而 Dalvik 则不然。(同样,您可以通过使用 CheckJNI 执行测试,以捕获大量此种情况)。
例如,如果使用不存在的方法(可能 ProGuard 等工具已移除该方法)调用 RegisterNatives,ART 现可正确抛出 NoSuchMethodError:

如果不使用任何方法调用 RegisterNatives,ART 也会记录错误(在 logcat 中可见):

此外,JNI 函数 GetFieldID() 和 GetStaticFieldID() 现可正确抛出 NoSuchFieldError,而不是仅返回 null。同样,GetMethodID() 和 GetStaticMethodID() 现可正确抛出 NoSuchMethodError。如此一来,CheckJNI 可能会因未处理的异常或抛给 Java 原生代码调用函数的异常而失败。因此,使用 CheckJN 模式测试 ART 兼容型应用便显得格外重要。

dex2oat

什么是dex2oat

Dex2oat (dalvik excutable file to optimized art file) ,是一个对 dex 文件进行编译优化的程序。

为什么要进行dex2oat转换?

众所周知, Android 虚拟机可以识别的是dex文件,应用使用过程中如果每次将dex文件加载进行内存,解释性执行字节码,效率会很低, 严重影响用户体验。通过dex2oat 优化后, 可以在系统运行之前利用合适的时机将dex文件字节码提前转化为虚拟机可以执行运行的机器码,后续直接从效率更高的机器码中运行,则运行阶段更加流畅,优化用户体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学知识拯救世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值