summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/system-current.txt2
-rw-r--r--cmds/idmap/scan.cpp64
-rw-r--r--core/java/android/content/pm/PackageParser.java37
-rw-r--r--core/res/res/values/attrs_manifest.xml8
-rw-r--r--core/res/res/values/public.xml4
-rw-r--r--core/tests/overlaytests/OverlayAppFiltered/Android.mk12
-rw-r--r--core/tests/overlaytests/OverlayAppFiltered/AndroidManifest.xml9
-rw-r--r--core/tests/overlaytests/OverlayAppFiltered/res/raw/lorem_ipsum.txt1
-rw-r--r--core/tests/overlaytests/OverlayAppFiltered/res/values/config.xml4
-rw-r--r--core/tests/overlaytests/OverlayAppFiltered/res/xml/integer.xml2
-rw-r--r--core/tests/overlaytests/OverlayAppFirst/Android.mk2
-rw-r--r--core/tests/overlaytests/OverlayAppSecond/Android.mk2
-rw-r--r--core/tests/overlaytests/OverlayTest/Android.mk2
-rw-r--r--core/tests/overlaytests/OverlayTestOverlay/Android.mk2
-rwxr-xr-xcore/tests/overlaytests/testrunner.py79
15 files changed, 185 insertions, 45 deletions
diff --git a/api/system-current.txt b/api/system-current.txt
index 3924f6396426..8274e79fa662 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1195,6 +1195,8 @@ package android {
field public static final int requiredFeature = 16844119; // 0x1010557
field public static final int requiredForAllUsers = 16843728; // 0x10103d0
field public static final int requiredNotFeature = 16844120; // 0x1010558
+ field public static final int requiredSystemPropertyName = 16844136; // 0x1010568
+ field public static final int requiredSystemPropertyValue = 16844137; // 0x1010569
field public static final int requiresFadingEdge = 16843685; // 0x10103a5
field public static final int requiresSmallestWidthDp = 16843620; // 0x1010364
field public static final int resizeClip = 16843983; // 0x10104cf
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
index 67874a8b9c02..d69dd79555a1 100644
--- a/cmds/idmap/scan.cpp
+++ b/cmds/idmap/scan.cpp
@@ -10,6 +10,7 @@
#include <androidfw/StreamingZipInflater.h>
#include <androidfw/ZipFileRO.h>
#include <cutils/jstring.h>
+#include <cutils/properties.h>
#include <private/android_filesystem_config.h> // for AID_SYSTEM
#include <utils/SortedVector.h>
#include <utils/String16.h>
@@ -82,12 +83,26 @@ namespace {
return String8(tmp);
}
+ bool check_property(String16 property, String16 value) {
+ const char *prop;
+ const char *val;
+
+ prop = strndup16to8(property.string(), property.size());
+ char propBuf[PROPERTY_VALUE_MAX];
+ property_get(prop, propBuf, NULL);
+ val = strndup16to8(value.string(), value.size());
+
+ return (strcmp(propBuf, val) == 0);
+ }
+
int parse_overlay_tag(const ResXMLTree& parser, const char *target_package_name,
bool* is_static_overlay)
{
const size_t N = parser.getAttributeCount();
String16 target;
int priority = -1;
+ String16 propName = String16();
+ String16 propValue = String16();
for (size_t i = 0; i < N; ++i) {
size_t len;
String16 key(parser.getAttributeName(i, &len));
@@ -109,34 +124,32 @@ namespace {
if (parser.getAttributeValue(i, &v) == sizeof(Res_value)) {
*is_static_overlay = (v.data != 0);
}
- }
- }
- if (target == String16(target_package_name)) {
- return priority;
- }
- return NO_OVERLAY_TAG;
- }
-
- String16 parse_package_name(const ResXMLTree& parser)
- {
- const size_t N = parser.getAttributeCount();
- String16 package_name;
- for (size_t i = 0; i < N; ++i) {
- size_t len;
- String16 key(parser.getAttributeName(i, &len));
- if (key == String16("package")) {
+ } else if (key == String16("requiredSystemPropertyName")) {
const char16_t *p = parser.getAttributeStringValue(i, &len);
if (p != NULL) {
- package_name = String16(p, len);
+ propName = String16(p, len);
+ }
+ } else if (key == String16("requiredSystemPropertyValue")) {
+ const char16_t *p = parser.getAttributeStringValue(i, &len);
+ if (p != NULL) {
+ propValue = String16(p, len);
}
}
}
- return package_name;
- }
- bool isValidStaticOverlayPackage(const String16& package_name) {
- // TODO(b/35742444): Need to support selection method based on a package name.
- return package_name.size() > 0;
+ // Note that conditional property enablement/exclusion only applies if
+ // the attribute is present. In its absence, all overlays are presumed enabled.
+ if (propName.size() > 0 && propValue.size() > 0) {
+ // if property set & equal to value, then include overlay - otherwise skip
+ if (!check_property(propName, propValue)) {
+ return NO_OVERLAY_TAG;
+ }
+ }
+
+ if (target == String16(target_package_name)) {
+ return priority;
+ }
+ return NO_OVERLAY_TAG;
}
int parse_manifest(const void *data, size_t size, const char *target_package_name)
@@ -149,7 +162,6 @@ namespace {
}
ResXMLParser::event_code_t type;
- String16 package_name;
bool is_static_overlay = false;
int priority = NO_OVERLAY_TAG;
do {
@@ -157,16 +169,14 @@ namespace {
if (type == ResXMLParser::START_TAG) {
size_t len;
String16 tag(parser.getElementName(&len));
- if (tag == String16("manifest")) {
- package_name = parse_package_name(parser);
- } else if (tag == String16("overlay")) {
+ if (tag == String16("overlay")) {
priority = parse_overlay_tag(parser, target_package_name, &is_static_overlay);
break;
}
}
} while (type != ResXMLParser::BAD_DOCUMENT && type != ResXMLParser::END_DOCUMENT);
- if (is_static_overlay && isValidStaticOverlayPackage(package_name)) {
+ if (is_static_overlay) {
return priority;
}
return NO_OVERLAY_TAG;
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 11c658a1d4cf..cc0bf0db164a 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -64,6 +64,7 @@ import android.os.FileUtils;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PatternMatcher;
+import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.system.ErrnoException;
@@ -2111,6 +2112,12 @@ public class PackageParser {
pkg.mIsStaticOverlay = sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestResourceOverlay_isStatic,
false);
+ final String propName = sa.getString(
+ com.android.internal.R.styleable
+ .AndroidManifestResourceOverlay_requiredSystemPropertyName);
+ final String propValue = sa.getString(
+ com.android.internal.R.styleable
+ .AndroidManifestResourceOverlay_requiredSystemPropertyValue);
sa.recycle();
if (pkg.mOverlayTarget == null) {
@@ -2118,15 +2125,22 @@ public class PackageParser {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return null;
}
+
if (pkg.mOverlayPriority < 0 || pkg.mOverlayPriority > 9999) {
outError[0] = "<overlay> priority must be between 0 and 9999";
mParseError =
PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return null;
}
- if (pkg.mIsStaticOverlay) {
- // TODO(b/35742444): Need to support selection method based on a package name.
+
+ // check to see if overlay should be excluded based on system property condition
+ if (!checkOverlayRequiredSystemProperty(propName, propValue)) {
+ Slog.i(TAG, "Skipping target and overlay pair " + pkg.mOverlayTarget + " and "
+ + pkg.baseCodePath+ ": overlay ignored due to required system property: "
+ + propName + " with value: " + propValue);
+ return null;
}
+
XmlUtils.skipCurrentTag(parser);
} else if (tagName.equals(TAG_KEY_SETS)) {
@@ -2531,6 +2545,25 @@ public class PackageParser {
return pkg;
}
+ private boolean checkOverlayRequiredSystemProperty(String propName, String propValue) {
+
+ if (TextUtils.isEmpty(propName) || TextUtils.isEmpty(propValue)) {
+ if (!TextUtils.isEmpty(propName) || !TextUtils.isEmpty(propValue)) {
+ // malformed condition - incomplete
+ Slog.w(TAG, "Disabling overlay - incomplete property :'" + propName
+ + "=" + propValue + "' - require both requiredSystemPropertyName"
+ + " AND requiredSystemPropertyValue to be specified.");
+ return false;
+ }
+ // no valid condition set - so no exclusion criteria, overlay will be included.
+ return true;
+ }
+
+ // check property value - make sure it is both set and equal to expected value
+ final String currValue = SystemProperties.get(propName);
+ return (currValue != null && currValue.equals(propValue));
+ }
+
/**
* This is a pre-density application which will get scaled - instead of being pixel perfect.
* This type of application is not resizable.
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 569646820402..95ba94209343 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -2439,6 +2439,14 @@
<!-- Whether the given RRO is static or not. -->
<attr name="isStatic" format="boolean" />
+ <!-- Required property name/value pair used to enable this overlay.
+ e.g. name=ro.oem.sku value=MKT210.
+ Overlay will be ignored unless system property exists and is
+ set to specified value -->
+ <!-- @hide @SystemApi This shouldn't be public. -->
+ <attr name="requiredSystemPropertyName" format="string" />
+ <!-- @hide @SystemApi This shouldn't be public. -->
+ <attr name="requiredSystemPropertyValue" format="string" />
</declare-styleable>
<!-- Declaration of an {@link android.content.Intent} object in XML. May
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index d6ed1786e760..675edd4f5326 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2817,6 +2817,10 @@
<public name="defaultFocusHighlightEnabled" />
<public name="persistentFeature"/>
<public name="windowSplashscreenContent" />
+ <!-- @hide @SystemApi -->
+ <public name="requiredSystemPropertyName" />
+ <!-- @hide @SystemApi -->
+ <public name="requiredSystemPropertyValue" />
</public-group>
<public-group type="style" first-id="0x010302e0">
diff --git a/core/tests/overlaytests/OverlayAppFiltered/Android.mk b/core/tests/overlaytests/OverlayAppFiltered/Android.mk
new file mode 100644
index 000000000000..8ba21df189f0
--- /dev/null
+++ b/core/tests/overlaytests/OverlayAppFiltered/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_JAVA_LIBRARIES += legacy-test
+
+LOCAL_SDK_VERSION := system_current
+
+LOCAL_PACKAGE_NAME := com.android.overlaytest.filtered_app_overlay
+
+include $(BUILD_PACKAGE)
diff --git a/core/tests/overlaytests/OverlayAppFiltered/AndroidManifest.xml b/core/tests/overlaytests/OverlayAppFiltered/AndroidManifest.xml
new file mode 100644
index 000000000000..5b7950a25fbf
--- /dev/null
+++ b/core/tests/overlaytests/OverlayAppFiltered/AndroidManifest.xml
@@ -0,0 +1,9 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.overlaytest.filtered_app_overlay"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <overlay android:targetPackage="com.android.overlaytest"
+ android:requiredSystemPropertyName="persist.oem.overlay.test"
+ android:requiredSystemPropertyValue="foo"
+ android:priority="3"/>
+</manifest>
diff --git a/core/tests/overlaytests/OverlayAppFiltered/res/raw/lorem_ipsum.txt b/core/tests/overlaytests/OverlayAppFiltered/res/raw/lorem_ipsum.txt
new file mode 100644
index 000000000000..0954cedeb5d5
--- /dev/null
+++ b/core/tests/overlaytests/OverlayAppFiltered/res/raw/lorem_ipsum.txt
@@ -0,0 +1 @@
+Lorem ipsum: filtered overlays.
diff --git a/core/tests/overlaytests/OverlayAppFiltered/res/values/config.xml b/core/tests/overlaytests/OverlayAppFiltered/res/values/config.xml
new file mode 100644
index 000000000000..60b94eec5994
--- /dev/null
+++ b/core/tests/overlaytests/OverlayAppFiltered/res/values/config.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="str">filtered</string>
+</resources>
diff --git a/core/tests/overlaytests/OverlayAppFiltered/res/xml/integer.xml b/core/tests/overlaytests/OverlayAppFiltered/res/xml/integer.xml
new file mode 100644
index 000000000000..e2652b7e2915
--- /dev/null
+++ b/core/tests/overlaytests/OverlayAppFiltered/res/xml/integer.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<integer value="3"/>
diff --git a/core/tests/overlaytests/OverlayAppFirst/Android.mk b/core/tests/overlaytests/OverlayAppFirst/Android.mk
index ee991fcd919a..51f4487fb25f 100644
--- a/core/tests/overlaytests/OverlayAppFirst/Android.mk
+++ b/core/tests/overlaytests/OverlayAppFirst/Android.mk
@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_JAVA_LIBRARIES += legacy-test
LOCAL_SDK_VERSION := current
diff --git a/core/tests/overlaytests/OverlayAppSecond/Android.mk b/core/tests/overlaytests/OverlayAppSecond/Android.mk
index 87402c43dd9a..b3cfd1817cbf 100644
--- a/core/tests/overlaytests/OverlayAppSecond/Android.mk
+++ b/core/tests/overlaytests/OverlayAppSecond/Android.mk
@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_JAVA_LIBRARIES += legacy-test
LOCAL_SDK_VERSION := current
diff --git a/core/tests/overlaytests/OverlayTest/Android.mk b/core/tests/overlaytests/OverlayTest/Android.mk
index 4767e52c0816..964348fab881 100644
--- a/core/tests/overlaytests/OverlayTest/Android.mk
+++ b/core/tests/overlaytests/OverlayTest/Android.mk
@@ -7,6 +7,8 @@ LOCAL_PACKAGE_NAME := OverlayTest
LOCAL_DEX_PREOPT := false
+LOCAL_JAVA_LIBRARIES += legacy-test
+
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/core/tests/overlaytests/OverlayTestOverlay/Android.mk b/core/tests/overlaytests/OverlayTestOverlay/Android.mk
index b1327f713ae7..5265d9169f7f 100644
--- a/core/tests/overlaytests/OverlayTestOverlay/Android.mk
+++ b/core/tests/overlaytests/OverlayTestOverlay/Android.mk
@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_JAVA_LIBRARIES += legacy-test
LOCAL_SDK_VERSION := current
diff --git a/core/tests/overlaytests/testrunner.py b/core/tests/overlaytests/testrunner.py
index 2aa25adeda5d..e88805e8cbf1 100755
--- a/core/tests/overlaytests/testrunner.py
+++ b/core/tests/overlaytests/testrunner.py
@@ -13,6 +13,7 @@ TASK_COMPILATION = 'compile'
TASK_DISABLE_OVERLAYS = 'disable overlays'
TASK_ENABLE_MULTIPLE_OVERLAYS = 'enable multiple overlays'
TASK_ENABLE_SINGLE_OVERLAY = 'enable single overlay'
+TASK_ENABLE_FILTERED_OVERLAYS = 'enable filtered overlays'
TASK_FILE_EXISTS_TEST = 'test (file exists)'
TASK_GREP_IDMAP_TEST = 'test (grep idmap)'
TASK_MD5_TEST = 'test (md5)'
@@ -25,6 +26,7 @@ TASK_PUSH = 'push'
TASK_ROOT = 'root'
TASK_REMOUNT = 'remount'
TASK_RM = 'rm'
+TASK_SETPROP = 'setprop'
TASK_SETUP_IDMAP_PATH = 'setup idmap --path'
TASK_SETUP_IDMAP_SCAN = 'setup idmap --scan'
TASK_START = 'start'
@@ -188,7 +190,10 @@ class PushTask:
return "%s -> %s" % (self.src, self.dest)
def execute(self):
- src = os.getenv('OUT') + "/" + self.src
+ src = os.getenv('OUT')
+ if (src is None):
+ return 1, "", "Unable to proceed - $OUT environment var not set\n"
+ src += "/" + self.src
argv = shlex.split(adb + ' push %s %s' % (src, self.dest))
proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
@@ -219,10 +224,24 @@ class RmTask:
def execute(self):
returncode, stdout, stderr = _adb_shell('ls %s' % self.path)
- if returncode != 0 and stdout.endswith(': No such file or directory\n'):
+ if returncode != 0 and stderr.endswith(': No such file or directory\n'):
return 0, "", ""
return _adb_shell('rm -r %s' % self.path)
+class SetPropTask:
+ def __init__(self, prop, value):
+ self.prop = prop
+ self.value = value
+
+ def get_type(self):
+ return TASK_SETPROP
+
+ def get_name(self):
+ return self.prop
+
+ def execute(self):
+ return _adb_shell('setprop %s %s' % (self.prop, self.value))
+
class IdmapPathTask:
def __init__(self, path_target_apk, path_overlay_apk, path_idmap):
self.path_target_apk = path_target_apk
@@ -236,7 +255,7 @@ class IdmapPathTask:
return self.path_idmap
def execute(self):
- return _adb_shell('su system idmap --path "%s" "%s" "%s"' % (self.path_target_apk, self.path_overlay_apk, self.path_idmap))
+ return _adb_shell('su system idmap --scan "%s" "%s" "%s" "%s"' % (self.target_pkg_name, self.target_pkg, self.idmap_dir, self.overlay_dir))
class IdmapScanTask:
def __init__(self, overlay_dir, target_pkg_name, target_pkg, idmap_dir, symlink_dir):
@@ -411,8 +430,12 @@ def _create_disable_overlays_task():
RmTask("/data/resource-cache/vendor@overlay@framework_b.apk@idmap"),
RmTask("/vendor/overlay/app_a.apk"),
RmTask("/vendor/overlay/app_b.apk"),
+ RmTask("/vendor/overlay/app_c.apk"),
RmTask("/data/resource-cache/vendor@overlay@app_a.apk@idmap"),
RmTask("/data/resource-cache/vendor@overlay@app_b.apk@idmap"),
+ RmTask("/data/resource-cache/vendor@overlay@app_c.apk@idmap"),
+ SetPropTask('persist.oem.overlay.test', '""'),
+ RmTask("/data/property/persist.oem.overlay.test"),
]
return CompoundTask(TASK_DISABLE_OVERLAYS, tasks)
@@ -435,9 +458,23 @@ def _create_enable_multiple_overlays_task():
PushTask('/data/app/com.android.overlaytest.overlay/com.android.overlaytest.overlay.apk', '/vendor/overlay/framework_b.apk'),
PushTask('/data/app/com.android.overlaytest.first_app_overlay/com.android.overlaytest.first_app_overlay.apk', '/vendor/overlay/app_a.apk'),
PushTask('/data/app/com.android.overlaytest.second_app_overlay/com.android.overlaytest.second_app_overlay.apk', '/vendor/overlay/app_b.apk'),
+ PushTask('/data/app/com.android.overlaytest.filtered_app_overlay/com.android.overlaytest.filtered_app_overlay.apk', '/vendor/overlay/app_c.apk'),
]
return CompoundTask(TASK_ENABLE_MULTIPLE_OVERLAYS, tasks)
+def _create_enable_filtered_overlays_task():
+ tasks = [
+ _create_disable_overlays_task(),
+ SetPropTask('persist.oem.overlay.test', 'foo'),
+ MkdirTask('/system/vendor'),
+ MkdirTask('/vendor/overlay'),
+ PushTask('/data/app/com.android.overlaytest.overlay/com.android.overlaytest.overlay.apk', '/vendor/overlay/framework_b.apk'),
+ PushTask('/data/app/com.android.overlaytest.first_app_overlay/com.android.overlaytest.first_app_overlay.apk', '/vendor/overlay/app_a.apk'),
+ PushTask('/data/app/com.android.overlaytest.second_app_overlay/com.android.overlaytest.second_app_overlay.apk', '/vendor/overlay/app_b.apk'),
+ PushTask('/data/app/com.android.overlaytest.filtered_app_overlay/com.android.overlaytest.filtered_app_overlay.apk', '/vendor/overlay/app_c.apk'),
+ ]
+ return CompoundTask(TASK_ENABLE_FILTERED_OVERLAYS, tasks)
+
def _create_setup_idmap_path_task(idmaps, symlinks):
tasks = [
_create_enable_single_overlay_task(),
@@ -450,12 +487,11 @@ def _create_setup_idmap_path_task(idmaps, symlinks):
def _create_setup_idmap_scan_task(idmaps, symlinks):
tasks = [
- _create_enable_single_overlay_task(),
+ _create_enable_filtered_overlays_task(),
RmTask(symlinks),
RmTask(idmaps),
MkdirTask(idmaps),
MkdirTask(symlinks),
- _create_enable_multiple_overlays_task(),
]
return CompoundTask(TASK_SETUP_IDMAP_SCAN, tasks)
@@ -538,7 +574,7 @@ def _create_opt_parser():
help='do not rebuild test projects')
parser.add_option('-i', '--test-idmap', action='store_true',
dest='test_idmap', default=False,
- help='run tests for single overlay')
+ help='run tests for idmap')
parser.add_option('-0', '--test-no-overlay', action='store_true',
dest='test_no_overlay', default=False,
help='run tests without any overlay')
@@ -548,16 +584,21 @@ def _create_opt_parser():
parser.add_option('-2', '--test-multiple-overlays', action='store_true',
dest='test_multiple_overlays', default=False,
help='run tests for multiple overlays')
+ parser.add_option('-3', '--test-filtered-overlays', action='store_true',
+ dest='test_filtered_overlays', default=False,
+ help='run tests for filtered (sys prop) overlays')
return parser
if __name__ == '__main__':
opt_parser = _create_opt_parser()
opts, args = opt_parser.parse_args(sys.argv[1:])
- if not opts.test_idmap and not opts.test_no_overlay and not opts.test_single_overlay and not opts.test_multiple_overlays:
+ if not opts.test_idmap and not opts.test_no_overlay and not opts.test_single_overlay and not opts.test_multiple_overlays and not opts.test_filtered_overlays:
opts.test_idmap = True
opts.test_no_overlay = True
opts.test_single_overlay = True
opts.test_multiple_overlays = True
+ opts.test_filtered_overlays = True
+
if len(args) > 0:
opt_parser.error("unexpected arguments: %s" % " ".join(args))
# will never reach this: opt_parser.error will call sys.exit
@@ -580,6 +621,7 @@ if __name__ == '__main__':
tasks.append(CompilationTask('OverlayTestOverlay/Android.mk'))
tasks.append(CompilationTask('OverlayAppFirst/Android.mk'))
tasks.append(CompilationTask('OverlayAppSecond/Android.mk'))
+ tasks.append(CompilationTask('OverlayAppFiltered/Android.mk'))
# remount filesystem, install test project
tasks.append(RootTask())
@@ -600,13 +642,13 @@ if __name__ == '__main__':
tasks.append(GrepIdmapTest(idmaps + '/a.idmap', 'bool/config_annoy_dianne', 1))
# idmap --scan
- idmap = idmaps + '/vendor@overlay@framework_b.apk@idmap'
tasks.append(StopTask())
tasks.append(_create_setup_idmap_scan_task(idmaps, symlinks))
tasks.append(StartTask())
tasks.append(IdmapScanTask('/vendor/overlay', 'android', '/system/framework/framework-res.apk', idmaps, symlinks))
- tasks.append(FileExistsTest(idmap))
- tasks.append(GrepIdmapTest(idmap, 'bool/config_annoy_dianne', 1))
+ tasks.append(FileExistsTest(idmaps + '/vendor@overlay@framework_b.apk@idmap'))
+ tasks.append(GrepIdmapTest(idmaps + '/vendor@overlay@framework_b.apk@idmap', 'bool/config_annoy_dianne', 1))
+
# overlays.list
overlays_list_path = idmaps + '/overlays.list'
@@ -620,27 +662,38 @@ if __name__ == '__main__':
tasks.append(RmTask(symlinks))
tasks.append(RmTask(idmaps))
- # test no overlay
+ # test no overlay: all overlays cleared
if opts.test_no_overlay:
tasks.append(StopTask())
tasks.append(_create_disable_overlays_task())
tasks.append(StartTask())
tasks.append(InstrumentationTask('com.android.overlaytest.WithoutOverlayTest'))
- # test single overlay
+ # test single overlay: one overlay (a)
if opts.test_single_overlay:
tasks.append(StopTask())
tasks.append(_create_enable_single_overlay_task())
tasks.append(StartTask())
tasks.append(InstrumentationTask('com.android.overlaytest.WithOverlayTest'))
- # test multiple overlays
+ # test multiple overlays: all overlays - including 'disabled' filtered
+ # overlay (system property unset) so expect 'b[p=2]' overrides 'a[p=1]' but
+ # 'c[p=3]' should be ignored
if opts.test_multiple_overlays:
tasks.append(StopTask())
tasks.append(_create_enable_multiple_overlays_task())
tasks.append(StartTask())
tasks.append(InstrumentationTask('com.android.overlaytest.WithMultipleOverlaysTest'))
+ # test filtered overlays: all overlays - including 'enabled' filtered
+ # overlay (system property set/matched) so expect c[p=3] to override both a
+ # & b where applicable
+ if opts.test_filtered_overlays:
+ tasks.append(StopTask())
+ tasks.append(_create_enable_filtered_overlays_task())
+ tasks.append(StartTask())
+ tasks.append(InstrumentationTask('com.android.overlaytest.WithFilteredOverlaysTest'))
+
ignored_errors = 0
for t in tasks:
type = t.get_type()