• Android文件格式


    在Android的priv-app目录下发现有oat类型的文件夹
    什么是oat

    It’s Of Ahead Time, a silly reordering of Ahead Of Time. We went with that because then we say that process of converting .dex files to .oat files would be called quakerizing and that would be really funny.

    参考如下文章:

    When dealing with application development, the main part of the code is usually written in Java. Developers can also write native code (C/C++) through the Java Native Interface (JNI) interface.
    In the APK building process, the Java code is eventually transformed in the Dalvik bytecode which is interpreted by the Android Java virtual machine. The Android JVM is different from the implementation by Oracle and, among the differences, it is based on registers whereas the one from Oracle is based on a stack.
    在 APK 构建过程中,Java 代码最终转化为 Dalvik 字节码,由 Android Java 虚拟机解释。 Android JVM 与 Oracle 的实现不同,其中不同之处在于它基于寄存器,而 Oracle 的实现基于堆栈。

    To produce the Dalvik bytecode, Java sources are first compiled with javac into the Java bytecode and then Android transforms this bytecode into the Dalvik one by using the dx compiler (or the new one: D8). This bytecode is finally wrapped in a DEX file(s) such as classes.dex. The DEX format is specific to Android and the documentation is available here.
    为了生成 Dalvik 字节码,首先使用 javac 将 Java 源代码编译成 Java 字节码,然后 Android 通过使用 dx 编译器(或新的编译器:D8)将此字节码转换为 Dalvik 字节码。 这个字节码最终被包装在一个 DEX 文件中,例如 classes.dex

    During the installation of the APK, the system applies optimizations on this DEX file in order to speed-up the execution. Indeed interpreting bytecode is not as efficient as executing native code and the Dalvik virtual machine is based on registers that are 32-bits width size whereas most of the recent CPU are 64-bits width.
    在安装APK的过程中,系统会对该DEX文件进行优化,以加快执行速度。 实际上,解释字节码不如执行本机代码高效,而且 Dalvik 虚拟机基于 32 位宽度的寄存器,而最近的大多数 CPU 都是 64 位宽度。

    To address this issue and prior to Android 4.4 (KitKat), the runtime used JIT compilation to transform Dalvik bytecode into assembly. The JIT ocurred during the execution and it was done each time the application was executed. Since Android 4.4 they moved to a new runtime which, among other features, performs the optimizations during the installation. Consequently the installation takes more time but transformations to native code are done once.
    为了解决这个问题,在 Android 4.4 (KitKat) 之前,运行时使用 JIT 编译将 Dalvik 字节码转换为程序集。 JIT 在执行期间发生,并且每次执行应用程序时都会完成。 从 Android 4.4 开始,他们迁移到了新的运行时,除其他功能外,该运行时在安装期间执行优化。 因此,安装需要更多时间,但本地代码的转换只需完成一次。

    To optimize the Dalvik bytecode, the original DEX file (e.g. classes.dex) is transformed into another file that will contain the native code. This new file usually has the .odex, .oat extension and is wrapped by the ELF format. Using ELF format makes sense for mainly two reasons:
    为了优化 Dalvik 字节码,原始 DEX 文件(例如 classes.dex)被转换为另一个包含本机代码的文件。 这个新文件通常具有 .odex、.oat 扩展名,并以 ELF 格式包装。 使用 ELF 格式的意义主要有两个原因:

    • It’s the default format used by Linux and Android to package assembly code.
    • It enables to use the same loader: /system/bin/linker{64}

    OAT files are in fact ELF and this is why, we choose to add this new format in LIEF. This ELF format is actually used as a wrapper over another format which is specific to Android: the OAT format.

    DEX are transformed into .odex files that are primarily ELF files wrapping a custom OAT format.
    DEX 被转换为 .odex 文件,这些文件主要是封装了自定义 OAT 格式的 ELF 文件。
    在这里插入图片描述

    The process of converting Java sources into the OAT can be simplified with the following diagram:
    在这里插入图片描述

    参考:

    Android Runtime(缩写为ART),是一种在Android操作系统上的运行环境,由Google公司研发,并在2013年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。它与Dalvik的主要不同在于:Dalvik采用的是JIT技术,而ART采用Ahead-of-time(英语:Ahead-of-time compilation)(AOT)技术。ART同时也改善了性能、垃圾回收(Garbage Collection)、应用程序出错以及性能分析。
    JIT最早在Android 2.2系统中引进到Dalvik虚拟机中,在应用程序启动时,JIT通过进行连续的性能分析来优化程序代码的执行,在程序运行的过程中,Dalvik虚拟机在不断的进行将字节码编译成机器码的工作。与Dalvik虚拟机不同的是,ART引入了AOT这种预编译技术,在应用程序安装的过程中,ART就已经将所有的字节码重新编译成了机器码。应用程序运行过程中无需进行实时的编译工作,只需要进行直接调用。因此,ART极大的提高了应用程序的运行效率,同时也减少了手机的电量消耗,提高了移动设备的续航能力,在垃圾回收等机制上也有了较大的提升。为了保证向下兼容,ART使用了相同的Dalvik字节码文件(dex),即在应用程序目录下保留了dex文件供旧程序调用,然而.odex文件则替换成了可执行与可链接格式(ELF)可执行文件。一旦一个程序被ART的dex2oat命令编译,那么这个程序将会只通过ELF可执行文件来运行。因此,相对于Dalvik虚拟机模式,ART模式下Android应用程序的安装需要消耗更多的时间,同时也会占用更大的内部储存空间,用于储存编译后的代码,但节省了很多Dalvik虚拟机用于实时编译的时间。

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

  • 相关阅读:
    (附源码)计算机毕业设计SSM基于协同过滤算法的食谱定制系统
    CSS 简介&三种样式写法
    SpringBoot系列——防重放与操作幂等
    记录gns3出现各种erro报错以及具体修复过程
    Python实现鸡群算法
    Yarn框架原理
    算法通过村第七关-树(递归/二叉树遍历)青铜笔记|手撕递归
    Redis学习笔记②实战篇_黑马点评项目
    渗透测试靶场环境搭建
    Python入门系列(九)pip、try except、用户输入、字符串格式
  • 原文地址:https://blog.csdn.net/u014084081/article/details/126768195