“如何”将 Android 应用程序(Facebook 等)安装到 Android 手机? [关闭]

Posted

技术标签:

【中文标题】“如何”将 Android 应用程序(Facebook 等)安装到 Android 手机? [关闭]【英文标题】:"How are" Android applications (Facebook etc.) installed to an android phone? [closed] 【发布时间】: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 【参考方案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 中的存储位置?

    预安装(即相机、日历、浏览器等)APK 存储在 /system/app/ 中 用户安装(ApiDemo、Any.do 等)APK 存储在/data/app/ 包管理器创建数据目录/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 1 和 link 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 我没有查,也找不到任何相关的链接,但我猜它一定在同一路径上。自己检查一下。也许你需要一个根,但不能确定。

以上是关于“如何”将 Android 应用程序(Facebook 等)安装到 Android 手机? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

已安装 Facebook 应用程序时,Android 中的 Facebook 集成不起作用

iOS Facebook 登录停止工作

游戏环境配置:React Native 开发环境配置 For Android

Weex开发之路:开发环境搭建

xml 中的 com.facebook.widget.loginbutton 错误

Facebook 开发者登录错误