深入浅出讲解安卓PMS(Package Manager Service)
PMS(Package Manager Service ,包管理服务)是Android系统中负责安装、卸载、管理应用程序 的核心服务。它就像是手机里的App管理员,负责:
- 安装APK(检查签名、解压、优化)
- 卸载App(清理数据、移除权限)
- 管理App信息(包名、版本、权限、四大组件)
- 控制App的可见性(比如隐藏系统App)
一、PMS是干什么的?
想象你的手机是一个大商场,PMS就是商场管理员,负责:
-
App的入驻(安装)
- 检查APK是否合法(签名验证)
- 分配"店铺位置"(数据目录
/data/app/
) - 登记信息(记录包名、版本、权限等)
-
App的退出(卸载)
- 删除APK文件
- 清理数据目录(
/data/data/<包名>
) - 移除权限和注册信息
-
App的权限管理
- 记录哪些权限被授予
- 控制运行时权限(Android 6.0+)
-
查询App信息
- 其他App或系统可以通过PMS查询已安装的App信息
二、PMS的核心工作流程
1. APK安装过程
当你安装一个APK时,PMS会做以下事情:
- 拷贝APK文件 → 放到
/data/app/<包名>
(普通App)或/system/app/
(系统App) - 解析AndroidManifest.xml → 读取包名、版本、权限、四大组件(Activity/Service等)
- 优化DEX文件 → 生成
.odex
或.vdex
加快运行速度 - 更新Package数据库 → 记录App信息到
/data/system/packages.xml
- 广播安装完成 → 发送
ACTION_PACKAGE_ADDED
注意 :系统App的APK放在
/system/app/
或/system/priv-app/
,普通App放在/data/app/
。
2. APK卸载过程
当你卸载App时:
- 删除APK文件 (
/data/app/<包名>
) - 清理数据目录 (
/data/data/<包名>
) - 更新Package数据库 (
packages.xml
) - 广播卸载完成 (
ACTION_PACKAGE_REMOVED
)
3. 权限管理
- 安装时权限 (
AndroidManifest.xml
里声明的)- 比如:
INTERNET
、READ_CONTACTS
- 旧版本(Android 5.1及以下)安装时一次性授予
- 比如:
- 运行时权限 (Android 6.0+)
- 危险权限(如相机、位置)需要动态申请
- PMS记录哪些权限被用户允许/拒绝
三、PMS的数据存储
PMS维护了几个重要文件:
文件 | 存储位置 | 作用 |
---|---|---|
packages.xml | /data/system/ |
记录所有已安装App的信息(包名、版本、权限等) |
packages.list | /data/system/ |
记录App的UID和数据目录 |
package_cache | /data/system/ |
缓存优化后的DEX信息 |
四、PMS与其他服务的关系
服务 | 交互方式 | 作用 |
---|---|---|
AMS(Activity Manager) | 查询App信息 | AMS需要知道哪些Activity能启动 |
Installd | 通过Socket通信 | 负责APK的安装、解压、优化 |
UserManager | Binder调用 | 多用户环境下管理App安装 |
五、开发者需要关注的PMS问题
1. 安装失败的可能原因
- 签名冲突:已经安装了相同包名但签名不同的APK
- 存储空间不足 :
/data
分区满了 - 权限问题 :没有
INSTALL_PACKAGES
权限(系统应用才有)
2. 查询已安装App
java
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
for (ApplicationInfo app : apps) {
Log.d("App", "包名: " + app.packageName);
}
3. 监听App安装/卸载
注册广播接收器:
xml
<receiver android:name=".AppInstallReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
4. 静默安装(需系统权限)
java
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(Uri.fromFile(new File("/sdcard/test.apk")));
intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, "com.android.packageinstaller");
startActivity(intent);
注意:普通App无法直接静默安装,需要系统签名或root权限。
六、PMS的常见问题
1. 为什么安装时提示"解析包错误"?
- APK文件损坏
- 不兼容的CPU架构(比如x86手机安装arm-only的APK)
2. 为什么卸载后数据没清理干净?
- 某些App在
AndroidManifest.xml
声明了android:allowBackup="true"
,数据可能被备份 - 有些厂商定制ROM会保留部分数据
3. 为什么App安装后找不到图标?
- 可能没有注册
Launcher Activity
(<category android:name="android.intent.category.LAUNCHER"/>
) - 可能是系统App,默认不显示
总结
- PMS是Android的App管理员,负责安装、卸载、管理权限。
- APK安装过程:拷贝文件 → 解析Manifest → 优化DEX → 更新数据库。
- 权限管理:安装时权限(旧版) vs. 运行时权限(Android 6.0+)。
- 开发者可以查询已安装App、监听安装卸载事件,但静默安装需要系统权限。
理解PMS,能让你更好地处理App安装、权限管理等问题! 🚀