学习日记-安卓Package Manager和Package Installer

安装和卸载APK(安卓应用程序包文件),运作原理。

什么是Package Manager(包管理器)和Package Installer(程序安装包)?
APK文件保存在Android的哪个地方?
APK文件安装过程的细节是怎样的?
Package Manager(包管理器)是怎样保存数据的?
我应该去哪里找Package Manager和Package Installer的源码?
1、什么是Package Manager和Package Installer

PackageInstaller是安卓上默认的应用程序,用它来交互式地安装普通包文件。PackageInstaller提供了用户界面来管理应用或者包文件。PackageInstaller调用一个叫InstallAppProgress的activity来获取用户发出的指令。InstallAppProgress会请求Package Manager服务,然后通过indalld来安装包文件。源码提供在/packages/apps/PackageInstaller上。

Installd这个系统守护程序的首要角色是获取来自Package Manager服务的请求,而该请求是通过Linux套接字/dev/socket/installed获得的。
Installd使用管理员权限执行一系列的步骤来安装APK。参考:commands.c

Package Manger是一个实际上管理应用程序安装、卸载和升级的API。当我们安装APK文件时,Package Manager会解析APK包文件和显示确认信息。当我们点击OK按钮后,Package Manger会调用一个叫“InstallPackage”的方法,这个方法有四个参数,也就是uri、installFlags、observer和installPackagename。Package Manger会启动一个叫“package”的service(服务),现在所有模糊的东西会发生在这个service中。你可以在PackageInstaller源码中查看“PackageInstallAcitivity.java”和“InstallAppProgress.java”。Package Manger服务运行在系统服务进程中,而安装守护程序(installd)作为一个本地进程运行着,他们都在系统启动时开始运行。

2、APK文件保存在Android的哪个地方?

预装程序(即相机,日历和浏览器等)保存在/system/app/中。
用户安装程序(APIDemo,Any.do等)保存在/data/app/中。
Package Manager创建数据目录/data/data//来保存数据库、shared preference、本地函数库和缓存数据。
你可能会看到apk文件和同一个APK的*.odex文件,而ODEX文件是完全不同的讨论和目的了。

3、APK文件安装过程的细节是怎样的?

下面的过程执行在Package Manger服务中。

等待;
添加一个包文件到安装进程的队列中;
确定合适的地方来安装包文件;
复制apk文件到一个给定的目录下;
确定应用的UID;
请求installd守护程序进程;
创建应用目录和设置权限;
提取dex代码到缓存目录中;
解析packages.list、system、data和packages.xml的最新状态;
向系统发送广播消息,消息带有安装完成效果的名字Intent.ACTION_PACKAGE_ADDED:如果是更新,会带有新的(Intent.ACTION_PACKAGE_REPLACED)。

这里写图片描述

4、Package Manager(包管理器)是怎样保存数据的?

Package Manager保存应用程序的信息在/data/system目录下的三个文件里。下面的例子是从Android 4 ICS(Ice Cream Sandwich)模拟器提取出来的图片。

  1. packages.xml:这个文件包含所有的权限和Packages/Applications。
<packages>
<last-platform-version external="15" internal="15">
<permission-trees>
<permissions>
<item name="android.permission.CHANGE_WIFI_MULTICAST_STATE" package="android" protection="1">
<item name="android.permission.CLEAR_APP_USER_DATA" package="android" protection="2">
.
.
.
. 
</item></item></permissions>

<package codepath="/system/app/Contacts.apk" flags="1" ft="136567b3990" it="136567b3990" name="com.android.contacts" nativelibrarypath="/data/data/com.android.contacts/lib" shareduserid="10001" ut="136567b3990" version="15">
<sigs count="1">
<cert index="2">
</cert></sigs>
</package>
.
.
.
.
<package codepath="/data/app/com.project.t2i-2.apk" flags="0" ft="13a837c2068" it="13a83704ea3" name="com.project.t2i" nativelibrarypath="/data/data/com.project.t2i/lib" userid="10040" ut="13a837c2ecb" version="1">
<sigs count="1">
<cert index="3" key="308201e53082014ea0030201020204506825ae300d06092a86
4886f70d01010505003037310b30090603550406130255533110300e060355040a13074
16e64726f6964311630140603550403130d416e64726f6964204465627567301e170d31
32303933303130353735305a170d3432303932333130353735305a3037310b300906035
50406130255533110300e060355040a1307416e64726f6964311630140603550403130d
416e64726f696420446562756730819f300d06092a864886f70d010101050003818d003
08189028181009ce1c5fd64db794fd787887e8a2dccf6798ddd2fd6e1d8ab04cd8cdd9e
bf721fb3ed6be1d67c55ce729b1e1d32b200cbcfc91c798ef056bc9b2cbc66a396aed6b
a3629a18e4839353314252811412202500f11a11c3bf4eb41b2a8747c3c791c89391443
39036345b15b5e080469ac5f536fd9edffcd52dcbdf88cf43c580abd0203010001300d0
6092a864886f70d01010505000381810071fa013b4560f16640ed261262f32085a51fca
63fa6c5c46fde9a862b56b6d6f17dd49643086a39a06314426ba9a38b784601197246f8
d568e349a93bc6af315455de7a8923f40d4051a51e1658ee34aca41494ab94ce978ae38
609803dfb3004806634e6e78dd0be26fe75843958711935ffc85f9fcf81523ce23c86bc
c5c7a">
</cert></sigs>
<perms>
<item name="android.permission.WRITE_EXTERNAL_STORAGE">
</item></perms>
</package>
.
.
.
.
.
</permission-trees></last-platform-version></packages>

这个xml文件包含两种信息,权限和package(application)。 权限是保存在标签里的。每个Permission(权限)有三个属性,即name、package和protection。Name属性包含权限的名字,也就是我们在AndroidManifest.xml所用的,Package属性表明权限所属的包。在大多数情况下,“android”是一个值,因为标签包含默认的权限,以及protection表明安全的等级。

package标签包含10个属性和一些子标签。

这里写图片描述

子标签

sigs 签名信息,count属性代表cert标签的数量。
cert 包含证书的key,index属性代表证书的全局索引,当新的证书安装时,我发现index会随着增加。
perms 包含开发者已经在AndroidManifest.xml中设置好的权限。
2. packages.list: 这是一个简单的文本文件,包含了包名、用户id、flag和数据目录,我找不到更加完美的描述了,但是我设想它可提供更快速的已安装包的查找,因为这个文件一直只保存重要的信息。

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

3.packages-stoped.xml:这个文件包含了已经是停止状态的包的列表,停止状态的应用是不能接收任何的广播的。参考这个链接来了解更多关于停止状态应用的信息。
http://yuki312.blogspot.in/2012/03/androidbroadcaststop.html

<stopped-packages>
<pkg name="com.android.widgetpreview" nl="1"></pkg>
<pkg name="com.example.android.livecubes" nl="1"></pkg>
<pkg name="com.android.gesture.builder" nl="1"></pkg>
<pkg name="com.example.android.softkeyboard" nl="1"></pkg>
</stopped-packages>

5、去哪里可以找到Package Manager和Package Installer的源码?

Package Manger
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

Package Installer
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

原文链接:http://blog.jobbole.com/67286/

解释这些参数optional arguments: -h, --help show this help message and exit --host HOST --port PORT --config-installer Open config web page, mainly for windows installer (default: False) --load-installer-config Load all cmd args from installer config file (default: False) --installer-config INSTALLER_CONFIG Config file for windows installer (default: None) --model {lama,ldm,zits,mat,fcf,sd1.5,cv2,manga,sd2,paint_by_example,instruct_pix2pix} --no-half Using full precision model. If your generate result is always black or green, use this argument. (sd/paint_by_exmaple) (default: False) --cpu-offload Offloads all models to CPU, significantly reducing vRAM usage. (sd/paint_by_example) (default: False) --disable-nsfw Disable NSFW checker. (sd/paint_by_example) (default: False) --sd-cpu-textencoder Run Stable Diffusion text encoder model on CPU to save GPU memory. (default: False) --local-files-only Use local files only, not connect to Hugging Face server. (sd/paint_by_example) (default: False) --enable-xformers Enable xFormers optimizations. Requires xformers package has been installed. See: https://github.com/facebookresearch/xformers (sd/paint_by_example) (default: False) --device {cuda,cpu,mps} --gui Launch Lama Cleaner as desktop app (default: False) --no-gui-auto-close Prevent backend auto close after the GUI window closed. (default: False) --gui-size GUI_SIZE GUI_SIZE Set window size for GUI (default: [1600, 1000]) --input INPUT If input is image, it will be loaded by default. If input is directory, you can browse and select image in file manager. (default: None) --output-dir OUTPUT_DIR Result images will be saved to output directory automatically without confirmation. (default: None) --model-dir MODEL_DIR Model download directory (by setting XDG_CACHE_HOME environment variable), by default model downloaded to ~/.cache (default: /Users/cwq/.cache) --disable-model-switch Disable model switch in frontend (default: False)
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值