当前位置:   article > 正文

Android PMS赋予应用权限流程---安装默认赋予流程_android s legacypermissionmanagerservice

android s legacypermissionmanagerservice

base/services/core/java/com/android/server/pm/PackageManagerService.java

  1. @Override
  2. public void systemReady() {
  3. enforceSystemOrRoot("Only the system can claim the system is ready");
  4. ......
  5. mUserManager.systemReady();
  6. // Watch for external volumes that come and go over time
  7. final StorageManager storage = mInjector.getSystemService(StorageManager.class);
  8. storage.registerListener(mStorageListener);
  9. mInstallerService.systemReady();
  10. mPackageDexOptimizer.systemReady();
  11. // Now that we're mostly running, clean up stale users and apps
  12. mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL);
  13. reconcileApps(StorageManager.UUID_PRIVATE_INTERNAL);
  14. mPermissionManager.onSystemReady();
  15. int[] grantPermissionsUserIds = EMPTY_INT_ARRAY;
  16. final List<UserInfo> livingUsers = mInjector.getUserManagerInternal().getUsers(
  17. /* excludePartial= */ true,
  18. /* excludeDying= */ true,
  19. /* excludePreCreated= */ false);
  20. final int livingUserCount = livingUsers.size();
  21. for (int i = 0; i < livingUserCount; i++) {
  22. final int userId = livingUsers.get(i).id;
  23. if (mPmInternal.isPermissionUpgradeNeeded(userId)) {
  24. grantPermissionsUserIds = ArrayUtils.appendInt(
  25. grantPermissionsUserIds, userId);
  26. }
  27. }//权限处理
  28. // If we upgraded grant all default permissions before kicking off.
  29. for (int userId : grantPermissionsUserIds) {
  30. mLegacyPermissionManager.grantDefaultPermissions(userId);
  31. }
  32. if (grantPermissionsUserIds == EMPTY_INT_ARRAY) {
  33. // If we did not grant default permissions, we preload from this the
  34. // default permission exceptions lazily to ensure we don't hit the
  35. // disk on a new user creation.
  36. mLegacyPermissionManager.scheduleReadDefaultPermissionExceptions();
  37. }
  38. if (mInstantAppResolverConnection != null) {
  39. mContext.registerReceiver(new BroadcastReceiver() {
  40. @Override
  41. public void onReceive(Context context, Intent intent) {
  42. mInstantAppResolverConnection.optimisticBind();
  43. mContext.unregisterReceiver(this);
  44. }
  45. }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED));
  46. }
  47. ......
  48. }

base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java

grantPermissionsToSysComponentsAndPrivApps(pm, userId);//为sys组件和private-app赋予权限

  1. public void grantDefaultPermissions(int userId) {
  2. Log.d(TAG, " grantDefaultPermissions: " + Log.getStackTraceString(new Throwable()));
  3. Log.d(TAG, "grantDefaultPermissions " + userId);
  4. DelayingPackageManagerCache pm = new DelayingPackageManagerCache();
  5. grantPermissionsToSysComponentsAndPrivApps(pm, userId);
  6. grantDefaultSystemHandlerPermissions(pm, userId);
  7. grantDefaultPermissionExceptions(pm, userId);
  8. // Apply delayed state
  9. pm.apply();
  10. }
  11. /*********************************************************************************/
  12. private void grantPermissionsToSysComponentsAndPrivApps(DelayingPackageManagerCache pm,
  13. int userId) {
  14. Log.i(TAG, "Granting permissions to platform components for user " + userId);
  15. List<PackageInfo> packages = mContext.getPackageManager().getInstalledPackagesAsUser(
  16. DEFAULT_PACKAGE_INFO_QUERY_FLAGS, UserHandle.USER_SYSTEM);//获取包的相关信息
  17. for (PackageInfo pkg : packages) {
  18. if (pkg == null) {
  19. continue;
  20. }
  21. // Package info is already loaded, cache it
  22. Log.d(TAG, "pkg.packageNamer " + pkg.packageName);
  23. pm.addPackageInfo(pkg.packageName, pkg);
  24. if (!pm.isSysComponentOrPersistentPlatformSignedPrivApp(pkg)
  25. || !doesPackageSupportRuntimePermissions(pkg)
  26. || ArrayUtils.isEmpty(pkg.requestedPermissions)) {
  27. continue;
  28. }
  29. grantRuntimePermissionsForSystemPackage(pm, userId, pkg);//赋予权限
  30. }
  31. // Grant READ_PHONE_STATE to all system apps that have READ_PRIVILEGED_PHONE_STATE
  32. // R: CTA requirement - permission control
  33. if(!CTA_MANAGER.isCtaSupported()) {
  34. // Re-grant READ_PHONE_STATE as non-fixed to all system apps that have
  35. // READ_PRIVILEGED_PHONE_STATE and READ_PHONE_STATE granted -- this is to undo the fixed
  36. // grant from R.
  37. for (PackageInfo pkg : packages) {
  38. if (pkg == null
  39. || !doesPackageSupportRuntimePermissions(pkg)
  40. || ArrayUtils.isEmpty(pkg.requestedPermissions)
  41. || !pm.isGranted(Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
  42. pkg, UserHandle.of(userId))
  43. || !pm.isGranted(Manifest.permission.READ_PHONE_STATE, pkg,
  44. UserHandle.of(userId))) {
  45. continue;
  46. }
  47. pm.updatePermissionFlags(Manifest.permission.READ_PHONE_STATE, pkg,
  48. PackageManager.FLAG_PERMISSION_SYSTEM_FIXED,
  49. 0,
  50. UserHandle.of(userId));
  51. }
  52. }
  53. }
  54. /*******************************************************************************/
  55. private void grantRuntimePermissionsForSystemPackage(PackageManagerWrapper pm,
  56. int userId, PackageInfo pkg) {
  57. Set<String> permissions = new ArraySet<>();
  58. for (String permission : pkg.requestedPermissions) {
  59. final PermissionInfo perm = pm.getPermissionInfo(permission);
  60. if (perm == null) {
  61. continue;
  62. }
  63. Log.d(TAG,"protectionLevel perm.protectionLevel: " + perm.protectionLevel);
  64. Log.d(TAG,"permission: " + permission);
  65. if (perm.isRuntime()) {
  66. permissions.add(permission);
  67. }
  68. }
  69. if (!permissions.isEmpty()) {
  70. grantRuntimePermissions(pm, pkg, permissions, true /*systemFixed*/, userId);//权限
  71. }
  72. }
  73. /*******************************************************************************/
  74. private void grantRuntimePermissions(PackageManagerWrapper pm, PackageInfo pkg,
  75. Set<String> permissions, boolean systemFixed, int userId) {
  76. grantRuntimePermissions(pm, pkg, permissions, systemFixed, false,
  77. true /*whitelistRestrictedPermissions*/, userId);
  78. }
  79. /*******************************************************************************/

grantDefaultSystemHandlerPermissions(pm, userId);//为系统的指定的应用提供相应的特殊权限

  1. private void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int userId) {
  2. Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
  3. final PackagesProvider locationPackagesProvider;
  4. final PackagesProvider locationExtraPackagesProvider;
  5. final PackagesProvider voiceInteractionPackagesProvider;
  6. final PackagesProvider smsAppPackagesProvider;
  7. final PackagesProvider dialerAppPackagesProvider;
  8. final PackagesProvider simCallManagerPackagesProvider;
  9. final PackagesProvider useOpenWifiAppPackagesProvider;
  10. final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
  11. //config.xml中定义了具体的包名,例如 <string name="config_defaultDialer" translatable="false">com.android.dialer</string>
  12. synchronized (mLock) {
  13. locationPackagesProvider = mLocationPackagesProvider;
  14. locationExtraPackagesProvider = mLocationExtraPackagesProvider;
  15. voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
  16. smsAppPackagesProvider = mSmsAppPackagesProvider;
  17. dialerAppPackagesProvider = mDialerAppPackagesProvider;
  18. simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
  19. useOpenWifiAppPackagesProvider = mUseOpenWifiAppPackagesProvider;
  20. syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
  21. }
  22. String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
  23. ? voiceInteractionPackagesProvider.getPackages(userId) : null;
  24. String[] locationPackageNames = (locationPackagesProvider != null)
  25. ? locationPackagesProvider.getPackages(userId) : null;
  26. String[] locationExtraPackageNames = (locationExtraPackagesProvider != null)
  27. ? locationExtraPackagesProvider.getPackages(userId) : null;
  28. String[] smsAppPackageNames = (smsAppPackagesProvider != null)
  29. ? smsAppPackagesProvider.getPackages(userId) : null;
  30. String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
  31. ? dialerAppPackagesProvider.getPackages(userId) : null;
  32. String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
  33. ? simCallManagerPackagesProvider.getPackages(userId) : null;
  34. String[] useOpenWifiAppPackageNames = (useOpenWifiAppPackagesProvider != null)
  35. ? useOpenWifiAppPackagesProvider.getPackages(userId) : null;
  36. String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
  37. syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
  38. String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
  39. syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
  40. // Installer
  41. grantSystemFixedPermissionsToSystemPackage(pm,
  42. ArrayUtils.firstOrNull(getKnownPackages(
  43. PackageManagerInternal.PACKAGE_INSTALLER, userId)),
  44. userId, STORAGE_PERMISSIONS);//关注最后一个参数,是需要的权限组
  45. ......
  46. //其余的不分析,基本调用相似,都是为了给特定的应用赋予特定的权限
  47. }
  48. /******************************************************************************/
  49. @SafeVarargs
  50. private final void grantSystemFixedPermissionsToSystemPackage(PackageManagerWrapper pm,
  51. String packageName, int userId, Set<String>... permissionGroups) {
  52. grantPermissionsToSystemPackage(pm, packageName, userId, true /* systemFixed */,
  53. permissionGroups);
  54. }
  55. /******************************************************************************/
  56. @SafeVarargs
  57. private final void grantSystemFixedPermissionsToSystemPackage(PackageManagerWrapper pm,
  58. String packageName, int userId, Set<String>... permissionGroups) {
  59. grantPermissionsToSystemPackage(pm, packageName, userId, true /* systemFixed */,
  60. permissionGroups);
  61. }
  62. /******************************************************************************/
  63. @SafeVarargs
  64. private final void grantPermissionsToSystemPackage(PackageManagerWrapper pm, String packageName,
  65. int userId, boolean systemFixed, Set<String>... permissionGroups) {
  66. if (!pm.isSystemPackage(packageName)) {
  67. return;
  68. }
  69. grantPermissionsToPackage(pm, pm.getSystemPackageInfo(packageName),
  70. userId, systemFixed, false /* ignoreSystemPackage */,
  71. true /*whitelistRestrictedPermissions*/, permissionGroups);
  72. }
  73. /******************************************************************************/
  74. @SafeVarargs
  75. private final void grantPermissionsToPackage(PackageManagerWrapper pm, PackageInfo packageInfo,
  76. int userId, boolean systemFixed, boolean ignoreSystemPackage,
  77. boolean whitelistRestrictedPermissions, Set<String>... permissionGroups) {
  78. if (packageInfo == null) {
  79. return;
  80. }
  81. if (doesPackageSupportRuntimePermissions(packageInfo)) {
  82. for (Set<String> permissionGroup : permissionGroups) {
  83. grantRuntimePermissions(pm, packageInfo, permissionGroup, systemFixed,
  84. ignoreSystemPackage, whitelistRestrictedPermissions, userId);//重点此函数
  85. }
  86. }
  87. }
  88. /******************************************************************************/

grantDefaultPermissionExceptions(pm, userId);//从指定文件读取需要赋予的权限

  1. private void grantDefaultPermissionExceptions(PackageManagerWrapper pm, int userId) {
  2. mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
  3. Log.d(TAG,"grantDefaultPermissionExceptions");
  4. synchronized (mLock) {
  5. // mGrantExceptions is null only before the first read and then
  6. // it serves as a cache of the default grants that should be
  7. // performed for every user. If there is an entry then the app
  8. // is on the system image and supports runtime permissions.
  9. if (mGrantExceptions == null) {
  10. mGrantExceptions = readDefaultPermissionExceptionsLocked(pm);//获取那些权限需要被赋予
  11. }
  12. }
  13. Set<String> permissions = null;
  14. final int exceptionCount = mGrantExceptions.size();
  15. for (int i = 0; i < exceptionCount; i++) {
  16. String packageName = mGrantExceptions.keyAt(i);
  17. Logd(TAG,"grantDefaultPermissionExceptions packageName: " + packageName);
  18. PackageInfo pkg = pm.getSystemPackageInfo(packageName);
  19. List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i);
  20. final int permissionGrantCount = permissionGrants.size();
  21. for (int j = 0; j < permissionGrantCount; j++) {
  22. DefaultPermissionGrant permissionGrant = permissionGrants.get(j);
  23. if (!pm.isPermissionDangerous(permissionGrant.name)) {
  24. Log.w(TAG, "Ignoring permission " + permissionGrant.name
  25. + " which isn't dangerous");
  26. continue;
  27. }
  28. if (permissions == null) {
  29. permissions = new ArraySet<>();
  30. } else {
  31. permissions.clear();
  32. }
  33. permissions.add(permissionGrant.name);
  34. grantRuntimePermissions(pm, pkg, permissions, permissionGrant.fixed,
  35. permissionGrant.whitelisted, true /*whitelistRestrictedPermissions*/,
  36. userId);//赋予权限
  37. }
  38. }
  39. }
  40. /********************************************************************************/
  41. private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
  42. readDefaultPermissionExceptionsLocked(PackageManagerWrapper pm) {
  43. File[] files = getDefaultPermissionFiles();
  44. if (files == null) {
  45. return new ArrayMap<>(0);
  46. }
  47. ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>();
  48. // Iterate over the files in the directory and scan .xml files
  49. for (File file : files) {
  50. if (!file.getPath().endsWith(".xml")) {
  51. Slog.i(TAG, "Non-xml file " + file
  52. + " in " + file.getParent() + " directory, ignoring");
  53. continue;
  54. }
  55. if (!file.canRead()) {
  56. Slog.w(TAG, "Default permissions file " + file + " cannot be read");
  57. continue;
  58. }
  59. try (InputStream str = new FileInputStream(file)) {
  60. TypedXmlPullParser parser = Xml.resolvePullParser(str);
  61. parse(pm, parser, grantExceptions);
  62. } catch (XmlPullParserException | IOException e) {
  63. Slog.w(TAG, "Error reading default permissions file " + file, e);
  64. }
  65. }
  66. return grantExceptions;
  67. }
  68. /********************************************************************************/
  69. private File[] getDefaultPermissionFiles() {
  70. ArrayList<File> ret = new ArrayList<File>();
  71. File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
  72. if (dir.isDirectory() && dir.canRead()) {
  73. Collections.addAll(ret, dir.listFiles());
  74. Log.d(TAG,"getDefaultPermissionFiles dir.listFiles(): " + dir.listFiles().toString());
  75. }
  76. dir = new File(Environment.getVendorDirectory(), "etc/default-permissions");
  77. if (dir.isDirectory() && dir.canRead()) {
  78. Collections.addAll(ret, dir.listFiles());
  79. }
  80. dir = new File(Environment.getOdmDirectory(), "etc/default-permissions");
  81. if (dir.isDirectory() && dir.canRead()) {
  82. Collections.addAll(ret, dir.listFiles());
  83. }
  84. dir = new File(Environment.getProductDirectory(), "etc/default-permissions");
  85. if (dir.isDirectory() && dir.canRead()) {
  86. Collections.addAll(ret, dir.listFiles());
  87. }
  88. dir = new File(Environment.getSystemExtDirectory(), "etc/default-permissions");
  89. if (dir.isDirectory() && dir.canRead()) {
  90. Collections.addAll(ret, dir.listFiles());
  91. }
  92. // For IoT devices, we check the oem partition for default permissions for each app.
  93. if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
  94. dir = new File(Environment.getOemDirectory(), "etc/default-permissions");
  95. if (dir.isDirectory() && dir.canRead()) {
  96. Collections.addAll(ret, dir.listFiles());
  97. }
  98. }
  99. return ret.isEmpty() ? null : ret.toArray(new File[0]);
  100. }
  101. /********************************************************************************/

grantRuntimePermissions分析

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/261309
推荐阅读
相关标签
  

闽ICP备14008679号