概述
通过前面的介绍我们知道,PMS 里面有个成员变量mInstaller
,PMS的很多工作比如dex优化,删除目录等工作都是由它来完成的。Installer
类也比较简单,它也有个mInstaller
的成员变量,它是InstallerConnection
的一个对象,它通过 socket 和 Deamon 进程 installd 进行通信。Installer
类所承担的工作实际是由 installd 进程来完成的。
installd进程在init.rc中定义如下:
1 | service installd /system/bin/installd |
我们可能有这样的疑问,为什么要创建这样一个进程出来呢?它的工作由PMS来完成不是更好吗?这是因为PMS所在的进程 SystemServer 属于 system 用户组,没有 root 权限。像一些操作文件系统的工作比如移动和删除文件都需要 root 权限才是可以的。
相关代码位置:
1 | frameworks/base/core/java/com/android/internal/os/InstallerConnection.java |
初始化
1 | int main(const int argc __unused, char *argv[]) { |
支持的命令
1 | struct cmdinfo cmds[] = { |
中间的数字表示需要的参数个数,后面表示各个命令对应的执行函数。
1 | struct cmdinfo { |
下面简单介绍一下这些命令的作用:
- ping:用于测试的空操作
- install:安装应用
- dexopt:dex优化操作,6.0之前的生成dex,6.0包括之后的生成dex和oat
- markbootcomplete: 通知启动完成
- movedex:移动apk文件
- rmdex:删除/data/dalvik-cache下面相关文件
- remove:卸载应用
- rename:更改应用数据目录的名称
- fixuid:更改应用数据目录的uid
- freecache:清除/cache目录下的文件
- rmcache:删除/cache目录下面某个应用的目录
- rmcodecache:清除代码缓存文件
- getsize:计算一个应用占用空间的大小,包括apk、数据目录、cache目录等
- rmuserdata:删除一个user的所有安装的应用
- cpcompleteapp:复制整个app
- movefiles:执行/system/etc/updatecmds目录下的移动目录的脚本
- linklib:为动态库建立符号链接
- mkuserdata:为一个用户创建目录
- mkuserconfig:为一个用户建立配置文件
- rmuser:删除一个用户的所有文件
- idmap:对两个apk进程执行idmap操作
- restorecondata:恢复目录的SELinux安全上下文
- createoatdir:创建OAT的目录
- rmpackagedir:删除包的目录
- linkfile:对文件建立符号链接