当我安装Android应用程序时究竟发生了什么?

我的猜测是,.apk包的内容是在某个地方提取的,应用程序是在某个目录下注册的,以便应用程序启动器或者其他的可以找到它。那是全部吗如果是这种情况,原始的manifest.xml是每次应用程序启动还是被预处理成其他形式时都会读取?
最佳答案
一些基础

.apk文件

一个.apk文件根本不是神奇的。它只是一组代表Android应用程序内容的文件。如果您在一个归档工具(如7Zip)中打开它,您可以浏览并解压缩其内容。

Android是Linux

基本的Android系统是一个Linux系统。 Android使用自定义的Linux内核,具有省电和一些速度改进的一些额外功能。 Android设备的内部存储使用YAFFS2-filesystem进行格式化,这完全具有类似Linux的访问概念。

所使用的文件系统可能因制造或Android版本而异。较新的设备通常使用ext3,而Samsung则使用自己的文件系统:RFS

这是Sandbox系统的一个重要方面,由Android使用。

编译应用程序

.java文件会发生什么?

首先,它们由正常的Java编译器编译。在编译(.class文件)之后,Android SDK的dx工具然后将这些“正常”java类转换/转换为Dalvik-Bytecode。

这个“特殊”的java代码由DVM(Dalvik Virtual Machine)解释,它基于开源JRE实现Apache Harmony

更新:在较新的Android版本中,当使用jack时,可以跳过convert / transpile步骤。这样,.java文件直接编译成.dx格式。

另外,自从4.4版(KitKat)Android还有新的ART runtime,它正式取代了Android 5(Lollipop)的Dalvik。

资源放在/资产目录中会发生什么?

Android提供/ assets-directory来添加一些二进制文件(例如SQLite数据库)。放入此目录的文件未编译或优化。

如果你把你的文件放在这个目录下,这是你期待从Android的那种行为。

我放入/ res / raw目录的资源会发生什么?

像/ assets-directory一样,您也可以将二进制(或其他)原始文件放在这里(例如帮助页面的HTML文件)。这些文件被编译/优化(如果可能的话)。

清单和其他XML文件会发生什么?

Android-Manifest以及其他XML文件(Layouts,Strings等)被存储和“编译”为二进制XML格式。这是一个速度优化。

沙箱

从Android OS的角度来看,一个应用程序拥有:

>它是自己的进程,
>它是自己的OS-User(就像在Linux上),
>它是自己的DVM,
它在堆里是自己的地方
>它是文件系统上的自己的地方。

所以是的,每个Android应用都有它自己的用户,它具有访问内部存储(由标准Linux文件系统权限管理保护)的适当权限,并且它是自己的DVM进程(不能从外部访问的应用)。

为了让应用程序离开沙箱(例如连接到Internet),可以使用Android Manifest中声明的权限。

安装过程中的步骤

所以从上面的解释,应该清楚安装Android应用程序时会发生什么:

>创建应用程序的新用户。
>使用此新用户权限,将创建内部存储中的Applications目录。
> .apk文件的内容正在提取。
> Android-Manifest被解析,声明的意图过滤器被注册(例如应用程序标准入口点的android.intent.category.LAUNCHER过滤器)。
>现在应用程序已经准备好了,首次启动。

转载注明原文:当我安装Android应用程序时究竟发生了什么? - 代码日志