安卓如何存储和运行程序。

7

安卓将其程序存储在APK格式中,这是ZIP/JAR的修改版本。

当这些APK文件被安装后,它们会被存储在/system/app/$APKNAME.apk中。

这个目录中的一些应用程序也有一个$APKNAME.obex文件。

这些APK文件包含以下内容:

META-INF
    MANIFEST.MF
    CERT.RSA
    CERT.SF
SHA1-Digest
res
AndroidManifest.xml
classes.dex
resources.arsc

我想知道的是,什么是 .obex 文件?在 Android 中,程序是如何在运行时从 APK/ZIP/JAR 解压缩的呢?


听起来 APK 很像 JAR。也就是说,它甚至没有修改 ZIP 的结构 - 只是一个常规的 ZIP 文件,但其中特定的文件放置在特定的位置。 - cHao
请记住,obex不仅仅是解压缩,它们还经过了优化和验证。这使得验证器需要做更少的工作,而您在运行时也不必进行太多的优化(显然仍需进行一些)。 - Kristopher Micinski
@cHao 好的,我真的很想知道从安装 APK 到启动/运行的过程。 - zeitue
@KristopherMicinski 那么.obex文件就像是经过验证的密钥 + 优化过的classes.dex文件吗? - zeitue
验证的是 _密钥_,不是那种(我的意思是,不是关于那种验证)。它是在某种程度上验证了 字节码。请阅读“字节码验证器”。字节码和验证都需要一定量的静态分析,因此它们在系统中紧密相连是有道理的。但是,您仍然需要在运行时执行一些操作,并且还可以获得更好的JIT。Android使用基于跟踪的JIT,因此在运行时无法知道哪些路径最热门。 - Kristopher Micinski
1个回答

2
这种工作方式非常有趣,同时也为了解Android的运行时模型提供了一些关键见解。如果您打算在Android上进行任何严格的系统工作,我建议您首先观看Dalvik VM internals(尽管它显然有点过时)。现在,当Android包管理器获得一个需要启动新应用程序的意图时,它会从已经运行的zygote进程中分叉出一个新的虚拟机。这基本上是一种允许系统获得许多好的内存属性(共享映射页等)的技术。然后,系统加载一个(可能是预优化和验证过的)文件以便vm可以开始执行它。您应该阅读这篇文档,它将告诉您关于这个过程的很多信息。(也许这个主题也会有所帮助。)请记住,由于所有系统都不同——例如,如果您使用的是新的体系结构,则除非您明确编写了它,否则您将无法获得JIT支持!因此,您不能确切地知道Dalvik将如何加载代码以运行您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接