【问题标题】:"How are" Android applications (Facebook etc.) installed to an android phone? [closed]“如何”将 Android 应用程序(Facebook 等)安装到 Android 手机? [关闭]
【发布时间】:2015-08-02 05:35:12
【问题描述】:

我知道如何将应用程序安装到 Android 设备,例如从 Play-Store 或通过 .apk 文件。但是我想了解一下实际的安装过程。

例如在 Windows 上:

  • 序列号等存放在注册表中
  • 对软件运行很重要的文件放在 Program Files 文件夹中(.exe

到目前为止,我对Android应用程序安装过程的了解是:

  • Android 应用程序执行后(安装后),新下载的数据将放置在以下位置:Android/dataAndroid/obb 等.

  • 如果由 Android 开发人员明确表示,文件也可以放在其他地方,例如二级存储(存储卡、云存储等)

但除此之外,我对 Android 安装过程的了解非常少,例如:

  • 我不知道与 Android 程序执行相关的重要文件放在哪里(对于 Windows,.exe、相关媒体、库等)

  • 我同样不知道这些文件在 Android 设备上的结构(安装后),例如这些文件是否在以下文件夹中结构化:javaresmenulayout 等,就像在环境中的开发过程中一样喜欢 Android Studio?

  • 我也不知道安装后(从 android 安装文件或 apk 解压缩后)哪些应用程序文件类型是如何存储在用户设备上的,例如它们是否存储为 .java 和或 .xml 文件,如在开发过程中等。

希望有人能填补空白,谢谢。

【问题讨论】:

  • 您可以肯定的一件事:没有一个通用的答案。尤其是在从 Dalvik 转向 ART 之后。您是否考虑过对设备进行 Root 操作,然后只查看您会找到的内容?
  • 您无需root设备即可环顾四周。将手机插入计算机并运行adb shell。这些命令类似于 unix shell - 例如您可以输入cdls。查看/data/app 之类的目录。 blog.shvetsov.com/2013/02/…
  • 除了在您最喜欢的 wiki 上找到 APK 格式的描述之外 - 关于 ART 的最新内容已在上一次 Google IO 中介绍:youtu.be/EBlTzQsUoOw

标签: java android apk android-package-managers android-install-apk


【解决方案1】:

开始

PackageInstaller 调用 InstallAppProgress 活动来接收来自用户的指令。 InstallAppProgress 将要求PackageManager Service 通过 installd 安装包。源代码在<Android Source>/packages/apps/PackageInstaller

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

APK 文件在 Android 中的存储位置?

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

您可能会看到apk 文件和*.odex 文件对于相同的APKODEX 文件是完全不同的讨论和目的。

详细的APK安装过程是什么?

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

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

包管理器如何存储数据?

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

packages.xml:此文件包含权限列表和包/应用程序。 这个xml文件存储了两件事1.权限2.包(应用程序),权限存储在<permissions>标签下。每个权限都有三个属性,分别是名称、包和保护。 name 属性有我们在AndroidManifest.xml 中使用的权限名称,package 属性表示权限属于包,在大多数情况下“android”是值,因为<permission> 标签包含默认权限,而 protection 表示安全级别。

packages.list:这是一个简单的文本文件,包含包名、用户 ID、标志和数据目录,我找不到任何完美的描述,但我认为 packages.list 文件可能提供更快地查找已安装的包,因为它只保存重要信息。

com.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:此文件包含已停止状态的包列表,Stope 声明应用程序无法接收任何广播。

在哪里可以找到包管理器和包安装器的源代码?

包管理器

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.

参考链接link 1link 2

【讨论】:

  • android 操作系统如何提取 .dex 文件以及将它们提取到哪里,对于每个已安装的应用程序?
  • 操作系统从 apk 中检索包,因此将其存储在 /data/system 中。请参考我的回答标题什么是APK安装详细过程Package Manager如何存储数据。里面都有详细的描述。
  • 我的意思是,Android 操作系统如何“提取 dex 代码到缓存目录”以及每个应用程序的这些缓存目录位于哪里?
  • 啊,对不起。因此,由于apk 是一种存档,因此它将apk 转换为zip 并简单地提取文件。这是路径/data/dalvik-cache/x86/data@app@com.hfad.bitsandpizzas@base.apk@classes.dex 的示例。又找到了一个链接,可能有用。href="github.com/dogriffiths/HeadFirstAndroid/wiki/…
  • 我不完全明白你的意思......如果你想自己将dex转换为java源,所以你使用dex2jar,路径与我上面的评论相同/data/dalvik-cache/x86/data@app@yourpackagename@base.apk@classes.dex 和操作系统不会将 dex 文件转换为原始文件。专门转换成dexDalvik VM 可以执行它们... 关于Manifest 我没有查,也找不到任何相关的链接,但我猜它一定在同一路径上。自己检查一下。也许你需要一个根,但不能确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多