01-18-11 PackageManager接口设计分析

张开发
2026/4/14 23:08:41 15 分钟阅读

分享文章

01-18-11 PackageManager接口设计分析
01-18-11 PackageManager接口设计分析PackageManager接口概述PackageManager是Android系统中负责管理应用包APK的核心服务提供安装、卸载、查询应用信息等功能。核心职责1. 应用信息查询 - 获取已安装应用列表 - 查询应用详细信息 - 获取应用权限 2. 组件信息查询 - Activity/Service/BroadcastReceiver - ContentProvider - Intent过滤 3. 权限管理 - 权限授予/撤销 - 权限检查 - 运行时权限 4. 应用安装/卸载 - APK安装 - 应用卸载 - 应用更新PackageManager Public API核心接口定义/** * PackageManager抽象类 * frameworks/base/core/java/android/content/pm/PackageManager.java */publicabstractclassPackageManager{/** * 获取已安装应用列表 * API 1 */publicabstractListApplicationInfogetInstalledApplications(ApplicationInfoFlagsintflags);/** * 获取应用信息 * API 1 * throws NameNotFoundException 如果包不存在 */publicabstractApplicationInfogetApplicationInfo(StringpackageName,ApplicationInfoFlagsintflags)throwsNameNotFoundException;/** * 获取包信息 * API 1 */publicabstractPackageInfogetPackageInfo(StringpackageName,PackageInfoFlagsintflags)throwsNameNotFoundException;/** * 获取已安装包列表 * API 1 */publicabstractListPackageInfogetInstalledPackages(PackageInfoFlagsintflags);/** * 查询Activity * API 1 */publicabstractListResolveInfoqueryIntentActivities(Intentintent,ResolveInfoFlagsintflags);/** * 查询Service * API 1 */publicabstractListResolveInfoqueryIntentServices(Intentintent,ResolveInfoFlagsintflags);/** * 检查权限 * API 1 */CheckResultPermissionResultpublicabstractintcheckPermission(StringpermName,StringpkgName);/** * 获取应用签名 * API 28 */RequiresApi(28)publicabstractPackageInfogetPackageInfo(StringpackageName,PackageInfoFlagsintflags)throwsNameNotFoundException;// 权限结果常量publicstaticfinalintPERMISSION_GRANTED0;publicstaticfinalintPERMISSION_DENIED-1;// 标志位publicstaticfinalintGET_ACTIVITIES0x00000001;publicstaticfinalintGET_SERVICES0x00000004;publicstaticfinalintGET_PROVIDERS0x00000008;publicstaticfinalintGET_PERMISSIONS0x00001000;publicstaticfinalintGET_SIGNATURES0x00000040;// DeprecatedpublicstaticfinalintGET_SIGNING_CERTIFICATES0x08000000;// API 28}数据结构设计/** * 应用信息 */publicclassApplicationInfoextendsPackageItemInfoimplementsParcelable{/** 包名 */publicStringpackageName;/** 源代码路径 */publicStringsourceDir;/** Public源代码路径 */publicStringpublicSourceDir;/** Native库路径 */publicStringnativeLibraryDir;/** 数据目录 */publicStringdataDir;/** UID */publicintuid;/** Target SDK版本 */publicinttargetSdkVersion;/** 是否系统应用 */publicbooleanisSystemApp();/** 是否更新的系统应用 */publicbooleanisUpdatedSystemApp();// Parcelable实现...}/** * 包信息 */publicclassPackageInfoimplementsParcelable{/** 包名 */publicStringpackageName;/** 版本名 */publicStringversionName;/** 版本码 */publicintversionCode;/** Long版本码API 28 */RequiresApi(28)publiclonggetLongVersionCode();/** 应用信息 */publicApplicationInfoapplicationInfo;/** Activity列表 */publicActivityInfo[]activities;/** Service列表 */publicServiceInfo[]services;/** Provider列表 */publicProviderInfo[]providers;/** 权限列表 */publicString[]requestedPermissions;/** 签名信息API 28 */RequiresApi(28)publicSigningInfosigningInfo;// Parcelable实现...}/** * 签名信息API 28 */RequiresApi(28)publicclassSigningInfoimplementsParcelable{/** * 获取签名证书 */publicSignature[]getApkContentsSigners();/** * 获取签名历史 */publicSignature[]getSigningCertificateHistory();/** * 是否有多个签名者 */publicbooleanhasMultipleSigners();}PackageManagerService实现服务端架构/** * PackageManagerService核心实现 * frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java */publicclassPackageManagerServiceextendsIPackageManager.Stub{/** 已安装包Map */finalArrayMapString,PackageParser.PackagemPackagesnewArrayMap();/** Settings管理器 */finalSettingsmSettings;/** 权限管理器 */finalPermissionManagerServicemPermissionManager;/** 应用数据目录 */privatefinalFilemAppDataDir;/** * 获取应用信息 */OverridepublicApplicationInfogetApplicationInfo(StringpackageName,intflags,intuserId){if(!sUserManager.exists(userId))returnnull;// 过滤标志flagsupdateFlagsForApplication(flags,userId,packageName);// 包可见性检查Android 11if(!isPackageAvailable(packageName,userId)){returnnull;}synchronized(mPackages){PackageParser.PackagepmPackages.get(packageName);if(p!null){PackageSettingps(PackageSetting)p.mExtras;if(ps!null){returnPackageParser.generateApplicationInfo(p,flags,ps.readUserState(userId),userId);}}}returnnull;}/** * 安装APK */publicvoidinstallPackage(StringoriginPath,IPackageInstallObserver2observer,intinstallFlags,StringinstallerPackageName,intuserId){// 权限检查mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES,null);// 验证APKfinalFileoriginFilenewFile(originPath);PackageParser.PackagepkgparsePackage(originFile);if(pkgnull){notifyInstallFailed(observer,PackageManager.INSTALL_FAILED_INVALID_APK);return;}// 签名验证if(!verifySignatures(pkg)){notifyInstallFailed(observer,PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE);return;}// 执行安装installPackageInternal(pkg,installFlags,installerPackageName,userId);// 通知安装成功notifyInstallSuccess(observer,pkg.packageName);}/** * 卸载应用 */publicvoiddeletePackage(StringpackageName,IPackageDeleteObserverobserver,intuserId,intflags){// 权限检查mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DELETE_PACKAGES,null);synchronized(mPackages){PackageParser.PackagepkgmPackages.get(packageName);if(pkgnull){observer.packageDeleted(packageName,PackageManager.DELETE_FAILED_INTERNAL_ERROR);return;}// 删除应用数据deletePackageDataLocked(pkg,userId);// 删除APK文件deletePackageFilesLocked(pkg);// 从mPackages移除mPackages.remove(packageName);// 通知卸载成功observer.packageDeleted(packageName,PackageManager.DELETE_SUCCEEDED);}}/** * 授予运行时权限 */OverridepublicvoidgrantRuntimePermission(StringpackageName,StringpermissionName,finalintuserId){// 权限检查mContext.enforceCallingOrSelfPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS,grantRuntimePermission);// 委托给PermissionManagermPermissionManager.grantRuntimePermission(packageName,permissionName,userId);}}包可见性过滤Android 11/** * 包可见性过滤 * frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java */publicclassPackageManagerService{/** * 检查包是否对调用者可见 */privatebooleanisPackageAvailable(StringpackageName,intuserId){ApplicationInfocallingAppgetApplicationInfo(getCallingPackage(),0,userId);// targetSdk R (30)所有包可见if(callingApp.targetSdkVersionBuild.VERSION_CODES.R){returntrue;}// targetSdk R需要声明queries或满足可见性规则returnisPackageVisibleTo(packageName,getCallingPackage(),userId);}/** * 包可见性规则 */privatebooleanisPackageVisibleTo(StringtargetPackage,StringcallingPackage,intuserId){// 1. 系统应用可见所有包if(isSystemApp(callingPackage)){returntrue;}// 2. 检查queries声明if(hasQueriesDeclaration(callingPackage,targetPackage)){returntrue;}// 3. 同UID应用互相可见if(isSameUid(callingPackage,targetPackage)){returntrue;}// 4. 导出的组件Activity/Service/Provider可见if(hasExportedComponents(targetPackage)){returntrue;}// 5. 系统包如Settings、Launcher默认可见if(isDefaultVisiblePackage(targetPackage)){returntrue;}returnfalse;}}接口设计特点1. 抽象类设计/** * PackageManager使用抽象类而非接口 * 原因 * 1. 可以添加新方法并提供默认实现 * 2. 保持向后兼容性 * 3. 减少实现类的负担 */publicabstractclassPackageManager{/** * 新增方法 - 提供默认实现 * API 28 */RequiresApi(28)publicbooleanhasSigningCertificate(StringpackageName,byte[]certificate,CertificateInputTypeinttype){// 默认实现try{PackageInfopackageInfogetPackageInfo(packageName,GET_SIGNING_CERTIFICATES);if(packageInfo.signingInfonull){returnfalse;}// 验证证书returnverifyCertificate(packageInfo.signingInfo,certificate,type);}catch(NameNotFoundExceptione){returnfalse;}}}2. 权限分级/** * PackageManager权限分级 */publicclassPackageManagerService{/** * Public API - 无需权限 */publicListApplicationInfogetInstalledApplications(intflags){// 所有应用可调用returngetInstalledApplicationsInternal(flags,UserHandle.getCallingUserId());}/** * 需要特殊权限 */RequiresPermission(Manifest.permission.DELETE_PACKAGES)publicvoiddeletePackage(StringpackageName,IPackageDeleteObserverobserver,intuserId,intflags){// 需要DELETE_PACKAGES权限}/** * 系统API - 仅系统应用 * hide */SystemApiRequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS)publicvoidgrantRuntimePermission(StringpackageName,StringpermissionName,intuserId){// 仅系统应用可调用}}3. 标志位设计/** * PackageManager标志位设计 */publicabstractclassPackageManager{// 获取组件信息publicstaticfinalintGET_ACTIVITIES0x00000001;publicstaticfinalintGET_RECEIVERS0x00000002;publicstaticfinalintGET_SERVICES0x00000004;publicstaticfinalintGET_PROVIDERS0x00000008;// 获取权限信息publicstaticfinalintGET_PERMISSIONS0x00001000;// 获取签名废弃DeprecatedpublicstaticfinalintGET_SIGNATURES0x00000040;// 获取签名证书API 28RequiresApi(28)publicstaticfinalintGET_SIGNING_CERTIFICATES0x08000000;// 匹配系统包publicstaticfinalintMATCH_SYSTEM_ONLY0x00100000;// 匹配已禁用组件publicstaticfinalintMATCH_DISABLED_COMPONENTS0x00000200;// 使用示例// getPackageInfo(packageName, GET_ACTIVITIES | GET_PERMISSIONS)}接口使用示例查询已安装应用/** * 查询已安装应用 */fungetInstalledApps(context:Context):ListApplicationInfo{valpackageManagercontext.packageManagervalappsif(Build.VERSION.SDK_INTBuild.VERSION_CODES.R){// Android 11包可见性限制packageManager.getInstalledApplications(PackageManager.ApplicationInfoFlags.of(0))}else{Suppress(DEPRECATION)packageManager.getInstalledApplications(0)}// 过滤用户应用returnapps.filter{!it.isSystemApp()}}检查应用是否安装/** * 检查应用是否已安装 */funisAppInstalled(context:Context,packageName:String):Boolean{returntry{context.packageManager.getApplicationInfo(packageName,0)true}catch(e:PackageManager.NameNotFoundException){false}}获取应用签名/** * 获取应用签名 */fungetAppSignature(context:Context,packageName:String):String?{returntry{valpackageInfoif(Build.VERSION.SDK_INTBuild.VERSION_CODES.P){// Android 9.0使用GET_SIGNING_CERTIFICATEScontext.packageManager.getPackageInfo(packageName,PackageManager.GET_SIGNING_CERTIFICATES)}else{Suppress(DEPRECATION)context.packageManager.getPackageInfo(packageName,PackageManager.GET_SIGNATURES)}valsignaturesif(Build.VERSION.SDK_INTBuild.VERSION_CODES.P){packageInfo.signingInfo?.apkContentsSigners}else{Suppress(DEPRECATION)packageInfo.signatures}signatures?.firstOrNull()?.let{signature-valmdMessageDigest.getInstance(SHA-256)valdigestmd.digest(signature.toByteArray())digest.joinToString(){%02x.format(it)}}}catch(e:Exception){null}}查询可处理Intent的Activity/** * 查询可处理Intent的Activity */funqueryIntentActivities(context:Context,intent:Intent):ListResolveInfo{valpackageManagercontext.packageManagerreturnif(Build.VERSION.SDK_INTBuild.VERSION_CODES.TIRAMISU){packageManager.queryIntentActivities(intent,PackageManager.ResolveInfoFlags.of(0))}else{Suppress(DEPRECATION)packageManager.queryIntentActivities(intent,0)}}总结PackageManager接口设计特点抽象类设计支持默认实现保持向后兼容权限分级Public/System/Internal API分离标志位设计灵活的查询选项组合包可见性Android 11限制应用查询异常处理NameNotFoundException明确语义核心APIgetInstalledApplications()获取已安装应用getPackageInfo()获取包信息queryIntentActivities()查询Intent处理器checkPermission()检查权限installPackage()安装应用系统API设计原则最小暴露隐私保护包可见性权限控制敏感操作需要权限向后兼容targetSdk行为调整异常明确NameNotFoundExceptionAndroid 16 (API 36) PackageManager变化包可见性进一步收紧// Android 16包可见性规则更新// 更多系统包不再默认可见需要在 queries 中显式声明// Android 16 新增查询特定包需要额外声明// 包括更多系统服务和Intent过滤器valpmcontext.packageManagerRequiresApi(Build.VERSION_CODES.BAKLAVA)funcheckPackageVisibility(packageName:String):Boolean{// targetSdk 36: 可见性检查更严格returntry{pm.getApplicationInfo(packageName,PackageManager.ApplicationInfoFlags.of(0))true}catch(e:PackageManager.NameNotFoundException){false}}应用安装机制变化Android 16 PackageManagerService 变化 - 更严格的 APK 签名验证 - 新增应用完整性检查机制 - Split APK 安装流程优化 - 动态模块安装的 API 改进 - 应用卸载更彻底清理更多残留数据权限查询API扩展// Android 16新增权限查询APIRequiresApi(Build.VERSION_CODES.BAKLAVA)funqueryPermissionStatus(context:Context):MapString,Int{valpmcontext.packageManagervalpermissionspm.requestedPermissionsInfo(context.packageName,0)returnpermissions.associate{info-valstatuspm.checkPermission(info.name,context.packageName)info.nametostatus}}关键要点PackageManager体现了Android的包管理哲学通过抽象类设计、权限分级和包可见性保护用户隐私

更多文章