安装Android应用程序时到底发生了什么?

时间:2011-10-14 20:43:48

标签: android

我的猜测是.apk包的内容是在某处提取的,应用程序在某个目录中注册,以便应用程序启动器或其他任何东西都可以找到它。但这就是全部吗?如果是这种情况,那么每次启动应用程序时是否会读取原始manifest.xml,或者将其预处理为其他形式?

3 个答案:

答案 0 :(得分:30)

一些基础知识

.apk - 文件

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

Android是Linux

基本的Android系统是一个Linux系统。 Android使用自定义Linux内核,在节能和一些速度提升方面具有一些额外功能。 Android设备的内部存储使用YAFFS2-filesystem格式化,RFS完全具有类似Linux的访问概念。

使用过的文件系统可能因制造商或Android版本而异。较新的设备通常使用ext3,而三星则使用自己的文件系统:Apache Harmony

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

编译应用程序

.java - 文件会怎样?

首先,它们由普通的Java编译器编译。在将它们编译(到.class - 文件)后,Android SDK中的dx - 工具会转换/转换那些"正常" java-classes到 Dalvik-Bytecode

这"特别"然后由DVM(Dalvik虚拟机)解释java-code,它基于开源JRE实现jack

更新:在较新版本的Android中,使用ART runtime时可以跳过转换/转换步骤。这样,.java文件将直接编译为.dx格式。

此外,由于4.4版本(KitKat)Android有新的{{3}},它正式取代了Android 5(Lollipop)中的Dalvik。

我放入/asset - 目录的资源会怎样?

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

如果您将文件放入此目录,这就是您期望从Android获得的行为。

我放入/res/raw - 目录的资源会怎样?

/assets目录一样,您也可以在此处放置二进制(或其他)原始文件(例如,帮助页面的HTML文件)。这些文件 已编译/优化(如果可能)。

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

Android-Manifest以及其他XML文件(布局,字符串等)被存储并且"编译"成二进制XML格式。这是速度优化。

沙箱

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

  • 它自己的流程,
  • 它自己的OS-User(就像在Linux上一样),
  • 它自己的DVM,
  • 它在堆中的位置和
  • 它在文件系统上的位置。

所以,是的,每个Android应用程序都拥有自己的用户,该用户有权访问它在内部存储中的位置(受标准Linux文件系统权限管理保护)并且它是&#39 ;自己的DVM流程(无法从应用程序外部访问)。

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

安装过程中的步骤

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

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

答案 1 :(得分:3)

安装应用时,Android系统会将其APK复制到" / data / app"文件夹,它由包名称后跟安装编号(安装或更新应用程序的次数)命名。

我尝试通过复制其手动安装应用并将其粘贴到/ data / app文件夹中并重新启动我的设备然后它显示为已安装的应用并且运行正常。

此外,我在link2SD应用中注意到任何已安装的应用都有以下内容:

Apk位于/data/app/package-number.apk

Dex位于/data/dalvik-cache/data@app@package-number.apk@classes.dex

Lib位于/ data / data / package / lib

数据位于/ data / data / package

缓存位于/ data / data / package / cache

答案 2 :(得分:1)

Android将意图定义为“要执行的操作的抽象描述”。意图不仅允许您使用其他人所做的活动,而且还用于启动应用程序。我相信你已经在你写过的每个应用程序中看到了这些界限:

<intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

此意图过滤器允许启动程序查找每个应用程序的启动活动。查看“意图解决方案”以获取有关此过程的更多详细信息...我认为它比在一些随机目录中注册应用程序更优雅。

http://developer.android.com/guide/topics/intents/intents-filters.html所述,“Android系统会填充应用程序启动器,顶层屏幕显示可供用户启动的应用程序,方法是使用指定了“android.intent.action.MAIN”动作和“android.intent.category.LAUNCHER”类别。然后在启动器中显示这些活动的图标和标签“