iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0

PackageManagerService (PMS)

intro

在 Android 系統中, App 的 install、升級、uninstall 及權限管理,都是由一個核心系統服務負責,那就是 PackageManagerService (PMS)。
這個服務可以視為 Android 系統的「應用管理中心」,所有與 APK (Android Package) 相關的操作,無論是安裝新應用,驗證數位簽章,或是查詢已安裝應用的資訊,最終都會交由 PMS 處理。

PMS 的系統定位與啟動過程

  1. PMS 的角色
    在 Android 架構中,PMS 屬於 系統服務 (System Service),由 SystemServer 啟動。
    它的核心任務是:
  • 管理所有應用程式的 install、uninstall與升級
  • 負責權限模型的落實(例如 AndroidManifest 中的 )
  • 維護 App 的簽章資訊,確保應用間的安全隔離
  • 提供查詢介面(透過 Binder IPC 對外暴露 PackageManager API)

換句話說,當你在應用程式層呼叫 context.getPackageManager() 時,背後實際上就是透過 Binder 與 PMS 交互。

  1. 啟動流程
    當 Android 系統開機時,SystemServer 啟動後,會呼叫以下流程:
PackageManagerService pm = PackageManagerService.main(context, installer, factoryTest);
ServiceManager.addService("package", pm);

這邊發生了幾件事:

  • 初始化 PMS → 掃描 /system/app, /vendor/app, /data/app 等目錄,載入已安裝的 APK
  • 構建應用資訊快取 → 將解析結果存入 PackageSetting 與 PackageParser.Package
  • 註冊到 ServiceManager → 讓 Binder IPC 可以被外部存取

啟動流程簡化版:

SystemServer
   │
   ├──> 啟動 PackageManagerService
   │        ├── 掃描安裝目錄
   │        ├── 解析 AndroidManifest.xml
   │        ├── 建立快取
   │        └── 註冊 Binder 服務
   │
   └──> 其他服務 (AMS, WMS, etc.)

APK 安裝流程

當使用者透過 Google Play、ADB、或直接安裝 APK 檔案時,PMS 會負責完整的安裝流程。

  1. 安裝流程的入口
    常見的三種安裝來源:
  • 使用者操作 (PackageInstaller) → UI 層透過 PackageInstaller.Session 啟動安裝
  • ADB 安裝 → adb install 最終也會呼叫 PMS
  • 系統應用安裝 → 開機自動安裝 system app
  1. 安裝過程
    以 adb install 為例,流程如下:
  2. PackageInstaller 傳送請求 → 經由 Binder 呼叫 PMS 的 installPackageAsUser()
    2 .解析 APK → 使用 PackageParser 分析 AndroidManifest.xml
    3 .檢查包名 (packageName) 是否衝突
  3. 驗證簽章
  4. 確認版本升級或全新安裝
  5. 權限驗證 → 檢查 uses-permission 是否合理
  6. 寫入檔案 → 將 APK 複製到 /data/app 目錄
  7. 更新資料庫 → 更新 packages.xml 與 packages.list
  8. 通知 AMS → PMS 會告知 AMS 有新應用需要加入到系統

安裝流程:

使用者 (adb / Play Store)
   │
   └──> PackageInstaller
          │
          └──> PMS.installPackageAsUser()
                     │
                     ├── 解析 APK (PackageParser)
                     ├── 驗證簽章
                     ├── 權限檢查
                     ├── 複製至 /data/app
                     ├── 更新 packages.xml
                     └── 通知 AMS

權限驗證與簽章機制

  1. 權限驗證
    在 Android 中,應用的權限分為三種層級:
  • 普通權限 (Normal):例如網路存取,不需要用戶同意,自動授予
  • 危險權限 (Dangerous):例如存取聯絡人、位置,需要使用者在運行時授權
  • 簽章權限 (Signature):僅允許與系統簽章相同的應用使用

PMS 在安裝階段,會先根據 AndroidManifest.xml 進行靜態驗證:

<uses-permission android:name="android.permission.CAMERA"/>
  • 若屬於系統權限,且不是系統應用,直接拒絕安裝
  • 若屬於危險權限,則標記為「待用戶確認」
  • 若屬於普通權限,直接授予
  1. 簽章驗證
    Android 採用 簽章機制 確保應用來源可信:
  • 每個 APK 在打包時會使用開發者的私鑰簽名
  • PMS 會在安裝時,使用對應的公鑰進行驗證
  • 若與舊版本簽章不一致 → 拒絕升級

簽章驗證邏輯:

舊版 APK 簽章 == 新版 APK 簽章 ?  
   │
   ├── Yes → 允許升級
   └── No  → 拒絕安裝 (INSTALL_FAILED_UPDATE_INCOMPATIBLE)

這個機制保證了:

  • 相同包名的應用程式,必須來自同一個開發者
  • 防止「假冒升級」的攻擊行為

APK 管理與應用查詢

除了安裝流程,PMS 還要維護應用的全量資訊,並提供外部查詢接口。

  1. APK 資訊維護
    主要存放位置:
  • /data/system/packages.xml:紀錄所有已安裝應用資訊
  • /data/system/packages.list:紀錄 UID 與應用對應關係
    這些檔案在開機時會被 PMS 讀取並載入到記憶體中。
  1. 對外 API
    開發者常用的查詢 API,例如:
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageInfo("com.example.app", 0);
ApplicationInfo appInfo = pm.getApplicationInfo("com.example.app", 0);
List<PackageInfo> allApps = pm.getInstalledPackages(0);

這些最終都會透過 Binder IPC,呼叫到 PMS 的對應方法。

questions

  • APK 安裝流程是怎麼走的?
  • 簽章驗證的作用是什麼?
  • PackageManager.getInstalledPackages() 的背後原理?
  • 如何實現應用升級不丟失資料?
  • 危險權限與普通權限差異?

Summary

PackageManagerService 是 Android 系統中,應用生命週期的基石。
它的核心價值在於:

  • 負責應用的 安裝、卸載、升級
  • 實現 Android 的 權限模型與安全驗證
  • 提供給開發者與系統的 應用資訊查詢能力

上一篇
#08
系列文
安豬複習10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言