Run test build: Create special HiddenApi shard.
Very few tests depend on hiddenapi so build them in their own shard.
This removes the hiddenapi dependency from all other shards,
which in turn removes the dependency on ART headers and C++ code.
Bug: 213297521
Test: ./art/test.py -b -r --host
Test: ./art/test.py -b -r --host -t 674-hiddenapi
Change-Id: I5d18d49b70bdaf9c3492ff4a82d32f7e9ba96873
diff --git a/test/Android.run-test.bp b/test/Android.run-test.bp
index 125fa06..b5fed42 100644
--- a/test/Android.run-test.bp
+++ b/test/Android.run-test.bp
@@ -1601,6 +1601,32 @@
filename: "art-run-test-host-data-shard99.zip",
}
+java_genrule {
+ name: "art-run-test-host-data-shardHiddenApi-tmp",
+ out: ["art-run-test-host-data-shardHiddenApi.zip"],
+ srcs: ["???-*hiddenapi*/**/*", "????-*hiddenapi*/**/*"],
+ defaults: ["art-run-test-host-data-defaults"],
+ tools: ["hiddenapi"],
+ cmd: "$(location run_test_build.py) --out $(out) --mode host " +
+ "--bootclasspath $(location :art-run-test-bootclasspath) " +
+ "--d8 $(location d8) " +
+ "--hiddenapi $(location hiddenapi) " +
+ "--jasmin $(location jasmin) " +
+ "--smali $(location smali) " +
+ "--soong_zip $(location soong_zip) " +
+ "--zipalign $(location zipalign) " +
+ "$(in)",
+}
+
+// Install in the output directory to make it accessible for tests.
+prebuilt_etc_host {
+ name: "art-run-test-host-data-shardHiddenApi",
+ defaults: ["art_module_source_build_prebuilt_defaults"],
+ src: ":art-run-test-host-data-shardHiddenApi-tmp",
+ sub_dir: "art",
+ filename: "art-run-test-host-data-shardHiddenApi.zip",
+}
+
genrule_defaults {
name: "art-run-test-host-data-defaults",
defaults: [
@@ -1614,7 +1640,6 @@
],
tools: [
"d8",
- "hiddenapi",
"jasmin",
"smali",
"soong_zip",
@@ -1623,7 +1648,6 @@
cmd: "$(location run_test_build.py) --out $(out) --mode host " +
"--bootclasspath $(location :art-run-test-bootclasspath) " +
"--d8 $(location d8) " +
- "--hiddenapi $(location hiddenapi) " +
"--jasmin $(location jasmin) " +
"--smali $(location smali) " +
"--soong_zip $(location soong_zip) " +
@@ -1736,6 +1760,7 @@
":art-run-test-host-data-shard97-tmp",
":art-run-test-host-data-shard98-tmp",
":art-run-test-host-data-shard99-tmp",
+ ":art-run-test-host-data-shardHiddenApi-tmp",
],
tools: ["merge_zips"],
cmd: "$(location merge_zips) $(out) $(in)",
@@ -1847,6 +1872,7 @@
"art-run-test-host-data-shard97",
"art-run-test-host-data-shard98",
"art-run-test-host-data-shard99",
+ "art-run-test-host-data-shardHiddenApi",
],
sub_dir: "art",
filename: "art-run-test-host-data-merged.zip",
@@ -1958,6 +1984,7 @@
":art-run-test-host-data-shard97-tmp",
":art-run-test-host-data-shard98-tmp",
":art-run-test-host-data-shard99-tmp",
+ ":art-run-test-host-data-shardHiddenApi-tmp",
],
cmd: "echo $(in) > $(out)",
}
@@ -2068,6 +2095,7 @@
"art-run-test-host-data-shard97",
"art-run-test-host-data-shard98",
"art-run-test-host-data-shard99",
+ "art-run-test-host-data-shardHiddenApi",
],
sub_dir: "art",
filename: "art-run-test-host-data.txt",
@@ -3673,6 +3701,32 @@
filename: "art-run-test-target-data-shard99.zip",
}
+java_genrule {
+ name: "art-run-test-target-data-shardHiddenApi-tmp",
+ out: ["art-run-test-target-data-shardHiddenApi.zip"],
+ srcs: ["???-*hiddenapi*/**/*", "????-*hiddenapi*/**/*"],
+ defaults: ["art-run-test-target-data-defaults"],
+ tools: ["hiddenapi"],
+ cmd: "$(location run_test_build.py) --out $(out) --mode target " +
+ "--bootclasspath $(location :art-run-test-bootclasspath) " +
+ "--d8 $(location d8) " +
+ "--hiddenapi $(location hiddenapi) " +
+ "--jasmin $(location jasmin) " +
+ "--smali $(location smali) " +
+ "--soong_zip $(location soong_zip) " +
+ "--zipalign $(location zipalign) " +
+ "$(in)",
+}
+
+// Install in the output directory to make it accessible for tests.
+prebuilt_etc_host {
+ name: "art-run-test-target-data-shardHiddenApi",
+ defaults: ["art_module_source_build_prebuilt_defaults"],
+ src: ":art-run-test-target-data-shardHiddenApi-tmp",
+ sub_dir: "art",
+ filename: "art-run-test-target-data-shardHiddenApi.zip",
+}
+
genrule_defaults {
name: "art-run-test-target-data-defaults",
defaults: [
@@ -3686,7 +3740,6 @@
],
tools: [
"d8",
- "hiddenapi",
"jasmin",
"smali",
"soong_zip",
@@ -3695,7 +3748,6 @@
cmd: "$(location run_test_build.py) --out $(out) --mode target " +
"--bootclasspath $(location :art-run-test-bootclasspath) " +
"--d8 $(location d8) " +
- "--hiddenapi $(location hiddenapi) " +
"--jasmin $(location jasmin) " +
"--smali $(location smali) " +
"--soong_zip $(location soong_zip) " +
@@ -3808,6 +3860,7 @@
":art-run-test-target-data-shard97-tmp",
":art-run-test-target-data-shard98-tmp",
":art-run-test-target-data-shard99-tmp",
+ ":art-run-test-target-data-shardHiddenApi-tmp",
],
tools: ["merge_zips"],
cmd: "$(location merge_zips) $(out) $(in)",
@@ -3919,6 +3972,7 @@
"art-run-test-target-data-shard97",
"art-run-test-target-data-shard98",
"art-run-test-target-data-shard99",
+ "art-run-test-target-data-shardHiddenApi",
],
sub_dir: "art",
filename: "art-run-test-target-data-merged.zip",
@@ -4030,6 +4084,7 @@
":art-run-test-target-data-shard97-tmp",
":art-run-test-target-data-shard98-tmp",
":art-run-test-target-data-shard99-tmp",
+ ":art-run-test-target-data-shardHiddenApi-tmp",
],
cmd: "echo $(in) > $(out)",
}
@@ -4140,6 +4195,7 @@
"art-run-test-target-data-shard97",
"art-run-test-target-data-shard98",
"art-run-test-target-data-shard99",
+ "art-run-test-target-data-shardHiddenApi",
],
sub_dir: "art",
filename: "art-run-test-target-data.txt",
@@ -5745,6 +5801,32 @@
filename: "art-run-test-jvm-data-shard99.zip",
}
+java_genrule {
+ name: "art-run-test-jvm-data-shardHiddenApi-tmp",
+ out: ["art-run-test-jvm-data-shardHiddenApi.zip"],
+ srcs: ["???-*hiddenapi*/**/*", "????-*hiddenapi*/**/*"],
+ defaults: ["art-run-test-jvm-data-defaults"],
+ tools: ["hiddenapi"],
+ cmd: "$(location run_test_build.py) --out $(out) --mode jvm " +
+ "--bootclasspath $(location :art-run-test-bootclasspath) " +
+ "--d8 $(location d8) " +
+ "--hiddenapi $(location hiddenapi) " +
+ "--jasmin $(location jasmin) " +
+ "--smali $(location smali) " +
+ "--soong_zip $(location soong_zip) " +
+ "--zipalign $(location zipalign) " +
+ "$(in)",
+}
+
+// Install in the output directory to make it accessible for tests.
+prebuilt_etc_host {
+ name: "art-run-test-jvm-data-shardHiddenApi",
+ defaults: ["art_module_source_build_prebuilt_defaults"],
+ src: ":art-run-test-jvm-data-shardHiddenApi-tmp",
+ sub_dir: "art",
+ filename: "art-run-test-jvm-data-shardHiddenApi.zip",
+}
+
genrule_defaults {
name: "art-run-test-jvm-data-defaults",
defaults: [
@@ -5758,7 +5840,6 @@
],
tools: [
"d8",
- "hiddenapi",
"jasmin",
"smali",
"soong_zip",
@@ -5767,7 +5848,6 @@
cmd: "$(location run_test_build.py) --out $(out) --mode jvm " +
"--bootclasspath $(location :art-run-test-bootclasspath) " +
"--d8 $(location d8) " +
- "--hiddenapi $(location hiddenapi) " +
"--jasmin $(location jasmin) " +
"--smali $(location smali) " +
"--soong_zip $(location soong_zip) " +
@@ -5880,6 +5960,7 @@
":art-run-test-jvm-data-shard97-tmp",
":art-run-test-jvm-data-shard98-tmp",
":art-run-test-jvm-data-shard99-tmp",
+ ":art-run-test-jvm-data-shardHiddenApi-tmp",
],
tools: ["merge_zips"],
cmd: "$(location merge_zips) $(out) $(in)",
@@ -5991,6 +6072,7 @@
"art-run-test-jvm-data-shard97",
"art-run-test-jvm-data-shard98",
"art-run-test-jvm-data-shard99",
+ "art-run-test-jvm-data-shardHiddenApi",
],
sub_dir: "art",
filename: "art-run-test-jvm-data-merged.zip",
@@ -6102,6 +6184,7 @@
":art-run-test-jvm-data-shard97-tmp",
":art-run-test-jvm-data-shard98-tmp",
":art-run-test-jvm-data-shard99-tmp",
+ ":art-run-test-jvm-data-shardHiddenApi-tmp",
],
cmd: "echo $(in) > $(out)",
}
@@ -6212,6 +6295,7 @@
"art-run-test-jvm-data-shard97",
"art-run-test-jvm-data-shard98",
"art-run-test-jvm-data-shard99",
+ "art-run-test-jvm-data-shardHiddenApi",
],
sub_dir: "art",
filename: "art-run-test-jvm-data.txt",
diff --git a/test/Android.run-test.bp.py b/test/Android.run-test.bp.py
index 10714a6..d1e3027 100755
--- a/test/Android.run-test.bp.py
+++ b/test/Android.run-test.bp.py
@@ -51,6 +51,39 @@
}}
""".format(name=name, mode=mode, shard=shard)))
+ # Build all hiddenapi tests in their own shard.
+ # This removes the dependency on hiddenapi from all other shards,
+ # which in turn removes dependency on ART C++ source code.
+ name = "art-run-test-{mode}-data-shardHiddenApi".format(mode=mode)
+ names.append(name)
+ f.write(textwrap.dedent("""
+ java_genrule {{
+ name: "{name}-tmp",
+ out: ["{name}.zip"],
+ srcs: ["???-*hiddenapi*/**/*", "????-*hiddenapi*/**/*"],
+ defaults: ["art-run-test-{mode}-data-defaults"],
+ tools: ["hiddenapi"],
+ cmd: "$(location run_test_build.py) --out $(out) --mode {mode} " +
+ "--bootclasspath $(location :art-run-test-bootclasspath) " +
+ "--d8 $(location d8) " +
+ "--hiddenapi $(location hiddenapi) " +
+ "--jasmin $(location jasmin) " +
+ "--smali $(location smali) " +
+ "--soong_zip $(location soong_zip) " +
+ "--zipalign $(location zipalign) " +
+ "$(in)",
+ }}
+
+ // Install in the output directory to make it accessible for tests.
+ prebuilt_etc_host {{
+ name: "{name}",
+ defaults: ["art_module_source_build_prebuilt_defaults"],
+ src: ":{name}-tmp",
+ sub_dir: "art",
+ filename: "{name}.zip",
+ }}
+ """.format(name=name, mode=mode)))
+
f.write(textwrap.dedent("""
genrule_defaults {{
name: "art-run-test-{mode}-data-defaults",
@@ -65,7 +98,6 @@
],
tools: [
"d8",
- "hiddenapi",
"jasmin",
"smali",
"soong_zip",
@@ -74,7 +106,6 @@
cmd: "$(location run_test_build.py) --out $(out) --mode {mode} " +
"--bootclasspath $(location :art-run-test-bootclasspath) " +
"--d8 $(location d8) " +
- "--hiddenapi $(location hiddenapi) " +
"--jasmin $(location jasmin) " +
"--smali $(location smali) " +
"--soong_zip $(location soong_zip) " +
diff --git a/test/run-test b/test/run-test
index e25b967..bb16938 100755
--- a/test/run-test
+++ b/test/run-test
@@ -915,7 +915,7 @@
os.chdir(tmp_dir)
m = re.match("[0-9]*([0-9][0-9])-.*", TEST_NAME)
assert m, "Can not find test number in " + TEST_NAME
- SHARD = m.group(1)
+ SHARD = "HiddenApi" if "hiddenapi" in TEST_NAME else m.group(1)
if target_mode == "yes":
zip_file = f"{ANDROID_HOST_OUT}/etc/art/art-run-test-target-data-shard{SHARD}.zip"
zip_entry = f"target/{TEST_NAME}"
diff --git a/test/run_test_build.py b/test/run_test_build.py
index b7381dd..64d0eb0 100755
--- a/test/run_test_build.py
+++ b/test/run_test_build.py
@@ -69,7 +69,7 @@
self.bootclasspath = args.bootclasspath.absolute()
self.d8 = args.d8.absolute()
- self.hiddenapi = args.hiddenapi.absolute()
+ self.hiddenapi = args.hiddenapi.absolute() if args.hiddenapi else None
self.jasmin = args.jasmin.absolute()
self.smali = args.smali.absolute()
self.soong_zip = args.soong_zip.absolute()
@@ -484,10 +484,15 @@
ziproot = args.out.absolute().parent / "zip"
srcdirs = set(s.parents[-4].absolute() for s in args.srcs)
+ # Special hidden-api shard: If the --hiddenapi flag is provided, build only
+ # hiddenapi tests. Otherwise exclude all hiddenapi tests from normal shards.
+ def filter_by_hiddenapi(srcdir: Path) -> bool:
+ return (args.hiddenapi != None) == ("hiddenapi" in srcdir.name)
+
# Initialize the test objects.
# We need to do this before we change the working directory below.
tests: List[BuildTestContext] = []
- for srcdir in srcdirs:
+ for srcdir in filter(filter_by_hiddenapi, srcdirs):
dstdir = ziproot / args.mode / srcdir.name
copytree(srcdir, dstdir)
tests.append(BuildTestContext(args, android_build_top, dstdir))
diff --git a/test/testrunner/testrunner.py b/test/testrunner/testrunner.py
index 32aa814..80b98fe 100755
--- a/test/testrunner/testrunner.py
+++ b/test/testrunner/testrunner.py
@@ -1244,10 +1244,12 @@
build_targets = []
# Build only the needed shards (depending on the selected tests).
shards = set(re.search("(\d\d)-", t).group(1) for t in tests)
+ if any("hiddenapi" in t for t in tests):
+ shards.add("HiddenApi") # Include special HiddenApi shard.
for mode in ['host', 'target', 'jvm']:
if mode in _user_input_variants['target']:
build_targets += ['test-art-{}-run-test-dependencies'.format(mode)]
- if len(shards) == 100:
+ if len(shards) >= 100:
build_targets += ["art-run-test-{}-data".format(mode)] # Build all.
else:
build_targets += ["art-run-test-{}-data-shard{}".format(mode, s) for s in shards]