深入浅出讲解安卓PMS

深入浅出讲解安卓PMS(Package Manager Service)

PMS(Package Manager Service ,包管理服务)是Android系统中负责安装、卸载、管理应用程序 的核心服务。它就像是手机里的App管理员,负责:

  • 安装APK(检查签名、解压、优化)
  • 卸载App(清理数据、移除权限)
  • 管理App信息(包名、版本、权限、四大组件)
  • 控制App的可见性(比如隐藏系统App)

一、PMS是干什么的?

想象你的手机是一个大商场,PMS就是商场管理员,负责:

  1. App的入驻(安装)

    • 检查APK是否合法(签名验证)
    • 分配"店铺位置"(数据目录 /data/app/
    • 登记信息(记录包名、版本、权限等)
  2. App的退出(卸载)

    • 删除APK文件
    • 清理数据目录(/data/data/<包名>
    • 移除权限和注册信息
  3. App的权限管理

    • 记录哪些权限被授予
    • 控制运行时权限(Android 6.0+)
  4. 查询App信息

    • 其他App或系统可以通过PMS查询已安装的App信息

二、PMS的核心工作流程

1. APK安装过程

当你安装一个APK时,PMS会做以下事情:

  1. 拷贝APK文件 → 放到 /data/app/<包名>(普通App)或 /system/app/(系统App)
  2. 解析AndroidManifest.xml → 读取包名、版本、权限、四大组件(Activity/Service等)
  3. 优化DEX文件 → 生成 .odex.vdex 加快运行速度
  4. 更新Package数据库 → 记录App信息到 /data/system/packages.xml
  5. 广播安装完成 → 发送 ACTION_PACKAGE_ADDED

注意 :系统App的APK放在 /system/app//system/priv-app/,普通App放在 /data/app/

2. APK卸载过程

当你卸载App时:

  1. 删除APK文件/data/app/<包名>
  2. 清理数据目录/data/data/<包名>
  3. 更新Package数据库packages.xml
  4. 广播卸载完成ACTION_PACKAGE_REMOVED

3. 权限管理

  • 安装时权限AndroidManifest.xml 里声明的)
    • 比如:INTERNETREAD_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安装、权限管理等问题! 🚀

相关推荐
闲倚一枝藤14 分钟前
兔子桌面官方下载-兔子桌面TV版-安卓电视版官方免费下载新版
android·电视盒子·智能电视·电视机·tv·机顶盒
信工院李平29 分钟前
安卓jks提取pem和pk8文件
android
二猛子41 分钟前
MySQL-多版本并发控制MVCC
android·mysql·adb
Yang-Never2 小时前
Git -> Git使用Patch失败error: patch failed: patch does not apply的解决办法
android·git·android studio
woodWu3 小时前
Android编译时动态插入代码原理与实践
android
百锦再4 小时前
Android Studio 实现自定义全局悬浮按钮
android·java·ide·app·android studio·安卓
百锦再4 小时前
Android Studio 项目文件夹结构详解
android·java·ide·ios·app·android studio·idea
老码识土5 小时前
Kotlin 协程源代码泛读:Continuation
android·kotlin
行墨6 小时前
Replugin 的hook点以及hook流程
android·架构
一一Null6 小时前
Access Token 和 Refresh Token 的双令牌机制,维持登陆状态
android·python·安全·flask