From 1c4ae809d72bf004dc7c8b34b7797d9faf8b8489 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 19 Dec 2014 11:08:55 -0800 Subject: Allow OEM to specify . Some single-system-image builds may run on devices that lack certain hardware features. This change allows the OEM partition to mark a feature as "unavailable" which overrides the system image. Bug: 18801291 Change-Id: I0d81144ec92ee9a78c13b223bbba20a4aed23fa0 --- .../core/java/com/android/server/SystemConfig.java | 47 +++++++++++++++++----- 1 file changed, 37 insertions(+), 10 deletions(-) (limited to 'services/core/java/com/android/server/SystemConfig.java') diff --git a/services/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java index 92fbc1e..eb89f21 100644 --- a/services/core/java/com/android/server/SystemConfig.java +++ b/services/core/java/com/android/server/SystemConfig.java @@ -25,7 +25,11 @@ import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import android.util.Xml; + +import libcore.io.IoUtils; + import com.android.internal.util.XmlUtils; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -60,6 +64,10 @@ public class SystemConfig { // system configuration files. final ArrayMap mAvailableFeatures = new ArrayMap<>(); + // These are the features which this device doesn't support; the OEM + // partition uses these to opt-out of features from the system image. + final ArraySet mUnavailableFeatures = new ArraySet<>(); + public static final class PermissionEntry { public final String name; public int[] gids; @@ -145,9 +153,11 @@ public class SystemConfig { } // Iterate over the files in the directory and scan .xml files + File platformFile = null; for (File f : libraryDir.listFiles()) { // We'll read platform.xml last if (f.getPath().endsWith("etc/permissions/platform.xml")) { + platformFile = f; continue; } @@ -163,10 +173,10 @@ public class SystemConfig { readPermissionsFromXml(f, onlyFeatures); } - // Read permissions from .../etc/permissions/platform.xml last so it will take precedence - final File permFile = new File(Environment.getRootDirectory(), - "etc/permissions/platform.xml"); - readPermissionsFromXml(permFile, onlyFeatures); + // Read platform permissions last so it will take precedence + if (platformFile != null) { + readPermissionsFromXml(platformFile, onlyFeatures); + } } private void readPermissionsFromXml(File permFile, boolean onlyFeatures) { @@ -298,7 +308,18 @@ public class SystemConfig { XmlUtils.skipCurrentTag(parser); continue; - } else if ("allow-in-power-save".equals(name)) { + } else if ("unavailable-feature".equals(name)) { + String fname = parser.getAttributeValue(null, "name"); + if (fname == null) { + Slog.w(TAG, " without name at " + + parser.getPositionDescription()); + } else { + mUnavailableFeatures.add(fname); + } + XmlUtils.skipCurrentTag(parser); + continue; + + } else if ("allow-in-power-save".equals(name) && !onlyFeatures) { String pkgname = parser.getAttributeValue(null, "package"); if (pkgname == null) { Slog.w(TAG, " without package at " @@ -309,7 +330,7 @@ public class SystemConfig { XmlUtils.skipCurrentTag(parser); continue; - } else if ("fixed-ime-app".equals(name)) { + } else if ("fixed-ime-app".equals(name) && !onlyFeatures) { String pkgname = parser.getAttributeValue(null, "package"); if (pkgname == null) { Slog.w(TAG, " without package at " @@ -324,13 +345,19 @@ public class SystemConfig { XmlUtils.skipCurrentTag(parser); continue; } - } - permReader.close(); } catch (XmlPullParserException e) { - Slog.w(TAG, "Got execption parsing permissions.", e); + Slog.w(TAG, "Got exception parsing permissions.", e); } catch (IOException e) { - Slog.w(TAG, "Got execption parsing permissions.", e); + Slog.w(TAG, "Got exception parsing permissions.", e); + } finally { + IoUtils.closeQuietly(permReader); + } + + for (String fname : mUnavailableFeatures) { + if (mAvailableFeatures.remove(fname) != null) { + Slog.d(TAG, "Removed unavailable feature " + fname); + } } } -- cgit v1.1