Android ART - 在 /dalvik-cache/ 中使用 .oat 文件?
Android ART - Usage of .oat file in /dalvik-cache/?
在玩 Android ART 和在应用程序安装过程中创建的 "native" 代码文件 .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下启动应用程序的详细流程是什么?
我希望有人能帮我解决这个问题。非常感谢。
根据@Paschalis 的评论,我在这里进行了调查,燕麦文件确实是内存映射到 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
我还没有找到有效的参考,它是基于实验和观察
在玩 Android ART 和在应用程序安装过程中创建的 "native" 代码文件 .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下启动应用程序的详细流程是什么?
我希望有人能帮我解决这个问题。非常感谢。
根据@Paschalis 的评论,我在这里进行了调查,燕麦文件确实是内存映射到 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
我还没有找到有效的参考,它是基于实验和观察