電子政務(wù)網(wǎng)站代碼如何讓產(chǎn)品吸引顧客
文章目錄
- 前言
- 一、PMS 啟動流程
- 二、APK 安裝流程
- 三、APK 卸載流程
- 四、權(quán)限管理
- 靜態(tài)權(quán)限
- 動態(tài)權(quán)限
- 五、 數(shù)據(jù)存儲與一致性
- 六、 PMS 的安全性策略
- 1、權(quán)限檢查
- 2、簽名認(rèn)證
- 3、動態(tài)權(quán)限管理
- 4、應(yīng)用安裝驗證
- 5、保護系統(tǒng)目錄
- 七、PMS 調(diào)試方法
- 總結(jié)
前言
PackageManagerService(簡稱 PMS)是 Android 系統(tǒng)中的核心服務(wù)之一,負(fù)責(zé)應(yīng)用的安裝、卸載、查詢和權(quán)限管理等。它是 Android 應(yīng)用生命周期管理和安全機制的基石。
主要職責(zé):
1、應(yīng)用安裝與卸載
2、靜態(tài)權(quán)限解析與動態(tài)權(quán)限授予
3、應(yīng)用信息查詢
4、系統(tǒng)應(yīng)用的預(yù)加載
5、數(shù)據(jù)存儲與一致性管理
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、PMS 啟動流程
PMS 在系統(tǒng)啟動時由 SystemServer 啟動。其核心流程如下:
1、SystemServer 初始化
在 SystemServer 的 startBootstrapServices 方法中,調(diào)用 PackageManagerService.main(),完成 PMS 的創(chuàng)建和初始化。
2、關(guān)鍵方法解析
PackageManagerService.main()
public static PackageManagerService main(Context context, Installer installer, boolean factoryTest) {PackageManagerService pms = new PackageManagerService(context, installer, factoryTest);ServiceManager.addService("package", pms);return pms;
}
這里完成了:
1、PMS 對象的實例化。
2、將 PMS 注冊到 ServiceManager,供其他服務(wù)訪問。
3、掃描已安裝應(yīng)用
調(diào)用 scanDirLI 方法掃描 /system/app、/data/app 等目錄,加載所有已安裝的應(yīng)用包信息,并存儲到內(nèi)存和文件中(如 packages.xml)。
二、APK 安裝流程
APK 的安裝是 PMS 最重要的功能之一。從用戶觸發(fā)安裝到系統(tǒng)完成更新的完整流程如下:
1、入口方法 應(yīng)用安裝請求通過 PackageInstaller 模塊發(fā)起,最終調(diào)用 installPackageAsUser 方法。
public void installPackageAsUser(String originPath, InstallParams params, int userId) {mHandler.post(new InstallParams(originPath, params, userId));
}
此處將安裝請求交給 InstallParams 處理。
2、核心處理邏輯在 InstallParams 的 handleStartCopy 方法中,執(zhí)行以下步驟:
- 解析 APK 文件:通過 PackageParser 提取包名、版本等信息。
- 簽名校驗:調(diào)用 verifySignatures 確保 APK 簽名合法。
- 寫入系統(tǒng)記錄:調(diào)用 mSettings.addPackage() 更新系統(tǒng)數(shù)據(jù)。
- 通知系統(tǒng)服務(wù):更新系統(tǒng)組件(如 AMS)和廣播安裝完成事件
3、安裝完成廣播 APK 安裝完成后,PMS 會通過 Intent.ACTION_PACKAGE_ADDED 廣播通知其他組件。
三、APK 卸載流程
APK 卸載的主要流程類似于安裝,但涉及的數(shù)據(jù)清理步驟更多:
1、卸載入口 卸載請求通過 deletePackageAsUser 方法發(fā)起,最終調(diào)用 deletePackageLI 方法。
2、核心處理邏輯
清理應(yīng)用數(shù)據(jù):刪除 /data/app/ 目錄中的文件。
移除系統(tǒng)記錄:從 packages.xml 中刪除相關(guān)記錄。
廣播通知:通過 Intent.ACTION_PACKAGE_REMOVED 通知系統(tǒng)組件和應(yīng)用。
3、特殊情況 如果應(yīng)用包含共享庫或依賴的資源,PMS 會延遲清理,確保不會影響其他應(yīng)用。
四、權(quán)限管理
權(quán)限分為靜態(tài)權(quán)限和動態(tài)權(quán)限,PMS 通過解析 AndroidManifest.xml 和系統(tǒng)調(diào)用提供管理功能。
靜態(tài)權(quán)限
解析過程
在應(yīng)用安裝時,PMS 調(diào)用 PackageParser 的 parsePackage 方法,解析應(yīng)用的 AndroidManifest.xml 文件,提取 標(biāo)簽內(nèi)容。
PermissionInfo permission = new PermissionInfo();
permission.name = parser.getName();
mPermissions.add(permission);
動態(tài)權(quán)限
授予與撤銷
動態(tài)權(quán)限的管理主要通過 grantRuntimePermission 和 revokeRuntimePermission 方法實現(xiàn)。
public void grantRuntimePermission(String packageName, String permissionName, int userId) {enforcePermissionChecks(permissionName);mSettings.grantRuntimePermission(packageName, permissionName, userId);
}
實際場景
例如,在某些即時通訊應(yīng)用中,用戶拒絕麥克風(fēng)權(quán)限會導(dǎo)致無法發(fā)送語音消息。
五、 數(shù)據(jù)存儲與一致性
PMS 的數(shù)據(jù)存儲主要通過以下文件完成:
1、packages.xml 存儲應(yīng)用的基本信息,如包名、路徑、版本等。
<package name="com.example.app" codePath="/data/app/com.example.app-1/base.apk" />
2、runtime-permissions.xml 存儲動態(tài)權(quán)限授予記錄。
<permissions><permission name="android.permission.CAMERA" granted="true" />
</permissions>
3、一致性保障
鎖機制:PMS 使用鎖機制保護并發(fā)讀寫,確保數(shù)據(jù)一致性。
文件備份:在文件更新前,系統(tǒng)會先保存?zhèn)浞莞北?#xff0c;確保異常恢復(fù)能力。
六、 PMS 的安全性策略
PMS 是 Android 安全機制的核心,以下幾點尤為重要:
簽名校驗:通過驗證應(yīng)用簽名確保來源可信。
SELinux 策略:限制 PMS 的文件訪問權(quán)限,增強系統(tǒng)安全性。
權(quán)限隔離:動態(tài)權(quán)限機制確保用戶對敏感操作的控制權(quán)。
源碼介紹
1、權(quán)限檢查
PMS 負(fù)責(zé)管理應(yīng)用的權(quán)限,包括動態(tài)權(quán)限和安裝時權(quán)限。
權(quán)限檢查主要在 checkPermission() 和 checkUidPermission() 方法中完成。
源碼位置:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@Override
public int checkPermission(String permName, int uid) {final int permission = mSettings.getPermissionLocked(permName, uid);return (permission == PERMISSION_GRANTED) ? PERMISSION_GRANTED : PERMISSION_DENIED;
}
2、簽名認(rèn)證
在應(yīng)用安裝或更新時,PMS 會通過 verifySignatures() 方法驗證簽名是否一致。
防止未授權(quán)的 APK 替換已安裝的 APK。
源碼位置:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
private void verifySignatures(PackageParser.Package pkg, PackageSetting ps)throws PackageManagerException {if (!compareSignatures(pkg.mSigningDetails.signatures, ps.signatures.mSignatures)) {throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE,"Signature mismatch for " + pkg.packageName);}
}
3、動態(tài)權(quán)限管理
動態(tài)權(quán)限是通過運行時授予或拒絕的,主要涉及以下文件:
runtime-permissions.xml 用于存儲動態(tài)權(quán)限的狀態(tài)。
相關(guān)代碼示例:
源碼位置:
frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
public void grantRuntimePermission(String packageName, String permissionName, int userId) {// 檢查權(quán)限是否屬于動態(tài)權(quán)限enforceGrantRuntimePermission(packageName, permissionName, userId);// 更新權(quán)限的狀態(tài)mPermissionManager.grantRuntimePermission(packageName, permissionName, userId);
}
4、應(yīng)用安裝驗證
PMS 在應(yīng)用安裝時會調(diào)用 PackageInstaller 驗證 APK 文件的完整性。
相關(guān)代碼包括:
安裝路徑檢查
簽名校驗
安全區(qū)域限制
源碼位置:
frameworks/base/services/core/java/com/android/server/pm/PackageInstallerService.java
private void enforceSystemOrRoot(String message) {if (Binder.getCallingUid() != Process.SYSTEM_UID &&Binder.getCallingUid() != Process.ROOT_UID) {throw new SecurityException(message);}
}
5、保護系統(tǒng)目錄
只有系統(tǒng)權(quán)限的應(yīng)用才可以訪問 /system/app、/system/priv-app 等系統(tǒng)目錄。
安全性檢查代碼:
源碼位置:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
private boolean isPrivilegedApp(String packageName) {PackageSetting ps = mSettings.mPackages.get(packageName);return ps != null && ps.isPrivileged();
}
七、PMS 調(diào)試方法
開發(fā)或調(diào)試 PMS 時,可以使用以下方法:
1、日志調(diào)試
通過 adb logcat | grep PackageManager 查看安裝、卸載日志。
2、源碼定位
關(guān)注 PackageManagerService.java 文件,定位核心方法,如 installPackageAsUser 和 deletePackageLI。
3、文件檢查
檢查 /data/system/packages.xml 和 runtime-permissions.xml 文件內(nèi)容,排查問題。
總結(jié)
PMS 是 Android 系統(tǒng)中連接應(yīng)用、用戶和系統(tǒng)的橋梁,其源碼體現(xiàn)了安裝、卸載、權(quán)限管理的高效性和安全性。通過深挖源碼,理解其核心流程,可以幫助開發(fā)者更好地優(yōu)化和調(diào)試應(yīng)用。