diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/com/android/server/SystemConfig.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index 697825dcefd7..ea0389f49a45 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -168,6 +168,10 @@ public class SystemConfig { // These are the permitted backup transport service components final ArraySet<ComponentName> mBackupTransportWhitelist = new ArraySet<>(); + // These are packages mapped to maps of component class name to default enabled state. + final ArrayMap<String, ArrayMap<String, Boolean>> mPackageComponentEnabledState = + new ArrayMap<>(); + // Package names that are exempted from private API blacklisting final ArraySet<String> mHiddenApiPackageWhitelist = new ArraySet<>(); @@ -301,6 +305,10 @@ public class SystemConfig { return mBackupTransportWhitelist; } + public ArrayMap<String, Boolean> getComponentsEnabledStates(String packageName) { + return mPackageComponentEnabledState.get(packageName); + } + public ArraySet<String> getDisabledUntilUsedPreinstalledCarrierApps() { return mDisabledUntilUsedPreinstalledCarrierApps; } @@ -846,6 +854,14 @@ public class SystemConfig { } XmlUtils.skipCurrentTag(parser); } break; + case "component-override": { + if (allowAppConfigs) { + readComponentOverrides(parser, permFile); + } else { + logNotAllowedInPartition(name, permFile, parser); + } + XmlUtils.skipCurrentTag(parser); + } break; case "backup-transport-whitelisted-service": { if (allowFeatures) { String serviceName = parser.getAttributeValue(null, "service"); @@ -1269,6 +1285,54 @@ public class SystemConfig { } } + private void readComponentOverrides(XmlPullParser parser, File permFile) + throws IOException, XmlPullParserException { + String pkgname = parser.getAttributeValue(null, "package"); + if (pkgname == null) { + Slog.w(TAG, "<component-override> without package in " + + permFile + " at " + parser.getPositionDescription()); + return; + } + + pkgname = pkgname.intern(); + + final int depth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, depth)) { + String name = parser.getName(); + if ("component".equals(name)) { + String clsname = parser.getAttributeValue(null, "class"); + String enabled = parser.getAttributeValue(null, "enabled"); + if (clsname == null) { + Slog.w(TAG, "<component> without class in " + + permFile + " at " + parser.getPositionDescription()); + return; + } else if (enabled == null) { + Slog.w(TAG, "<component> without enabled in " + + permFile + " at " + parser.getPositionDescription()); + return; + } + + if (clsname.startsWith(".")) { + clsname = pkgname + clsname; + } + + clsname = clsname.intern(); + + ArrayMap<String, Boolean> componentEnabledStates = + mPackageComponentEnabledState.get(pkgname); + if (componentEnabledStates == null) { + componentEnabledStates = new ArrayMap<>(); + mPackageComponentEnabledState.put(pkgname, + componentEnabledStates); + } + + componentEnabledStates.put(clsname, !"false".equals(enabled)); + } else { + XmlUtils.skipCurrentTag(parser); + } + } + } + private static boolean isSystemProcess() { return Process.myUid() == Process.SYSTEM_UID; } |
