在 Android 系統中, App 的 install、升級、uninstall 及權限管理,都是由一個核心系統服務負責,那就是 PackageManagerService (PMS)。
這個服務可以視為 Android 系統的「應用管理中心」,所有與 APK (Android Package) 相關的操作,無論是安裝新應用,驗證數位簽章,或是查詢已安裝應用的資訊,最終都會交由 PMS 處理。
換句話說,當你在應用程式層呼叫 context.getPackageManager() 時,背後實際上就是透過 Binder 與 PMS 交互。
PackageManagerService pm = PackageManagerService.main(context, installer, factoryTest);
ServiceManager.addService("package", pm);
這邊發生了幾件事:
啟動流程簡化版:
SystemServer
│
├──> 啟動 PackageManagerService
│ ├── 掃描安裝目錄
│ ├── 解析 AndroidManifest.xml
│ ├── 建立快取
│ └── 註冊 Binder 服務
│
└──> 其他服務 (AMS, WMS, etc.)
當使用者透過 Google Play、ADB、或直接安裝 APK 檔案時,PMS 會負責完整的安裝流程。
安裝流程:
使用者 (adb / Play Store)
│
└──> PackageInstaller
│
└──> PMS.installPackageAsUser()
│
├── 解析 APK (PackageParser)
├── 驗證簽章
├── 權限檢查
├── 複製至 /data/app
├── 更新 packages.xml
└── 通知 AMS
PMS 在安裝階段,會先根據 AndroidManifest.xml 進行靜態驗證:
<uses-permission android:name="android.permission.CAMERA"/>
簽章驗證邏輯:
舊版 APK 簽章 == 新版 APK 簽章 ?
│
├── Yes → 允許升級
└── No → 拒絕安裝 (INSTALL_FAILED_UPDATE_INCOMPATIBLE)
這個機制保證了:
除了安裝流程,PMS 還要維護應用的全量資訊,並提供外部查詢接口。
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 的對應方法。
PackageManagerService 是 Android 系統中,應用生命週期的基石。
它的核心價值在於: