目錄
一、概念與核心作用
二、技術架構與模塊組成
1. 分層架構
1.1 應用層架構細節
1.2 Binder接口層實現
1.3 PMS核心服務層
1.4 底層支持層實現
2. 核心模塊技術要點與工作流程
2.1 PackageParser
2.2 Settings
2.3 PermissionManager
2.4 Installer
2.5 ComponentManager
2.6 UserManagerService
三、啟動與初始化流程
1. 系統啟動時序
2. 關鍵初始化方法
四、關鍵技術要點
1. APK解析優化
2. 權限管理
3. 安裝優化技術
五、核心源碼解析
1. 關鍵類路徑
2. 安裝流程核心代碼
六、開發調試指南
1. 常用ADB命令
2. 日志過濾技巧
3. 調試技巧
七、典型問題排查
1. 安裝失敗常見原因
2. 權限問題調試
一、概念與核心作用
PackageManagerService(PMS)是Android系統的核心服務之一,負責全系統的應用包管理。它作為APK生命周期管理者,主要承擔以下核心職責:
-
應用安裝/卸載/更新管理
-
應用元數據解析與存儲
-
權限系統管理
-
組件(Activity/Service等)注冊管理
-
應用簽名驗證
-
多用戶應用配置管理
二、技術架構與模塊組成
1. 分層架構
+---------------------------+
| 應用層 (Java API) | # 開發者直接接觸的API
| - PackageManager |
| - ApplicationPackageManager |
+---------------------------+↓ Binder IPC
+---------------------------+
| Binder接口層 (AIDL) | # 跨進程通信橋梁
| - IPackageManager.aidl |
| - IPackageInstaller.aidl |
+---------------------------+↓ Service調用
+---------------------------+
| PMS核心服務層 (SystemServer) | # 核心業務邏輯實現
| - PackageManagerService |
| - PackageInstallerService |
| - DexManagerService |
+---------------------------+↓ JNI/Native調用
+---------------------------+
| 底層支持層 (Native/C++) | # 系統級底層操作
| - installd 守護進程 |
| - dex2oat (ART編譯器) |
| - SELinux策略引擎 |
+---------------------------+
1.1 應用層架構細節
- 核心類與功能
// 路徑:frameworks/base/core/java/android/content/pm/PackageManager.java public abstract class PackageManager {// 獲取應用信息public abstract ApplicationInfo getApplicationInfo(String packageName, int flags);// 查詢Activity組件public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);// 安裝APKpublic abstract void installPackage(Uri apkUri, IPackageInstallObserver observer, int flags); }
- 典型使用場景示例
// 檢查相機權限狀態 if (getPackageManager().checkPermission(Manifest.permission.CAMERA, "com.wechat") == PERMISSION_GRANTED) {// 啟動相機功能 }// 查詢所有瀏覽器應用 Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.setData(Uri.parse("http://")); List<ResolveInfo> browsers = pm.queryIntentActivities(intent, 0);
1.2 Binder接口層實現
- AIDL接口定義
// 路徑:frameworks/base/core/java/android/content/pm/IPackageManager.aidl interface IPackageManager {PackageInfo getPackageInfo(String packageName, int flags, int userId);int installPackage(String originPath, int installFlags, String installerPackageName, in ParcelFileDescriptor fd);void deletePackage(String packageName, int flags, int userId);// 共包含120+個方法 }
- Binder調用流程
// Client端調用示例 IPackageManager pm = ActivityThread.getPackageManager(); pm.installPackage("file:///sdcard/app.apk", INSTALL_FULL_APP, "com.android.packageinstaller", null);// Server端處理(PMS內部) private final IPackageManager.Stub mBinder = new IPackageManager.Stub() {@Overridepublic int installPackage(String originPath, int flags, String installerPackageName, ParcelFileDescriptor fd) {// 執行實際安裝邏輯return PMS.this.installPackage(...);} };
1.3 PMS核心服務層
- 服務類結構
// 路徑:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public class PackageManagerService extends IPackageManager.Stub {// 核心成員變量final Settings mSettings; // 配置存儲final Installer mInstaller; // 與installd交互final PermissionManagerService mPermissionManager; // 權限管理final Computer mComputer; // 組件查詢引擎// 關鍵數據結構final ArrayMap<String, PackageParser.Package> mPackages = new ArrayMap<>();final WatchedArrayMap<String, SharedLibraryEntry> mSharedLibraries = new WatchedArrayMap<>(); }
- 核心處理流程(以APK安裝為例)
void installPackageTracedLI(InstallArgs args, PackageInstalledInfo res) {// Phase 1: 預檢verifySignaturesLPr(args); // 簽名驗證checkDowngrade(args); // 版本降級檢查// Phase 2: 安裝準備mInstaller.createAppData(...); // 創建數據目錄copyApk(args.codeFile); // 復制APK到/data/app// Phase 3: