“如何”将 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/data 或 Android/obb 等.
如果由 Android 开发人员明确表示,文件也可以放在其他地方,例如二级存储(存储卡、云存储等)
但除此之外,我对 Android 安装过程的了解非常少,例如:
我不知道与 Android 程序执行相关的重要文件放在哪里(对于 Windows,.exe、相关媒体、库等)
我同样不知道这些文件在 Android 设备上的结构(安装后),例如这些文件是否在以下文件夹中结构化:java、res、menu、layout 等,就像在环境中的开发过程中一样喜欢 Android Studio?
我也不知道安装后(从 android 安装文件或 apk 解压缩后)哪些应用程序文件类型是如何存储在用户设备上的,例如它们是否存储为 .java 和或 .xml 文件,如在开发过程中等。
希望有人能填补空白,谢谢。
【问题讨论】:
您可以肯定的一件事:没有一个通用的答案。尤其是在从 Dalvik 转向 ART 之后。您是否考虑过对设备进行 Root 操作,然后只查看您会找到的内容? 您无需root设备即可环顾四周。将手机插入计算机并运行adb shell
。这些命令类似于 unix shell - 例如您可以输入cd
和ls
。查看/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.java
和 InstallAppProgress.java
。在 system_service 进程中运行的包管理器服务和作为本机进程运行的安装守护进程 (installd) 都在系统启动时启动。
APK
文件在 Android
中的存储位置?
-
预安装(即相机、日历、浏览器等)
APK
存储在 /system/app/ 中
用户安装(ApiDemo、Any.do 等)APK 存储在/data/app/
包管理器创建数据目录/data/data/<package name>/
来存储数据库、共享首选项、本机库和缓存数据
您可能会看到apk
文件和*.odex
文件对于相同的APK
,ODEX
文件是完全不同的讨论和目的。
详细的APK安装过程是什么?
以下进程在Package Manager Service
中执行。
/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
文件转换为原始文件。专门转换成dex
,Dalvik VM
可以执行它们... 关于Manifest
我没有查,也找不到任何相关的链接,但我猜它一定在同一路径上。自己检查一下。也许你需要一个根,但不能确定。以上是关于“如何”将 Android 应用程序(Facebook 等)安装到 Android 手机? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
已安装 Facebook 应用程序时,Android 中的 Facebook 集成不起作用
游戏环境配置:React Native 开发环境配置 For Android