4

在玩弄 Android ART 和在应用程序安装过程中创建的“本机”代码文件 .oat/.elf 时,我确实注意到了一些奇怪的事情。

据我了解,如果设备使用 ART (Android >= 5.0),应用程序将从编译后的 oat 文件 (/data/dalvik-cache/arm64/) 开始。

这就是为什么我在检查应用程序的已用 fd 并且没有在那里找到该文件时有点惊讶的原因。那里只列出了普通的 apk (/data/app//base.apk)。

检查我的“ls -l /proc/PID/fd”的输出

在此处输入图像描述

所以我想也许它只是没有在那里列出。所以我确实通过使用 dex2oat 工具编译另一个 classes.dex 自己交换了该应用程序的 oat 文件。

因此,即使在更改文件后,应用程序也可以正常启动,而不会出现任何奇怪的消息或错误(也在 logcat 中)。

对此有何解释?Android在ART下启动应用的详细流程是什么?

我希望有人可以为我解决这个问题。非常感谢。

4

1 回答 1

4

根据@Paschalis 评论,我在这里进行了调查,oat 文件确实是在 Android 5.0 设备(模拟器)上映射的内存:

a6af4000-a6af9000 r--p 00000000 1f:01 7366 /data/dalvik-cache/x86/data@app@my.app.works-1@base.apk@classes.dex

通过以下方式检查:

cat /proc/<PID>/maps | grep dex

可悲的是,这对于 Android 6.0 设备(Nexus 5 和 arm-Emulator)不再适用。

odex 文件位于/data/app/<APP>/oat/<ARCHITECTURE>/“base.odex”文件夹中

/data/app/app.app.works-1/oat/arm/base.odex

我仍然没有找到有效的参考,它是基于实验和观察

于 2016-01-22T11:35:52.307 回答