summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/res/res/values/ice_config.xml13
-rw-r--r--core/res/res/values/ice_symbols.xml5
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java42
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);
}