Loading Ravenwood.bp +211 −24 Original line number Diff line number Diff line Loading @@ -26,10 +26,105 @@ java_library { } // Generate the stub/impl from framework-all, with hidden APIs. java_genrule { name: "framework-minus-apex.ravenwood-base", // This step takes several tens of seconds, so we manually shard it to multiple modules. // All the copies have to be kept in sync. // TODO: Do the sharding better. genrule_defaults { name: "framework-minus-apex.ravenwood-base_defaults", tools: ["hoststubgen"], srcs: [ ":framework-minus-apex-for-hoststubgen", ":ravenwood-framework-policies", ":ravenwood-standard-options", ":ravenwood-annotation-allowed-classes", ], out: [ "ravenwood.jar", // Following files are created just as FYI. "hoststubgen_framework-minus-apex_keep_all.txt", "hoststubgen_framework-minus-apex_dump.txt", "hoststubgen_framework-minus-apex.log", "hoststubgen_framework-minus-apex_stats.csv", "hoststubgen_framework-minus-apex_apis.csv", ], visibility: ["//visibility:private"], } java_genrule { name: "framework-minus-apex.ravenwood-base_X0", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 0 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X1", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 1 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X2", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 2 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X3", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 3 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + Loading @@ -44,39 +139,130 @@ java_genrule { "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X4", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 4 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X5", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 5 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } // Marge all the sharded jars java_genrule { name: "framework-minus-apex.ravenwood", defaults: ["ravenwood-internal-only-visibility-java"], cmd: "$(location merge_zips) $(out) $(in)", tools: ["merge_zips"], srcs: [ ":framework-minus-apex-for-hoststubgen", ":ravenwood-framework-policies", ":ravenwood-standard-options", ":ravenwood-annotation-allowed-classes", ":framework-minus-apex.ravenwood-base_X0{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X1{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X2{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X3{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X4{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X5{ravenwood.jar}", ], out: [ "ravenwood.jar", // Following files are created just as FYI. "hoststubgen_framework-minus-apex_keep_all.txt", "hoststubgen_framework-minus-apex_dump.txt", "framework-minus-apex.ravenwood.jar", ], } "hoststubgen_framework-minus-apex.log", "hoststubgen_framework-minus-apex_stats.csv", "hoststubgen_framework-minus-apex_apis.csv", // Merge the sharded text files genrule { name: "hoststubgen_framework-minus-apex_stats.csv", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_stats.csv}", ], out: ["hoststubgen_framework-minus-apex_stats.csv"], } genrule { name: "hoststubgen_framework-minus-apex_apis.csv", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_apis.csv}", ], out: ["hoststubgen_framework-minus-apex_apis.csv"], } // Extract the impl jar from "framework-minus-apex.ravenwood-base" for subsequent build rules. // Note this emits a "device side" output, so that ravenwood tests can (implicitly) // depend on it. java_genrule { name: "framework-minus-apex.ravenwood", genrule { name: "hoststubgen_framework-minus-apex_keep_all.txt", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cp $(in) $(out)", cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_keep_all.txt}", ], out: [ "framework-minus-apex.ravenwood.jar", out: ["hoststubgen_framework-minus-apex_keep_all.txt"], } genrule { name: "hoststubgen_framework-minus-apex_dump.txt", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_dump.txt}", ], out: ["hoststubgen_framework-minus-apex_dump.txt"], } java_library { Loading Loading @@ -159,7 +345,8 @@ java_library { "framework-minus-apex.ravenwood", ], sdk_version: "core_platform", jarjar_rules: ":ravenwood-framework-jarjar-rules", // See b/313930116. Jarjar is too slow on this jar. We use HostStubGen to do the rename. // jarjar_rules: ":ravenwood-framework-jarjar-rules", } java_genrule { Loading ravenwood/Android.bp +8 −8 Original line number Diff line number Diff line Loading @@ -181,13 +181,13 @@ java_library { visibility: ["//visibility:public"], } // Carefully compiles against only test_current to support tests that // Carefully compiles against only module_current to support tests that // want to verify they're unbundled. The "impl" library above is what // ships inside the Ravenwood environment to actually drive any API // access to implementation details. // This library needs to be statically linked to mainline tests as well, // which need to be able to run on multiple API levels, so we can't use // test APIs in this module. // We can't use test_current here because this library needs to be statically // linked to mainline tests as well, which can't use test APIs because they // need to be able to run on multiple API levels. java_library { name: "ravenwood-junit", srcs: [ Loading Loading @@ -280,10 +280,10 @@ sh_test_host { src: "scripts/ravenwood-stats-checker.sh", test_suites: ["general-tests"], data: [ ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_dump.txt}", ":hoststubgen_framework-minus-apex_stats.csv", ":hoststubgen_framework-minus-apex_apis.csv", ":hoststubgen_framework-minus-apex_keep_all.txt", ":hoststubgen_framework-minus-apex_dump.txt", ":services.core.ravenwood-base{hoststubgen_services.core_stats.csv}", ":services.core.ravenwood-base{hoststubgen_services.core_apis.csv}", ":services.core.ravenwood-base{hoststubgen_services.core_keep_all.txt}", Loading ravenwood/texts/ravenwood-framework-jarjar-rules.txt +1 −2 Original line number Diff line number Diff line # To avoid VerifyError on nano proto files (b/324063814) rule com.**.nano.** devicenano.@0 # Applying jarjar on framework-minux-apex is too slow, so we don't use jarjar for now. b/313930116 No newline at end of file ravenwood/texts/ravenwood-framework-policies.txt +5 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,11 @@ class :feature_flags keepclass # Keep all sysprops generated code implementations class :sysprops keepclass # To avoid VerifyError on nano proto files (b/324063814), we rename nano proto classes. # Note: The "rename" directive must use shashes (/) as a package name separator. rename com/.*/nano/ devicenano/ rename android/.*/nano/ devicenano/ # Exported to Mainline modules; cannot use annotations class com.android.internal.util.FastXmlSerializer keepclass class com.android.internal.util.FileRotator keepclass Loading tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt +60 −15 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import com.android.hoststubgen.visitors.PackageRedirectRemapper import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassVisitor import org.objectweb.asm.ClassWriter import org.objectweb.asm.commons.ClassRemapper import org.objectweb.asm.commons.Remapper import org.objectweb.asm.util.CheckClassAdapter import java.io.BufferedInputStream import java.io.FileOutputStream Loading Loading @@ -70,7 +72,7 @@ class HostStubGen(val options: HostStubGenOptions) { } // Build the filters. val filter = buildFilter(errors, allClasses, options) val (filter, policyFileRemapper) = buildFilter(errors, allClasses, options) // Transform the jar. convert( Loading @@ -82,6 +84,9 @@ class HostStubGen(val options: HostStubGenOptions) { allClasses, errors, stats, policyFileRemapper, options.numShards.get, options.shard.get, ) // Dump statistics, if specified. Loading @@ -107,7 +112,7 @@ class HostStubGen(val options: HostStubGenOptions) { errors: HostStubGenErrors, allClasses: ClassNodes, options: HostStubGenOptions, ): OutputFilter { ): Pair<OutputFilter, Remapper?> { // We build a "chain" of multiple filters here. // // The filters are build in from "inside", meaning the first filter created here is Loading Loading @@ -160,10 +165,14 @@ class HostStubGen(val options: HostStubGenOptions) { filter, ) var policyFileRemapper: Remapper? = null // Next, "text based" filter, which allows to override polices without touching // the target code. options.policyOverrideFile.ifSet { filter = createFilterFromTextPolicyFile(it, allClasses, filter) val (f, p) = createFilterFromTextPolicyFile(it, allClasses, filter) filter = f policyFileRemapper = p } // If `--intersect-stub-jar` is provided, load from these jar files too. Loading @@ -178,7 +187,7 @@ class HostStubGen(val options: HostStubGenOptions) { // Apply the implicit filter. filter = ImplicitOutputFilter(errors, allClasses, filter) return filter return Pair(filter, policyFileRemapper) } /** Loading @@ -205,6 +214,9 @@ class HostStubGen(val options: HostStubGenOptions) { classes: ClassNodes, errors: HostStubGenErrors, stats: HostStubGenStats, remapper: Remapper?, numShards: Int, shard: Int, ) { log.i("Converting %s into [stub: %s, impl: %s] ...", inJar, outStubJar, outImplJar) log.i("ASM CheckClassAdapter is %s", if (enableChecker) "enabled" else "disabled") Loading @@ -213,17 +225,32 @@ class HostStubGen(val options: HostStubGenOptions) { val packageRedirector = PackageRedirectRemapper(options.packageRedirects) var itemIndex = 0 var numItemsProcessed = 0 var numItems = -1 // == Unknown log.withIndent { // Open the input jar file and process each entry. ZipFile(inJar).use { inZip -> numItems = inZip.size() val shardStart = numItems * shard / numShards val shardNextStart = numItems * (shard + 1) / numShards maybeWithZipOutputStream(outStubJar) { stubOutStream -> maybeWithZipOutputStream(outImplJar) { implOutStream -> val inEntries = inZip.entries() while (inEntries.hasMoreElements()) { val entry = inEntries.nextElement() val inShard = (shardStart <= itemIndex) && (itemIndex < shardNextStart) itemIndex++ if (!inShard) { continue } convertSingleEntry(inZip, entry, stubOutStream, implOutStream, filter, packageRedirector, enableChecker, classes, errors, stats) filter, packageRedirector, remapper, enableChecker, classes, errors, stats) numItemsProcessed++ } log.i("Converted all entries.") } Loading @@ -233,7 +260,8 @@ class HostStubGen(val options: HostStubGenOptions) { } } val end = System.currentTimeMillis() log.i("Done transforming the jar in %.1f second(s).", (end - start) / 1000.0) log.i("Done transforming the jar in %.1f second(s). %d / %d item(s) processed.", (end - start) / 1000.0, numItemsProcessed, numItems) } private fun <T> maybeWithZipOutputStream(filename: String?, block: (ZipOutputStream?) -> T): T { Loading @@ -253,6 +281,7 @@ class HostStubGen(val options: HostStubGenOptions) { implOutStream: ZipOutputStream?, filter: OutputFilter, packageRedirector: PackageRedirectRemapper, remapper: Remapper?, enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, Loading @@ -270,7 +299,7 @@ class HostStubGen(val options: HostStubGenOptions) { // If it's a class, convert it. if (name.endsWith(".class")) { processSingleClass(inZip, entry, stubOutStream, implOutStream, filter, packageRedirector, enableChecker, classes, errors, stats) packageRedirector, remapper, enableChecker, classes, errors, stats) return } Loading Loading @@ -321,6 +350,7 @@ class HostStubGen(val options: HostStubGenOptions) { implOutStream: ZipOutputStream?, filter: OutputFilter, packageRedirector: PackageRedirectRemapper, remapper: Remapper?, enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, Loading @@ -332,16 +362,24 @@ class HostStubGen(val options: HostStubGenOptions) { log.d("Removing class: %s %s", classInternalName, classPolicy) return } // If we're applying a remapper, we need to rename the file too. var newName = entry.name remapper?.mapType(classInternalName)?.let { remappedName -> if (remappedName != classInternalName) { log.d("Renaming class file: %s -> %s", classInternalName, remappedName) newName = remappedName + ".class" } } // Generate stub first. if (stubOutStream != null && classPolicy.policy.needsInStub) { log.v("Creating stub class: %s Policy: %s", classInternalName, classPolicy) log.withIndent { BufferedInputStream(inZip.getInputStream(entry)).use { bis -> val newEntry = ZipEntry(entry.name) val newEntry = ZipEntry(newName) stubOutStream.putNextEntry(newEntry) convertClass(classInternalName, /*forImpl=*/false, bis, stubOutStream, filter, packageRedirector, enableChecker, classes, errors, null) stubOutStream, filter, packageRedirector, remapper, enableChecker, classes, errors, null) stubOutStream.closeEntry() } } Loading @@ -350,11 +388,11 @@ class HostStubGen(val options: HostStubGenOptions) { log.v("Creating impl class: %s Policy: %s", classInternalName, classPolicy) log.withIndent { BufferedInputStream(inZip.getInputStream(entry)).use { bis -> val newEntry = ZipEntry(entry.name) val newEntry = ZipEntry(newName) implOutStream.putNextEntry(newEntry) convertClass(classInternalName, /*forImpl=*/true, bis, implOutStream, filter, packageRedirector, enableChecker, classes, errors, stats) implOutStream, filter, packageRedirector, remapper, enableChecker, classes, errors, stats) implOutStream.closeEntry() } } Loading @@ -371,6 +409,7 @@ class HostStubGen(val options: HostStubGenOptions) { out: OutputStream, filter: OutputFilter, packageRedirector: PackageRedirectRemapper, remapper: Remapper?, enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, Loading @@ -387,6 +426,12 @@ class HostStubGen(val options: HostStubGenOptions) { if (enableChecker) { outVisitor = CheckClassAdapter(outVisitor) } // Remapping should happen at the end. remapper?.let { outVisitor = ClassRemapper(outVisitor, remapper) } val visitorOptions = BaseAdapter.Options( enablePreTrace = options.enablePreTrace.get, enablePostTrace = options.enablePostTrace.get, Loading @@ -395,7 +440,7 @@ class HostStubGen(val options: HostStubGenOptions) { stats = stats, ) outVisitor = BaseAdapter.getVisitor(classInternalName, classes, outVisitor, filter, packageRedirector, forImpl, visitorOptions) packageRedirector, remapper, forImpl, visitorOptions) cr.accept(outVisitor, ClassReader.EXPAND_FRAMES) val data = cw.toByteArray() Loading Loading
Ravenwood.bp +211 −24 Original line number Diff line number Diff line Loading @@ -26,10 +26,105 @@ java_library { } // Generate the stub/impl from framework-all, with hidden APIs. java_genrule { name: "framework-minus-apex.ravenwood-base", // This step takes several tens of seconds, so we manually shard it to multiple modules. // All the copies have to be kept in sync. // TODO: Do the sharding better. genrule_defaults { name: "framework-minus-apex.ravenwood-base_defaults", tools: ["hoststubgen"], srcs: [ ":framework-minus-apex-for-hoststubgen", ":ravenwood-framework-policies", ":ravenwood-standard-options", ":ravenwood-annotation-allowed-classes", ], out: [ "ravenwood.jar", // Following files are created just as FYI. "hoststubgen_framework-minus-apex_keep_all.txt", "hoststubgen_framework-minus-apex_dump.txt", "hoststubgen_framework-minus-apex.log", "hoststubgen_framework-minus-apex_stats.csv", "hoststubgen_framework-minus-apex_apis.csv", ], visibility: ["//visibility:private"], } java_genrule { name: "framework-minus-apex.ravenwood-base_X0", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 0 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X1", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 1 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X2", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 2 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X3", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 3 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + Loading @@ -44,39 +139,130 @@ java_genrule { "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X4", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 4 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } java_genrule { name: "framework-minus-apex.ravenwood-base_X5", defaults: ["framework-minus-apex.ravenwood-base_defaults"], cmd: "$(location hoststubgen) " + "--num-shards 6 --shard-index 5 " + // Only this line differs "@$(location :ravenwood-standard-options) " + "--debug-log $(location hoststubgen_framework-minus-apex.log) " + "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " + "--supported-api-list-file $(location hoststubgen_framework-minus-apex_apis.csv) " + "--out-impl-jar $(location ravenwood.jar) " + "--gen-keep-all-file $(location hoststubgen_framework-minus-apex_keep_all.txt) " + "--gen-input-dump-file $(location hoststubgen_framework-minus-apex_dump.txt) " + "--in-jar $(location :framework-minus-apex-for-hoststubgen) " + "--policy-override-file $(location :ravenwood-framework-policies) " + "--annotation-allowed-classes-file $(location :ravenwood-annotation-allowed-classes) ", } // Marge all the sharded jars java_genrule { name: "framework-minus-apex.ravenwood", defaults: ["ravenwood-internal-only-visibility-java"], cmd: "$(location merge_zips) $(out) $(in)", tools: ["merge_zips"], srcs: [ ":framework-minus-apex-for-hoststubgen", ":ravenwood-framework-policies", ":ravenwood-standard-options", ":ravenwood-annotation-allowed-classes", ":framework-minus-apex.ravenwood-base_X0{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X1{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X2{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X3{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X4{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X5{ravenwood.jar}", ], out: [ "ravenwood.jar", // Following files are created just as FYI. "hoststubgen_framework-minus-apex_keep_all.txt", "hoststubgen_framework-minus-apex_dump.txt", "framework-minus-apex.ravenwood.jar", ], } "hoststubgen_framework-minus-apex.log", "hoststubgen_framework-minus-apex_stats.csv", "hoststubgen_framework-minus-apex_apis.csv", // Merge the sharded text files genrule { name: "hoststubgen_framework-minus-apex_stats.csv", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_stats.csv}", ], out: ["hoststubgen_framework-minus-apex_stats.csv"], } genrule { name: "hoststubgen_framework-minus-apex_apis.csv", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_apis.csv}", ], out: ["hoststubgen_framework-minus-apex_apis.csv"], } // Extract the impl jar from "framework-minus-apex.ravenwood-base" for subsequent build rules. // Note this emits a "device side" output, so that ravenwood tests can (implicitly) // depend on it. java_genrule { name: "framework-minus-apex.ravenwood", genrule { name: "hoststubgen_framework-minus-apex_keep_all.txt", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cp $(in) $(out)", cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base{ravenwood.jar}", ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_keep_all.txt}", ], out: [ "framework-minus-apex.ravenwood.jar", out: ["hoststubgen_framework-minus-apex_keep_all.txt"], } genrule { name: "hoststubgen_framework-minus-apex_dump.txt", defaults: ["ravenwood-internal-only-visibility-genrule"], cmd: "cat $(in) > $(out)", srcs: [ ":framework-minus-apex.ravenwood-base_X0{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X1{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X2{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X3{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X4{hoststubgen_framework-minus-apex_dump.txt}", ":framework-minus-apex.ravenwood-base_X5{hoststubgen_framework-minus-apex_dump.txt}", ], out: ["hoststubgen_framework-minus-apex_dump.txt"], } java_library { Loading Loading @@ -159,7 +345,8 @@ java_library { "framework-minus-apex.ravenwood", ], sdk_version: "core_platform", jarjar_rules: ":ravenwood-framework-jarjar-rules", // See b/313930116. Jarjar is too slow on this jar. We use HostStubGen to do the rename. // jarjar_rules: ":ravenwood-framework-jarjar-rules", } java_genrule { Loading
ravenwood/Android.bp +8 −8 Original line number Diff line number Diff line Loading @@ -181,13 +181,13 @@ java_library { visibility: ["//visibility:public"], } // Carefully compiles against only test_current to support tests that // Carefully compiles against only module_current to support tests that // want to verify they're unbundled. The "impl" library above is what // ships inside the Ravenwood environment to actually drive any API // access to implementation details. // This library needs to be statically linked to mainline tests as well, // which need to be able to run on multiple API levels, so we can't use // test APIs in this module. // We can't use test_current here because this library needs to be statically // linked to mainline tests as well, which can't use test APIs because they // need to be able to run on multiple API levels. java_library { name: "ravenwood-junit", srcs: [ Loading Loading @@ -280,10 +280,10 @@ sh_test_host { src: "scripts/ravenwood-stats-checker.sh", test_suites: ["general-tests"], data: [ ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_keep_all.txt}", ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_dump.txt}", ":hoststubgen_framework-minus-apex_stats.csv", ":hoststubgen_framework-minus-apex_apis.csv", ":hoststubgen_framework-minus-apex_keep_all.txt", ":hoststubgen_framework-minus-apex_dump.txt", ":services.core.ravenwood-base{hoststubgen_services.core_stats.csv}", ":services.core.ravenwood-base{hoststubgen_services.core_apis.csv}", ":services.core.ravenwood-base{hoststubgen_services.core_keep_all.txt}", Loading
ravenwood/texts/ravenwood-framework-jarjar-rules.txt +1 −2 Original line number Diff line number Diff line # To avoid VerifyError on nano proto files (b/324063814) rule com.**.nano.** devicenano.@0 # Applying jarjar on framework-minux-apex is too slow, so we don't use jarjar for now. b/313930116 No newline at end of file
ravenwood/texts/ravenwood-framework-policies.txt +5 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,11 @@ class :feature_flags keepclass # Keep all sysprops generated code implementations class :sysprops keepclass # To avoid VerifyError on nano proto files (b/324063814), we rename nano proto classes. # Note: The "rename" directive must use shashes (/) as a package name separator. rename com/.*/nano/ devicenano/ rename android/.*/nano/ devicenano/ # Exported to Mainline modules; cannot use annotations class com.android.internal.util.FastXmlSerializer keepclass class com.android.internal.util.FileRotator keepclass Loading
tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt +60 −15 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import com.android.hoststubgen.visitors.PackageRedirectRemapper import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassVisitor import org.objectweb.asm.ClassWriter import org.objectweb.asm.commons.ClassRemapper import org.objectweb.asm.commons.Remapper import org.objectweb.asm.util.CheckClassAdapter import java.io.BufferedInputStream import java.io.FileOutputStream Loading Loading @@ -70,7 +72,7 @@ class HostStubGen(val options: HostStubGenOptions) { } // Build the filters. val filter = buildFilter(errors, allClasses, options) val (filter, policyFileRemapper) = buildFilter(errors, allClasses, options) // Transform the jar. convert( Loading @@ -82,6 +84,9 @@ class HostStubGen(val options: HostStubGenOptions) { allClasses, errors, stats, policyFileRemapper, options.numShards.get, options.shard.get, ) // Dump statistics, if specified. Loading @@ -107,7 +112,7 @@ class HostStubGen(val options: HostStubGenOptions) { errors: HostStubGenErrors, allClasses: ClassNodes, options: HostStubGenOptions, ): OutputFilter { ): Pair<OutputFilter, Remapper?> { // We build a "chain" of multiple filters here. // // The filters are build in from "inside", meaning the first filter created here is Loading Loading @@ -160,10 +165,14 @@ class HostStubGen(val options: HostStubGenOptions) { filter, ) var policyFileRemapper: Remapper? = null // Next, "text based" filter, which allows to override polices without touching // the target code. options.policyOverrideFile.ifSet { filter = createFilterFromTextPolicyFile(it, allClasses, filter) val (f, p) = createFilterFromTextPolicyFile(it, allClasses, filter) filter = f policyFileRemapper = p } // If `--intersect-stub-jar` is provided, load from these jar files too. Loading @@ -178,7 +187,7 @@ class HostStubGen(val options: HostStubGenOptions) { // Apply the implicit filter. filter = ImplicitOutputFilter(errors, allClasses, filter) return filter return Pair(filter, policyFileRemapper) } /** Loading @@ -205,6 +214,9 @@ class HostStubGen(val options: HostStubGenOptions) { classes: ClassNodes, errors: HostStubGenErrors, stats: HostStubGenStats, remapper: Remapper?, numShards: Int, shard: Int, ) { log.i("Converting %s into [stub: %s, impl: %s] ...", inJar, outStubJar, outImplJar) log.i("ASM CheckClassAdapter is %s", if (enableChecker) "enabled" else "disabled") Loading @@ -213,17 +225,32 @@ class HostStubGen(val options: HostStubGenOptions) { val packageRedirector = PackageRedirectRemapper(options.packageRedirects) var itemIndex = 0 var numItemsProcessed = 0 var numItems = -1 // == Unknown log.withIndent { // Open the input jar file and process each entry. ZipFile(inJar).use { inZip -> numItems = inZip.size() val shardStart = numItems * shard / numShards val shardNextStart = numItems * (shard + 1) / numShards maybeWithZipOutputStream(outStubJar) { stubOutStream -> maybeWithZipOutputStream(outImplJar) { implOutStream -> val inEntries = inZip.entries() while (inEntries.hasMoreElements()) { val entry = inEntries.nextElement() val inShard = (shardStart <= itemIndex) && (itemIndex < shardNextStart) itemIndex++ if (!inShard) { continue } convertSingleEntry(inZip, entry, stubOutStream, implOutStream, filter, packageRedirector, enableChecker, classes, errors, stats) filter, packageRedirector, remapper, enableChecker, classes, errors, stats) numItemsProcessed++ } log.i("Converted all entries.") } Loading @@ -233,7 +260,8 @@ class HostStubGen(val options: HostStubGenOptions) { } } val end = System.currentTimeMillis() log.i("Done transforming the jar in %.1f second(s).", (end - start) / 1000.0) log.i("Done transforming the jar in %.1f second(s). %d / %d item(s) processed.", (end - start) / 1000.0, numItemsProcessed, numItems) } private fun <T> maybeWithZipOutputStream(filename: String?, block: (ZipOutputStream?) -> T): T { Loading @@ -253,6 +281,7 @@ class HostStubGen(val options: HostStubGenOptions) { implOutStream: ZipOutputStream?, filter: OutputFilter, packageRedirector: PackageRedirectRemapper, remapper: Remapper?, enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, Loading @@ -270,7 +299,7 @@ class HostStubGen(val options: HostStubGenOptions) { // If it's a class, convert it. if (name.endsWith(".class")) { processSingleClass(inZip, entry, stubOutStream, implOutStream, filter, packageRedirector, enableChecker, classes, errors, stats) packageRedirector, remapper, enableChecker, classes, errors, stats) return } Loading Loading @@ -321,6 +350,7 @@ class HostStubGen(val options: HostStubGenOptions) { implOutStream: ZipOutputStream?, filter: OutputFilter, packageRedirector: PackageRedirectRemapper, remapper: Remapper?, enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, Loading @@ -332,16 +362,24 @@ class HostStubGen(val options: HostStubGenOptions) { log.d("Removing class: %s %s", classInternalName, classPolicy) return } // If we're applying a remapper, we need to rename the file too. var newName = entry.name remapper?.mapType(classInternalName)?.let { remappedName -> if (remappedName != classInternalName) { log.d("Renaming class file: %s -> %s", classInternalName, remappedName) newName = remappedName + ".class" } } // Generate stub first. if (stubOutStream != null && classPolicy.policy.needsInStub) { log.v("Creating stub class: %s Policy: %s", classInternalName, classPolicy) log.withIndent { BufferedInputStream(inZip.getInputStream(entry)).use { bis -> val newEntry = ZipEntry(entry.name) val newEntry = ZipEntry(newName) stubOutStream.putNextEntry(newEntry) convertClass(classInternalName, /*forImpl=*/false, bis, stubOutStream, filter, packageRedirector, enableChecker, classes, errors, null) stubOutStream, filter, packageRedirector, remapper, enableChecker, classes, errors, null) stubOutStream.closeEntry() } } Loading @@ -350,11 +388,11 @@ class HostStubGen(val options: HostStubGenOptions) { log.v("Creating impl class: %s Policy: %s", classInternalName, classPolicy) log.withIndent { BufferedInputStream(inZip.getInputStream(entry)).use { bis -> val newEntry = ZipEntry(entry.name) val newEntry = ZipEntry(newName) implOutStream.putNextEntry(newEntry) convertClass(classInternalName, /*forImpl=*/true, bis, implOutStream, filter, packageRedirector, enableChecker, classes, errors, stats) implOutStream, filter, packageRedirector, remapper, enableChecker, classes, errors, stats) implOutStream.closeEntry() } } Loading @@ -371,6 +409,7 @@ class HostStubGen(val options: HostStubGenOptions) { out: OutputStream, filter: OutputFilter, packageRedirector: PackageRedirectRemapper, remapper: Remapper?, enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, Loading @@ -387,6 +426,12 @@ class HostStubGen(val options: HostStubGenOptions) { if (enableChecker) { outVisitor = CheckClassAdapter(outVisitor) } // Remapping should happen at the end. remapper?.let { outVisitor = ClassRemapper(outVisitor, remapper) } val visitorOptions = BaseAdapter.Options( enablePreTrace = options.enablePreTrace.get, enablePostTrace = options.enablePostTrace.get, Loading @@ -395,7 +440,7 @@ class HostStubGen(val options: HostStubGenOptions) { stats = stats, ) outVisitor = BaseAdapter.getVisitor(classInternalName, classes, outVisitor, filter, packageRedirector, forImpl, visitorOptions) packageRedirector, remapper, forImpl, visitorOptions) cr.accept(outVisitor, ClassReader.EXPAND_FRAMES) val data = cw.toByteArray() Loading