dex & oat & ELF & art

dex - Android平台上可执行文件的类型。
    对于Android DEX文件进行优化,需要注意的一点是DEX文件的结构是紧凑的,但是我们还是要想方设法的进行提高程序的运行速度,我们就仍然需要对DEX文件进行进一步优化。
调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域 验证DEX文件中的所有类 对一些特定的类进行优化,对方法里的操作码进行优化 。优化后的文件大小会有所增加,应该是原Android DEX文件的1-4倍。 优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。
这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。
每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。
所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。
不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。
Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时。
Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件)。
而后通过工具软件DX把所有的字节码文件转成Android DEX文件(classes.dex)。最后使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件(二进制格式)组合成一个应用程序包(APK)。应用程序包可以被发布到手机上运行。

-- 来自百度百科
链接:http://blog.youkuaiyun.com/kakaxi1o1/article/details/46867539

oat:
OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。APK在安装的过程中,会通过dex2oat工具生成一个OAT文件。这使得我们无需重新编译原有的APK就可以让它正常地在ART里面运行,也就是我们不需要改变原来的APK编程接口。oat 文件在 /data/dalvik-cache/*@classes.dex。

ELF
  elf是一种文件格式,用于存储Linux程序. 它内部都有一些什么信息呢?大概包括编制好的计算机指令,数据,计算机在需要的时候把这个文件读取到内存中,cpu就可以从内存中一条一条的读取指令来执行了。
-- elf格式分析  http://blog.youkuaiyun.com/hhhbbb/article/details/6855004
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format


ART
Kitkat最令人兴奋、却也最少见诸报端的特性之一就是ART,这个处于试验阶段的最新运行时。Google并没有发布太多有关ART的信息(http://goo.gl/9Jzgdo),尽管事实上它已经出现了。然而,我觉得这个特性可能对未来的发布产生巨大的影响,因为有了ART后Android将不再理会执行过的dalvik字节码,转而使用一种平台特有的、提前编译(AOT,ahead-of-time)二进制码。

Dalvik虚拟机遵循传统Java虚拟机的运行方式:源码编译成平台无关的字节码,随后字节码立即编译成机器码(JIT-Just in time编译)。ART使用了另一种实现方式:它使用AOT范例将代码编译成前期执行的本地代码。但是,这是如何实现的呢?

鉴于在Android市场上基于当前三大不同的体系结构(MIPS,x86,ARM)催生了多种多样的平台,应用程序之间相互可移植性(inter-portability)变得十分重要。他们不得不找到一种方式整合两个世界:互相可移植性和执行本地二进制代码。就目前所知,他们的解决方案在移动领域是独一无二的:将中间字节码装运成可执行代码,然后在目标设备上执行最后的编译步骤——“提前编译”。

对ART进一步的观察显示:他们在最后的编译步骤中使用了LLVM。这种对本地代码的编译处理过程在安装应用时可以流畅地完成。

除此之外,Android小组还面临着一个额外的挑战:兼容业已存在的Dalvik虚拟机/DEX技术。为了处理这个问题,他们引入了一种把dex格式转变成新的oat格式的方法。

-- http://www.importnew.com/8822.html
http://blog.youkuaiyun.com/luoshengyang/article/details/39307813
http://blog.youkuaiyun.com/luoshengyang/article/details/39256813
http://blog.youkuaiyun.com/zylc369/article/details/39452053
http://blog.youkuaiyun.com/cosmoslhf/article/details/40380559
<think>好的,我现在需要解释一下dex2oat的过程。首先,我得回忆一下Android系统的编译机制,尤其是ARTAndroid Runtime)的相关知识。dex2oatART中的一个重要工具,用于将DEX字节码转换为本地机器码,这个过程叫做AOT(Ahead-Of-Time)编译。不过,用户可能想了解具体的步骤、作用以及优化点。 首先,我要明确dex2oat的作用。它负责在应用安装时将DEX文件编译成OAT文件,这样应用运行时可以直接执行本地代码,提高性能。需要分步骤说明这个过程:输入是什么,处理过程,输出是什么。可能还需要提到不同的编译模式,比如AOT、JIT、解释模式的区别。 接下来,用户可能关心dex2oat如何优化代码。比如,方法内联、死代码删除、寄存器分配等优化技术。此外,可能需要提到dex2oat的触发时机,比如安装时、OTA后,或者系统启动时的优化。 然后,需要解释OAT文件的结构,包含编译后的机器码和原始DEX文件的内容,以便回退到解释执行。这里可能需要对比Dalvik虚拟机的JIT机制,说明ART的改进之处。 另外,用户可能对dex2oat的性能影响有疑问,比如安装时间变长,但运行时性能提升。需要平衡这两点,说明Android不同版本中dex2oat的改进,比如Android 7.0引入的Profile-Guided Compilation,根据应用使用情况优化热点代码。 可能还需要提到dex2oat的命令行使用方式,比如通过adb命令手动触发编译,或者调整编译过滤器(如speed、quicken等),这些参数如何影响编译结果和应用性能。 在结构上,应该按照逻辑顺序分点说明,从概述到详细步骤,再到优化技术和实际应用中的注意事项。需要确保术语准确,比如DEXOATART、AOT等,必要时给出简写全称。 还要注意避免错误,比如混淆JIT和AOT,或者错误描述OAT文件的结构。可能需要查阅官方文档或可靠资料确认细节,比如Android开源项目中的相关文档。 最后,总结dex2oat的重要性,以及它在提升Android应用运行效率中的作用,帮助用户全面理解这一过程。</think>--- ### **dex2oat 过程详解** dex2oatAndroid 系统中 **ARTAndroid Runtime)** 的核心组件,负责将应用的 DEX 字节码转换为优化的本地机器码(AOT 编译,Ahead-Of-Time)。这一过程显著提升了 Android 应用的运行效率。 --- ### **一、核心作用** 1. **输入**:APK 中的 `.dex` 文件(Dalvik 字节码)。 2. **输出**:生成 `.oat` 文件(ELF 格式),包含: - 编译后的本地机器码 - 原始 DEX 字节码(用于兼容性回退) 3. **目标**:减少运行时解释执行或即时编译(JIT)的开销,提升启动速度和执行性能。 --- ### **二、触发时机** dex2oat 在以下场景自动执行: 1. **应用安装时**:首次安装或更新 APK。 2. **系统更新后**:OTA 升级后批量优化系统应用。 3. **后台优化**:Android 7.0+ 在空闲时根据使用频率优化代码(Profile-Guided Compilation)。 --- ### **三、编译流程** 1. **解析 DEX 文件** 读取 APK 中的 `classes.dex` 及多 DEX 文件(如 `classes2.dex`)。 2. **选择编译模式** 根据系统配置决定优化级别(如 `speed`、`quicken`、`space`)。 3. **机器码生成** - **代码优化**:内联小函数、删除死代码、寄存器分配。 - **平台适配**:针对 CPU 架构(ARM/x86)生成指令。 4. **生成 OAT 文件** - 将机器码与 DEX 字节码打包为 `.oat` 文件。 - 存储到 `/data/dalvik-cache/` 目录(如 `arm64@vendor@apache@...@base.oat`)。 --- ### **四、优化策略** dex2oat 支持通过参数调整编译行为: ```bash # 示例:手动触发 dex2oat(需 root) adb shell cmd package compile -f -m speed com.example.app ``` 1. **编译过滤器** - `speed`:最大化性能(完全 AOT 编译) - `quicken`:仅做验证和基础优化(Android 10+ 默认) - `space`:优化存储空间 2. **分层编译**(Android 7.0+) - 结合 **AOT + JIT + 解释执行**: - 高频代码:AOT 编译 - 低频代码:JIT 编译或解释执行 --- ### **五、性能权衡** | **场景** | **优点** | **缺点** | |-----------------------|----------------------------------|------------------------------| | 完全 AOT(speed) | 运行时性能最优 | 安装时间长,存储占用高 | | 部分编译(quicken) | 安装速度快,存储占用低 | 首次运行可能需要 JIT 补充编译 | | 纯解释执行 | 安装即时完成 | 运行效率最低 | --- ### **六、关键技术点** 1. **跨平台兼容性** OAT 文件头部记录目标 CPU 指令集,避免错误加载。 2. **回退机制** 若 AOT 编译失败或 OAT 文件损坏,ART 会自动回退到解释执行。 3. **多用户隔离** 每个系统用户有独立的 `/data/dalvik-cache/` 目录,防止权限冲突。 --- ### **七、调试与监控** 1. **日志分析** 通过 `logcat` 过滤 `dex2oat` 查看编译过程: ```bash adb logcat | grep dex2oat ``` 2. **编译时间统计** Android 会在 `/data/anr` 或 `logcat` 中记录每个 APK 的优化耗时。 --- ### **总结** dex2oatAndroid 性能优化的基石,通过权衡安装时间、存储空间和运行效率,动态选择最佳编译策略。从 Android 5.0 引入 ART 取代 Dalvik 至今,其优化机制持续演进(如 Profile-Guided Compilation),成为保障系统流畅性的关键组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值