安卓应用程序(例如Facebook等)是如何安装到安卓手机上的?

8
我知道如何在Android设备上安装应用程序,例如从Play-Store或通过.apk文件。但我想了解实际的安装过程。
例如,在Windows上:
- 序列号等信息被放置在注册表中 - 对于软件运行至关重要的文件被放置在Program Files文件夹中(主要是.exe等文件)
到目前为止,我所知道的Android应用程序安装过程如下:
- 在执行(安装后)Android应用程序之后,新下载的数据会被放置在诸如Android/data或Android/obb等位置。 - 如果由Android开发人员明确指定,文件也可以放置在其他地方,例如次要存储器(内存卡、云存储等)。
但除此之外,我对Android安装过程的了解非常有限,例如:
- 我不知道与Android程序执行相关的重要文件放置在哪里(在Windows的情况下,.exe、相关媒体、库等文件)。 - 同样,我不知道这些文件在Android设备上(安装后)如何结构化,例如这些文件是否像在Android Studio等环境中开发时一样按文件夹(如java、res、menu、layout等)组织? - 我也不知道用户设备上安装后的应用程序文件类型(从android安装文件或apk解压缩后)如何存储,例如它们是否像开发过程中那样存储为.java和.xml文件。
希望有人能填补这些空白,谢谢。

1
有一件事是可以确定的:没有一个通用答案。特别是在从Dalvik转换到ART之后。您是否考虑过对设备进行root并查看您会发现什么? - Xaver Kapeller
无需Root设备即可四处查看。将手机连接到计算机并运行adb shell。 命令类似于Unix shell——例如,您可以键入cdls。 查看目录,如/data/app。 http://blog.shvetsov.com/2013/02/access-android-app-data-without-root.html - craig65535
1
除了在您最喜欢的维基上找到APK格式的描述之外,有关ART的新内容已在上一届Google IO上进行了介绍:https://youtu.be/EBlTzQsUoOw - Morrison Chang
1个回答

13

起步

PackageInstaller调用InstallAppProgress活动以接收用户的指令。 InstallAppProgress将要求PackageManager服务通过installd安装软件包。源代码可在<Android Source>/packages/apps/PackageInstaller中找到。

当我们安装APK文件时,软件包管理器解析软件包(APK)文件,并显示确认信息。当用户按下“确定”按钮时,软件包管理器使用这四个参数:即uriinstallFlags、观察者和installPackageName调用名为installPackage的方法。软件包管理器启动了一个名为“package”的服务,现在所有的模糊事情都发生在这个服务中。您可以在PackageInstaller源代码中检查PackageInstallerActivity.javaInstallAppProgress.java。软件包管理器服务运行在system_service进程中,安装守护程序(installd)作为一个本地进程,在系统启动时同时启动。

Android存储APK文件在哪里?

  1. 预安装(如相机、日历、浏览器等)APK存储在/system/app/中
  2. 用户安装(ApiDemo、Any.do等)APK存储在/data/app/
  3. 软件包管理器创建数据目录/data/data/<package name>/来存储数据库、共享首选项、本地库和缓存数据

您可能会看到与同一APK相关的apk文件和*.odex文件,其中ODEX文件是完全不同的讨论和目的。

详细讲解APK安装过程?

以下流程在Package Manager Service中执行。

  • 等待
  • 将一个软件包添加到安装进程的队列中
  • 确定软件包安装的适当位置
  • 确定安装/更新新的安装
  • 将apk文件的副本复制到给定的目录中
  • 确定应用程序的UID
  • 请求installd守护程序进程
  • 创建应用程序目录并设置权限
  • 将dex代码提取到缓存目录中
  • 为反映和packages.list/system/data/packages.xml更新最新的状态
  • 广播到系统,同时附带安装完成包的名称效果。Intent.ACTION_PACKAGE_ADDED: 如果是新的(Intent.ACTION_PACKAGE_REPLACED): 更新的情况。

enter image description here

软件包管理器如何存储数据?

软件包管理器在/data/system中存储应用程序信息的三个文件。以下示例从Android 4 ICS模拟器映像中提取。

packages.xml:此文件包含权限和软件包/应用程序的列表。这个xml文件存储两个东西1.权限2.包(应用程序),权限存储在<permissions>标记下。每个权限都有三个属性,即名称、包和保护。名称属性具有我们在AndroidManifest.xmlcom.android.launcher 10013 0 /data/data/com.android.launcher com.android.quicksearchbox 10033 0 /data/data/com.android.quicksearchbox com.android.contacts 10001 0 /data/data/com.android.contacts com.android.inputmethod.latin 10006 0 /data/data/com.android.inputmethod.latin

packages-stoped.xml:这个文件包含已停止状态的软件包列表,停止状态的应用程序无法接收任何广播。

我在哪里可以找到Package Manager和Package Installer的源代码?

Package Manager

frameworks/base/services/java/com/android/server/pm/Settings.java
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/java/com/android/server/pm/IPackageManager.aidl
frameworks/base/services/java/com/android/server/pm/PackageSignatures.java
frameworks/base/services/java/com/android/server/pm/PreferredActivity.java
frameworks/services/java/com/android/server/PreferredComponent.java
frameworks/core/java/android/content/IntentFilter.java
frameworks/base/core/java/android/content/pm/PackageParser.java
frameworks/base/services/java/com/android/server/pm/Installer.java
frameworks/base/core/java/com/android/internal/app/IMediaContainerService.aidl
frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java

软件包安装程序

packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java.

参考链接: 链接1链接2.


安卓操作系统是如何提取每个已安装应用程序的.dex文件,以及它们被提取到哪里的? - user4920338
操作系统从apk中检索软件包,因此将其存储在/data/system中。请参考我的答案标题详细介绍APK安装过程包管理器如何存储数据。其中所有内容都有详细描述。 - Yurets
我的意思是,Android操作系统如何“将dex代码提取到缓存目录”,每个应用程序的这些缓存目录位于哪里? - user4920338
1
啊,抱歉。因为apk是一种归档文件,所以它将apk转换为zip并简单地提取文件。这是路径的示例/data/dalvik-cache/x86/data@app@com.hfad.bitsandpizzas@base.apk@classes.dex。找到了另一个链接,可能会有用。href="https://github.com/dogriffiths/HeadFirstAndroid/wiki/How-Android-Apps-are-Built-and-Run - Yurets
我的意思是,我知道如何提取apk文件:因此我可以看到“AndroidManifest.xml”,“classes.dex”和“resources.arsc”等。但是你上面提到,在操作系统提取apk之后,它会将classes.dex提取到缓存位置:这个位置在哪里?它如何提取classes.dex文件以显示原始类? - user4920338
1
我不完全明白你的意思...如果你想自己将dex转换为Java源代码,那么你可以使用dex2jar,路径与我上面评论中的路径相同/data/dalvik-cache/x86/data@app@yourpackagename@base.apk@classes.dex,操作系统不会将dex文件转换回原始格式。它是专门转换为Dalvik VM可以执行的dex格式...关于Manifest,我没有检查过也找不到任何相关的链接,但我猜它必须在相同的路径上。只需自己检查一下。也许你需要root权限,但不能确定。 - Yurets

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