diff options
-rw-r--r-- | core/res/res/values/ice_config.xml | 13 | ||||
-rw-r--r-- | core/res/res/values/ice_symbols.xml | 5 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 42 |
3 files changed, 60 insertions, 0 deletions
diff --git a/core/res/res/values/ice_config.xml b/core/res/res/values/ice_config.xml index 0dba9cbaeb9f..07802d7a3603 100644 --- a/core/res/res/values/ice_config.xml +++ b/core/res/res/values/ice_config.xml @@ -18,4 +18,17 @@ platform signatures, specifically for use on devices with a vendor partition. --> <string-array name="config_vendorPlatformSignatures"> </string-array> + + <!-- The list of components which should be automatically disabled for a specific device. + Note: this MUST not be used to randomly disable components, ask for approval first! --> + <string-array name="config_deviceDisabledComponents" translatable="false"> + </string-array> + + <!-- The list of components which should be automatically disabled for all devices. --> + <string-array name="config_globallyDisabledComponents" translatable="false"> + </string-array> + + <!-- The list of components which should be forced to be enabled. --> + <string-array name="config_forceEnabledComponents" translatable="false"> + </string-array> </resources> diff --git a/core/res/res/values/ice_symbols.xml b/core/res/res/values/ice_symbols.xml index 054e161f819b..c981eae9f9ca 100644 --- a/core/res/res/values/ice_symbols.xml +++ b/core/res/res/values/ice_symbols.xml @@ -16,4 +16,9 @@ <resources> <!-- Vendor signatures --> <java-symbol type="array" name="config_vendorPlatformSignatures" /> + + <!-- Package Manager --> + <java-symbol type="array" name="config_deviceDisabledComponents" /> + <java-symbol type="array" name="config_globallyDisabledComponents" /> + <java-symbol type="array" name="config_forceEnabledComponents" /> </resources> diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2d16f7430dc3..fec2adbbe5b3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1551,6 +1551,8 @@ public class PackageManagerService extends IPackageManager.Stub private final PackageProperty mPackageProperty = new PackageProperty(); + ArrayList<ComponentName> mDisabledComponentsList; + // Set of pending broadcasts for aggregating enable/disable of components. @VisibleForTesting(visibility = Visibility.PACKAGE) public static class PendingPackageBroadcasts { @@ -8076,6 +8078,17 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, "Deferred reconcileAppsData finished " + count + " packages"); }, "prepareAppData"); + // Disable components marked for disabling at build-time + mDisabledComponentsList = new ArrayList<ComponentName>(); + enableComponents(mContext.getResources().getStringArray( + com.android.internal.R.array.config_deviceDisabledComponents), false); + enableComponents(mContext.getResources().getStringArray( + com.android.internal.R.array.config_globallyDisabledComponents), false); + + // Enable components marked for forced-enable at build-time + enableComponents(mContext.getResources().getStringArray( + com.android.internal.R.array.config_forceEnabledComponents), true); + // If this is first boot after an OTA, and a normal boot, then // we need to clear code cache directories. // Note that we do *not* clear the application profiles. These remain valid @@ -8241,6 +8254,29 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, "Fix for b/169414761 is applied"); } + private void enableComponents(String[] components, boolean enable) { + // Disable or enable components marked at build-time + for (String name : components) { + ComponentName cn = ComponentName.unflattenFromString(name); + if (!enable) { + mDisabledComponentsList.add(cn); + } + Slog.v(TAG, "Changing enabled state of " + name + " to " + enable); + String className = cn.getClassName(); + PackageSetting pkgSetting = mSettings.mPackages.get(cn.getPackageName()); + if (pkgSetting == null || pkgSetting.pkg == null + || !AndroidPackageUtils.hasComponentClassName(pkgSetting.pkg, className)) { + Slog.w(TAG, "Unable to change enabled state of " + name + " to " + enable); + continue; + } + if (enable) { + pkgSetting.enableComponentLPw(className, UserHandle.USER_OWNER); + } else { + pkgSetting.disableComponentLPw(className, UserHandle.USER_OWNER); + } + } + } + /** * Uncompress and install stub applications. * <p>In order to save space on the system partition, some applications are shipped in a @@ -24181,6 +24217,12 @@ public class PackageManagerService extends IPackageManager.Stub public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags, int userId) { if (!mUserManager.exists(userId)) return; + // Don't allow to enable components marked for disabling at build-time + if (mDisabledComponentsList.contains(componentName)) { + Slog.d(TAG, "Ignoring attempt to set enabled state of disabled component " + + componentName.flattenToString()); + return; + } setEnabledSetting(componentName.getPackageName(), componentName.getClassName(), newState, flags, userId, null); } |