summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android/server/SystemConfig.java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-12-19 11:08:55 -0800
committerJeff Sharkey <jsharkey@android.com>2014-12-19 11:09:20 -0800
commit1c4ae809d72bf004dc7c8b34b7797d9faf8b8489 (patch)
treec250609f57d2a9d66126d5d50b9344788e4abfb8 /services/core/java/com/android/server/SystemConfig.java
parent28fbe04052b95ada3c32d805f26d6d9ad5548d6b (diff)
downloadframeworks_base-1c4ae809d72bf004dc7c8b34b7797d9faf8b8489.zip
frameworks_base-1c4ae809d72bf004dc7c8b34b7797d9faf8b8489.tar.gz
frameworks_base-1c4ae809d72bf004dc7c8b34b7797d9faf8b8489.tar.bz2
Allow OEM to specify <unavailable-feature>.
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
Diffstat (limited to 'services/core/java/com/android/server/SystemConfig.java')
-rw-r--r--services/core/java/com/android/server/SystemConfig.java47
1 files changed, 37 insertions, 10 deletions
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<String, FeatureInfo> 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<String> 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, "<unavailable-feature> 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, "<allow-in-power-save> 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, "<fixed-ime-app> 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);
+ }
}
}