diff options
| author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-03-01 00:01:17 +0000 |
|---|---|---|
| committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-03-01 00:01:17 +0000 |
| commit | 7f7821dbef080c68d90b21fb06d65129d9389a97 (patch) | |
| tree | c67173738db9a0481c77b8345eb8f6c364b610b7 | |
| parent | a0897e87d044c542ea61bdba495ca2ae10d6957a (diff) | |
| parent | 0c5304b48133e308eead7e1c6403cb68ec332c32 (diff) | |
Snap for 11517367 from 0c5304b48133e308eead7e1c6403cb68ec332c32 to 24Q2-release
Change-Id: I340bc92558425d3e26708f12618e4191a5ed8824
| -rw-r--r-- | android/variable.go | 5 | ||||
| -rw-r--r-- | apex/apex.go | 10 | ||||
| -rw-r--r-- | apex/apex_test.go | 26 | ||||
| -rw-r--r-- | apex/builder.go | 9 | ||||
| -rw-r--r-- | java/aar.go | 8 | ||||
| -rw-r--r-- | java/app_import.go | 9 | ||||
| -rw-r--r-- | java/app_test.go | 4 | ||||
| -rw-r--r-- | java/base.go | 14 | ||||
| -rw-r--r-- | java/builder.go | 59 | ||||
| -rw-r--r-- | java/core-libraries/Android.bp | 4 | ||||
| -rw-r--r-- | java/droidstubs.go | 17 | ||||
| -rw-r--r-- | java/droidstubs_test.go | 1 | ||||
| -rw-r--r-- | java/java.go | 52 | ||||
| -rw-r--r-- | java/java_test.go | 69 | ||||
| -rw-r--r-- | java/sdk_library.go | 2 | ||||
| -rw-r--r-- | java/testing.go | 9 |
16 files changed, 254 insertions, 44 deletions
diff --git a/android/variable.go b/android/variable.go index be3c80d8e..df2f8d485 100644 --- a/android/variable.go +++ b/android/variable.go @@ -181,8 +181,9 @@ type variableProperties struct { // release_aidl_use_unfrozen is "true" when a device can // use the unfrozen versions of AIDL interfaces. Release_aidl_use_unfrozen struct { - Cflags []string - Cmd *string + Cflags []string + Cmd *string + Vintf_fragments []string } } `android:"arch_variant"` } diff --git a/apex/apex.go b/apex/apex.go index 1954a7eaf..4b37d0f03 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2072,8 +2072,10 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, return true // track transitive dependencies case *java.AndroidAppImport: vctx.filesInfo = append(vctx.filesInfo, apexFilesForAndroidApp(ctx, ap)...) + addAconfigFiles(vctx, ctx, child) case *java.AndroidTestHelperApp: vctx.filesInfo = append(vctx.filesInfo, apexFilesForAndroidApp(ctx, ap)...) + addAconfigFiles(vctx, ctx, child) case *java.AndroidAppSet: appDir := "app" if ap.Privileged() { @@ -2087,6 +2089,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, af := newApexFile(ctx, ap.OutputFile(), ap.BaseModuleName(), appDirName, appSet, ap) af.certificate = java.PresignedCertificate vctx.filesInfo = append(vctx.filesInfo, af) + addAconfigFiles(vctx, ctx, child) default: ctx.PropertyErrorf("apps", "%q is not an android_app module", depName) } @@ -2115,6 +2118,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, case prebuiltTag: if prebuilt, ok := child.(prebuilt_etc.PrebuiltEtcModule); ok { vctx.filesInfo = append(vctx.filesInfo, apexFileForPrebuiltEtc(ctx, prebuilt, depName)) + addAconfigFiles(vctx, ctx, child) } else { ctx.PropertyErrorf("prebuilts", "%q is not a prebuilt_etc module", depName) } @@ -2138,6 +2142,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, af := apexFileForExecutable(ctx, ccTest) af.class = nativeTest vctx.filesInfo = append(vctx.filesInfo, af) + addAconfigFiles(vctx, ctx, child) } return true // track transitive dependencies } else { @@ -2223,11 +2228,13 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, } vctx.filesInfo = append(vctx.filesInfo, af) + addAconfigFiles(vctx, ctx, child) return true // track transitive dependencies } else if rm, ok := child.(*rust.Module); ok { af := apexFileForRustLibrary(ctx, rm) af.transitiveDep = true vctx.filesInfo = append(vctx.filesInfo, af) + addAconfigFiles(vctx, ctx, child) return true // track transitive dependencies } } else if cc.IsTestPerSrcDepTag(depTag) { @@ -2256,6 +2263,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, af := apexFileForRustLibrary(ctx, rustm) af.transitiveDep = true vctx.filesInfo = append(vctx.filesInfo, af) + addAconfigFiles(vctx, ctx, child) return true // track transitive dependencies } } else if rust.IsRlibDepTag(depTag) { @@ -2274,6 +2282,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, return false } vctx.filesInfo = append(vctx.filesInfo, af) + addAconfigFiles(vctx, ctx, child) return true // track transitive dependencies default: ctx.PropertyErrorf("bootclasspath_fragments", @@ -2288,6 +2297,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, if profileAf := apexFileForJavaModuleProfile(ctx, child.(javaModule)); profileAf != nil { vctx.filesInfo = append(vctx.filesInfo, *profileAf) } + addAconfigFiles(vctx, ctx, child) return true // track transitive dependencies default: ctx.PropertyErrorf("systemserverclasspath_fragments", diff --git a/apex/apex_test.go b/apex/apex_test.go index cc2d4ef17..74d6de8c7 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -11128,10 +11128,10 @@ func TestAconfigFilesJavaDeps(t *testing.T) { t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s) } - ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$") - ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex$") - ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex$") - ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex$") + ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$") + ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$") inputs := []string{ "my_aconfig_declarations_foo/intermediate.pb", @@ -11252,10 +11252,10 @@ func TestAconfigFilesJavaAndCcDeps(t *testing.T) { t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s) } - ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$") - ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex$") - ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex$") - ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex$") + ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$") + ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$") inputs := []string{ "my_aconfig_declarations_foo/intermediate.pb", @@ -11393,13 +11393,15 @@ func TestAconfigFilesRustDeps(t *testing.T) { t.Fatalf("Expected 26 commands, got %d in:\n%s", len(copyCmds), s) } - ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex$") - ensureMatches(t, copyCmds[23], "^cp -f .*/package.map .*/image.apex$") - ensureMatches(t, copyCmds[24], "^cp -f .*/flag.map .*/image.apex$") - ensureMatches(t, copyCmds[25], "^cp -f .*/flag.val .*/image.apex$") + ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$") + ensureMatches(t, copyCmds[23], "^cp -f .*/package.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[24], "^cp -f .*/flag.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[25], "^cp -f .*/flag.val .*/image.apex/etc$") inputs := []string{ "my_aconfig_declarations_foo/intermediate.pb", + "my_aconfig_declarations_bar/intermediate.pb", + "my_aconfig_declarations_baz/intermediate.pb", "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb", } VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "") diff --git a/apex/builder.go b/apex/builder.go index e49cf28fd..6ad282ab6 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -645,6 +645,7 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { prebuiltSdkToolsBinDir := filepath.Join("prebuilts", "sdk", "tools", runtime.GOOS, "bin") defaultReadOnlyFiles := []string{"apex_manifest.json", "apex_manifest.pb"} + aconfigDest := imageDir.Join(ctx, "etc").String() if len(a.aconfigFiles) > 0 { apexAconfigFile := android.PathForModuleOut(ctx, "aconfig_flags.pb") ctx.Build(pctx, android.BuildParams{ @@ -657,9 +658,9 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { }, }) - copyCommands = append(copyCommands, "cp -f "+apexAconfigFile.String()+" "+imageDir.String()) + copyCommands = append(copyCommands, "cp -f "+apexAconfigFile.String()+" "+aconfigDest) implicitInputs = append(implicitInputs, apexAconfigFile) - defaultReadOnlyFiles = append(defaultReadOnlyFiles, apexAconfigFile.Base()) + defaultReadOnlyFiles = append(defaultReadOnlyFiles, "etc/"+apexAconfigFile.Base()) for _, info := range createStorageInfo { outputFile := android.PathForModuleOut(ctx, info.Output_file) @@ -675,9 +676,9 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { }, }) - copyCommands = append(copyCommands, "cp -f "+outputFile.String()+" "+imageDir.String()) + copyCommands = append(copyCommands, "cp -f "+outputFile.String()+" "+aconfigDest) implicitInputs = append(implicitInputs, outputFile) - defaultReadOnlyFiles = append(defaultReadOnlyFiles, outputFile.Base()) + defaultReadOnlyFiles = append(defaultReadOnlyFiles, "etc/"+outputFile.Base()) } } diff --git a/java/aar.go b/java/aar.go index 515c14799..b3239ba93 100644 --- a/java/aar.go +++ b/java/aar.go @@ -1136,7 +1136,7 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { extractedAARDir := android.PathForModuleOut(ctx, "aar") a.classpathFile = extractedAARDir.Join(ctx, "classes-combined.jar") a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml") - aarRTxt := extractedAARDir.Join(ctx, "R.txt") + a.rTxt = extractedAARDir.Join(ctx, "R.txt") a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip") a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt") android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{ @@ -1150,7 +1150,7 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.Build(pctx, android.BuildParams{ Rule: unzipAAR, Input: a.aarPath, - Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest, a.assetsPackage, aarRTxt}, + Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest, a.assetsPackage, a.rTxt}, Description: "unzip AAR", Args: map[string]string{ "outDir": extractedAARDir.String(), @@ -1168,7 +1168,7 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk") proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options") - a.rTxt = android.PathForModuleOut(ctx, "R.txt") + aaptRTxt := android.PathForModuleOut(ctx, "R.txt") a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages") var linkDeps android.Paths @@ -1205,7 +1205,7 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { } transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets()) - aapt2Link(ctx, a.exportPackage, nil, proguardOptionsFile, a.rTxt, + aapt2Link(ctx, a.exportPackage, nil, proguardOptionsFile, aaptRTxt, linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil, nil) a.rJar = android.PathForModuleOut(ctx, "busybox/R.jar") diff --git a/java/app_import.go b/java/app_import.go index 8c90e4c7a..dc84fc26d 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -145,6 +145,11 @@ type AndroidAppImportProperties struct { // Whether or not to skip checking the preprocessed apk for proper alignment and uncompressed // JNI libs and dex files. Default is false Skip_preprocessed_apk_checks *bool + + // Name of the source soong module that gets shadowed by this prebuilt + // If unspecified, follows the naming convention that the source module of + // the prebuilt is Name() without "prebuilt_" prefix + Source_module_name *string } func (a *AndroidAppImport) IsInstallable() bool { @@ -274,6 +279,10 @@ func (a *AndroidAppImport) InstallApkName() string { return a.BaseModuleName() } +func (a *AndroidAppImport) BaseModuleName() string { + return proptools.StringDefault(a.properties.Source_module_name, a.ModuleBase.Name()) +} + func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext) { if a.Name() == "prebuilt_framework-res" { ctx.ModuleErrorf("prebuilt_framework-res found. This used to have special handling in soong, but was removed due to prebuilt_framework-res no longer existing. This check is to ensure it doesn't come back without readding the special handling.") diff --git a/java/app_test.go b/java/app_test.go index 125c9716c..28bea0a2b 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -931,8 +931,8 @@ func TestAndroidResourceProcessor(t *testing.T) { "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar", }, appCombined: []string{ - "out/soong/.intermediates/app/android_common/busybox/R.jar", "out/soong/.intermediates/app/android_common/javac/app.jar", + "out/soong/.intermediates/app/android_common/busybox/R.jar", "out/soong/.intermediates/direct/android_common/combined/direct.jar", "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar", }, @@ -1037,8 +1037,8 @@ func TestAndroidResourceProcessor(t *testing.T) { "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar", }, appCombined: []string{ - "out/soong/.intermediates/app/android_common/busybox/R.jar", "out/soong/.intermediates/app/android_common/javac/app.jar", + "out/soong/.intermediates/app/android_common/busybox/R.jar", "out/soong/.intermediates/direct/android_common/combined/direct.jar", "out/soong/.intermediates/direct_import/android_common/aar/classes-combined.jar", }, diff --git a/java/base.go b/java/base.go index 371d8f9a1..d8ccec6c6 100644 --- a/java/base.go +++ b/java/base.go @@ -1312,7 +1312,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath } } - jars := append(android.Paths(nil), kotlinJars...) + jars := slices.Clone(kotlinJars) j.compiledSrcJars = srcJars @@ -1327,7 +1327,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath // allow for the use of annotation processors that do function correctly // with sharding enabled. See: b/77284273. } - extraJars := append(android.CopyOf(extraCombinedJars), kotlinHeaderJars...) + extraJars := append(slices.Clone(kotlinHeaderJars), extraCombinedJars...) headerJarFileWithoutDepsOrJarjar, j.headerJarFile, j.repackagedHeaderJarFile = j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName, extraJars) if ctx.Failed() { @@ -1401,6 +1401,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath } } + jars = append(jars, extraCombinedJars...) + j.srcJarArgs, j.srcJarDeps = resourcePathsToJarArgs(srcFiles), srcFiles var includeSrcJar android.WritablePath @@ -1487,8 +1489,6 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath jars = append(jars, servicesJar) } - jars = append(android.CopyOf(extraCombinedJars), jars...) - // Combine the classes built from sources, any manifests, and any static libraries into // classes.jar. If there is only one input jar this step will be skipped. var outputFile android.OutputPath @@ -2413,7 +2413,8 @@ type JarJarProviderData struct { func (this JarJarProviderData) GetDebugString() string { result := "" - for k, v := range this.Rename { + for _, k := range android.SortedKeys(this.Rename) { + v := this.Rename[k] if strings.Contains(k, "android.companion.virtual.flags.FakeFeatureFlagsImpl") { result += k + "-->" + v + ";" } @@ -2669,7 +2670,8 @@ func (module *Module) collectJarJarRules(ctx android.ModuleContext) *JarJarProvi // to "" won't be in this list because they shouldn't be renamed yet. func getJarJarRuleText(provider *JarJarProviderData) string { result := "" - for orig, renamed := range provider.Rename { + for _, orig := range android.SortedKeys(provider.Rename) { + renamed := provider.Rename[orig] if renamed != "" { result += "rule " + orig + " " + renamed + "\n" } diff --git a/java/builder.go b/java/builder.go index 74a05f281..b07a622e4 100644 --- a/java/builder.go +++ b/java/builder.go @@ -212,6 +212,14 @@ var ( CommandDeps: []string{"${config.MergeZipsCmd}"}, }, "jarArgs") + combineJarRsp = pctx.AndroidStaticRule("combineJarRsp", + blueprint.RuleParams{ + Command: `${config.MergeZipsCmd} --ignore-duplicates -j $jarArgs $out @$out.rsp`, + CommandDeps: []string{"${config.MergeZipsCmd}"}, + Rspfile: "$out.rsp", + RspfileContent: "$in", + }, + "jarArgs") jarjar = pctx.AndroidStaticRule("jarjar", blueprint.RuleParams{ @@ -418,7 +426,7 @@ func emitXrefRule(ctx android.ModuleContext, xrefFile android.WritablePath, idx }) } -func turbineFlags(ctx android.ModuleContext, flags javaBuilderFlags) (string, android.Paths) { +func turbineFlags(ctx android.ModuleContext, flags javaBuilderFlags, dir string) (string, android.Paths) { var deps android.Paths classpath := flags.classpath @@ -443,13 +451,21 @@ func turbineFlags(ctx android.ModuleContext, flags javaBuilderFlags) (string, an deps = append(deps, classpath...) turbineFlags := bootClasspath + " " + classpath.FormTurbineClassPath("--classpath ") + const flagsLimit = 32 * 1024 + if len(turbineFlags) > flagsLimit { + flagsRspFile := android.PathForModuleOut(ctx, dir, "turbine-flags.rsp") + android.WriteFileRule(ctx, flagsRspFile, turbineFlags) + turbineFlags = "@" + flagsRspFile.String() + deps = append(deps, flagsRspFile) + } + return turbineFlags, deps } func TransformJavaToHeaderClasses(ctx android.ModuleContext, outputFile android.WritablePath, srcFiles, srcJars android.Paths, flags javaBuilderFlags) { - turbineFlags, deps := turbineFlags(ctx, flags) + turbineFlags, deps := turbineFlags(ctx, flags, "turbine") deps = append(deps, srcJars...) @@ -481,7 +497,7 @@ func TransformJavaToHeaderClasses(ctx android.ModuleContext, outputFile android. func TurbineApt(ctx android.ModuleContext, outputSrcJar, outputResJar android.WritablePath, srcFiles, srcJars android.Paths, flags javaBuilderFlags) { - turbineFlags, deps := turbineFlags(ctx, flags) + turbineFlags, deps := turbineFlags(ctx, flags, "kapt") deps = append(deps, srcJars...) @@ -534,14 +550,14 @@ func transformJavaToClasses(ctx android.ModuleContext, outputFile android.Writab deps = append(deps, srcJars...) - classpath := flags.classpath + javacClasspath := flags.classpath var bootClasspath string if flags.javaVersion.usesJavaModules() { var systemModuleDeps android.Paths bootClasspath, systemModuleDeps = flags.systemModules.FormJavaSystemModulesPath(ctx.Device()) deps = append(deps, systemModuleDeps...) - classpath = append(flags.java9Classpath, classpath...) + javacClasspath = append(flags.java9Classpath, javacClasspath...) } else { deps = append(deps, flags.bootClasspath...) if len(flags.bootClasspath) == 0 && ctx.Device() { @@ -553,7 +569,19 @@ func transformJavaToClasses(ctx android.ModuleContext, outputFile android.Writab } } - deps = append(deps, classpath...) + classpathArg := javacClasspath.FormJavaClassPath("-classpath") + + // Keep the command line under the MAX_ARG_STRLEN limit by putting the classpath argument into an rsp file + // if it is too long. + const classpathLimit = 64 * 1024 + if len(classpathArg) > classpathLimit { + classpathRspFile := outputFile.ReplaceExtension(ctx, "classpath") + android.WriteFileRule(ctx, classpathRspFile, classpathArg) + deps = append(deps, classpathRspFile) + classpathArg = "@" + classpathRspFile.String() + } + + deps = append(deps, javacClasspath...) deps = append(deps, flags.processorPath...) processor := "-proc:none" @@ -584,7 +612,7 @@ func transformJavaToClasses(ctx android.ModuleContext, outputFile android.Writab Args: map[string]string{ "javacFlags": flags.javacFlags, "bootClasspath": bootClasspath, - "classpath": classpath.FormJavaClassPath("-classpath"), + "classpath": classpathArg, "processorpath": flags.processorPath.FormJavaClassPath("-processorpath"), "processor": processor, "srcJars": strings.Join(srcJars.Strings(), " "), @@ -643,8 +671,23 @@ func TransformJarsToJar(ctx android.ModuleContext, outputFile android.WritablePa jarArgs = append(jarArgs, "-D") } + rule := combineJar + // Keep the command line under the MAX_ARG_STRLEN limit by putting the list of jars into an rsp file + // if it is too long. + const jarsLengthLimit = 64 * 1024 + jarsLength := 0 + for i, jar := range jars { + if i != 0 { + jarsLength += 1 + } + jarsLength += len(jar.String()) + } + if jarsLength > jarsLengthLimit { + rule = combineJarRsp + } + ctx.Build(pctx, android.BuildParams{ - Rule: combineJar, + Rule: rule, Description: desc, Output: outputFile, Inputs: jars, diff --git a/java/core-libraries/Android.bp b/java/core-libraries/Android.bp index 8ffe5113c..ab72e8b6d 100644 --- a/java/core-libraries/Android.bp +++ b/java/core-libraries/Android.bp @@ -64,6 +64,7 @@ java_api_library { "stub-annotations", ], enable_validation: false, + stubs_type: "everything", } java_library { @@ -248,6 +249,7 @@ java_api_library { "stub-annotations", ], visibility: ["//visibility:private"], + stubs_type: "everything", } // Produces a dist file that is used by the @@ -358,6 +360,7 @@ java_api_library { libs: [ "stub-annotations", ], + stubs_type: "everything", } java_library { @@ -446,6 +449,7 @@ java_api_library { libs: [ "stub-annotations", ], + stubs_type: "everything", } java_library { diff --git a/java/droidstubs.go b/java/droidstubs.go index b1126146c..f4bcaca15 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -52,6 +52,19 @@ func (s StubsType) String() string { } } +func StringToStubsType(s string) StubsType { + switch strings.ToLower(s) { + case Everything.String(): + return Everything + case Runtime.String(): + return Runtime + case Exportable.String(): + return Exportable + default: + return Unavailable + } +} + func init() { RegisterStubsBuildComponents(android.InitRegistrationContext) } @@ -731,7 +744,7 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi // defined for a module, simply revert all flagged apis annotations. If aconfig_declarations // property is defined, apply transformations and only revert the flagged apis that are not // enabled via release configurations and are not specified in aconfig_declarations -func (d *Droidstubs) generateRevertAnnotationArgs(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsType StubsType, aconfigFlagsPaths android.Paths) { +func generateRevertAnnotationArgs(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsType StubsType, aconfigFlagsPaths android.Paths) { if len(aconfigFlagsPaths) == 0 { cmd.Flag("--revert-annotation android.annotation.FlaggedApi") @@ -1106,7 +1119,7 @@ func (d *Droidstubs) optionalStubCmd(ctx android.ModuleContext, params stubsComm cmd := d.commonMetalavaStubCmd(ctx, rule, params) - d.generateRevertAnnotationArgs(ctx, cmd, params.stubConfig.stubsType, params.stubConfig.deps.aconfigProtoFiles) + generateRevertAnnotationArgs(ctx, cmd, params.stubConfig.stubsType, params.stubConfig.deps.aconfigProtoFiles) if params.stubConfig.doApiLint { // Pass the lint baseline file as an input to resolve the lint errors. diff --git a/java/droidstubs_test.go b/java/droidstubs_test.go index ca34e0ef1..c86e8bf0f 100644 --- a/java/droidstubs_test.go +++ b/java/droidstubs_test.go @@ -337,6 +337,7 @@ func TestGeneratedApiContributionVisibilityTest(t *testing.T) { name: "bar", api_surface: "public", api_contributions: ["foo.api.contribution"], + stubs_type: "everything", } ` ctx, _ := testJavaWithFS(t, ` diff --git a/java/java.go b/java/java.go index af4c3be3b..794020dc5 100644 --- a/java/java.go +++ b/java/java.go @@ -24,6 +24,7 @@ import ( "sort" "strings" + "android/soong/aconfig" "android/soong/remoteexec" "android/soong/testing" @@ -1863,6 +1864,10 @@ type ApiLibrary struct { dexJarFile OptionalDexJarPath validationPaths android.Paths + + stubsType StubsType + + aconfigProtoFiles android.Paths } type JavaApiLibraryProperties struct { @@ -1904,6 +1909,20 @@ type JavaApiLibraryProperties struct { // in sync with the source Java files. However, the environment variable // DISABLE_STUB_VALIDATION has precedence over this property. Enable_validation *bool + + // Type of stubs the module should generate. Must be one of "everything", "runtime" or + // "exportable". Defaults to "everything". + // - "everything" stubs include all non-flagged apis and flagged apis, regardless of the state + // of the flag. + // - "runtime" stubs include all non-flagged apis and flagged apis that are ENABLED or + // READ_WRITE, and all other flagged apis are stripped. + // - "exportable" stubs include all non-flagged apis and flagged apis that are ENABLED and + // READ_ONLY, and all other flagged apis are stripped. + Stubs_type *string + + // List of aconfig_declarations module names that the stubs generated in this module + // depend on. + Aconfig_declarations []string } func ApiLibraryFactory() android.Module { @@ -2067,6 +2086,9 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { if al.properties.System_modules != nil { ctx.AddVariationDependencies(nil, systemModulesTag, String(al.properties.System_modules)) } + for _, aconfigDeclarationsName := range al.properties.Aconfig_declarations { + ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfigDeclarationsName) + } } // Map where key is the api scope name and value is the int value @@ -2087,7 +2109,23 @@ func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFiles return srcFilesInfo } +var validstubsType = []StubsType{Everything, Runtime, Exportable} + +func (al *ApiLibrary) validateProperties(ctx android.ModuleContext) { + if al.properties.Stubs_type == nil { + ctx.ModuleErrorf("java_api_library module type must specify stubs_type property.") + } else { + al.stubsType = StringToStubsType(proptools.String(al.properties.Stubs_type)) + } + + if !android.InList(al.stubsType, validstubsType) { + ctx.PropertyErrorf("stubs_type", "%s is not a valid stubs_type property value. "+ + "Must be one of %s.", proptools.String(al.properties.Stubs_type), validstubsType) + } +} + func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { + al.validateProperties(ctx) rule := android.NewRuleBuilder(pctx, ctx) @@ -2131,6 +2169,18 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { if currentApiTimestampProvider, ok := dep.(currentApiTimestampProvider); ok { al.validationPaths = append(al.validationPaths, currentApiTimestampProvider.CurrentApiTimestamp()) } + case aconfigDeclarationTag: + if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok { + al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPath) + } else if provider, ok := android.OtherModuleProvider(ctx, dep, aconfig.CodegenInfoProvider); ok { + al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPaths...) + } else { + ctx.ModuleErrorf("Only aconfig_declarations and aconfig_declarations_group "+ + "module type is allowed for flags_packages property, but %s is neither "+ + "of these supported module types", + dep.Name(), + ) + } } }) @@ -2156,6 +2206,8 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { al.addValidation(ctx, cmd, al.validationPaths) + generateRevertAnnotationArgs(ctx, cmd, al.stubsType, al.aconfigProtoFiles) + al.stubsSrcJar = android.PathForModuleOut(ctx, "metalava", ctx.ModuleName()+"-"+"stubs.srcjar") al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, "metalava", "stubs.jar") al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName())) diff --git a/java/java_test.go b/java/java_test.go index 42301d866..2f3ccb98d 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1756,6 +1756,7 @@ func TestJavaApiContributionEmptyApiFile(t *testing.T) { name: "bar", api_surface: "public", api_contributions: ["foo"], + stubs_type: "everything", } `) } @@ -1792,12 +1793,14 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) { name: "bar1", api_surface: "public", api_contributions: ["foo1"], + stubs_type: "everything", } java_api_library { name: "bar2", api_surface: "system", api_contributions: ["foo1", "foo2"], + stubs_type: "everything", } `) @@ -1885,12 +1888,14 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) { name: "bar1", api_surface: "public", api_contributions: ["foo1"], + stubs_type: "everything", } java_api_library { name: "bar2", api_surface: "public", defaults:["baz1"], + stubs_type: "everything", } java_api_library { @@ -1898,6 +1903,7 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) { api_surface: "system", defaults:["baz1", "baz2"], api_contributions: ["foo4"], + stubs_type: "everything", } `) @@ -1962,12 +1968,14 @@ func TestJavaApiLibraryJarGeneration(t *testing.T) { name: "bar1", api_surface: "public", api_contributions: ["foo1"], + stubs_type: "everything", } java_api_library { name: "bar2", api_surface: "system", api_contributions: ["foo1", "foo2"], + stubs_type: "everything", } `) @@ -2044,6 +2052,7 @@ func TestJavaApiLibraryLibsLink(t *testing.T) { api_surface: "public", api_contributions: ["foo1"], libs: ["lib1"], + stubs_type: "everything", } java_api_library { @@ -2051,6 +2060,7 @@ func TestJavaApiLibraryLibsLink(t *testing.T) { api_surface: "system", api_contributions: ["foo1", "foo2"], libs: ["lib1", "lib2", "bar1"], + stubs_type: "everything", } `) @@ -2130,6 +2140,7 @@ func TestJavaApiLibraryStaticLibsLink(t *testing.T) { api_surface: "public", api_contributions: ["foo1"], static_libs: ["lib1"], + stubs_type: "everything", } java_api_library { @@ -2137,6 +2148,7 @@ func TestJavaApiLibraryStaticLibsLink(t *testing.T) { api_surface: "system", api_contributions: ["foo1", "foo2"], static_libs: ["lib1", "lib2", "bar1"], + stubs_type: "everything", } `) @@ -2184,6 +2196,7 @@ func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) { name: "lib1", api_surface: "public", api_contributions: ["foo1", "foo2"], + stubs_type: "everything", } ` @@ -2207,6 +2220,7 @@ func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) { api_surface: "public", api_contributions: ["foo1"], full_api_surface_stub: "lib1", + stubs_type: "everything", } `) @@ -2368,6 +2382,7 @@ func TestJavaApiContributionImport(t *testing.T) { java_api_library { name: "foo", api_contributions: ["bar"], + stubs_type: "everything", } java_api_contribution_import { name: "bar", @@ -2394,6 +2409,7 @@ func TestJavaApiLibraryApiFilesSorting(t *testing.T) { "module-lib-api-stubs-docs-non-updatable.api.contribution", "api-stubs-docs-non-updatable.api.contribution", ], + stubs_type: "everything", } `) m := ctx.ModuleForTests("foo", "android_common") @@ -2466,6 +2482,7 @@ func TestApiLibraryDroidstubsDependency(t *testing.T) { "api-stubs-docs-non-updatable.api.contribution", ], enable_validation: true, + stubs_type: "everything", } java_api_library { name: "bar", @@ -2473,6 +2490,7 @@ func TestApiLibraryDroidstubsDependency(t *testing.T) { "api-stubs-docs-non-updatable.api.contribution", ], enable_validation: false, + stubs_type: "everything", } `) @@ -2624,3 +2642,54 @@ func TestMultiplePrebuilts(t *testing.T) { android.AssertStringEquals(t, "unexpected LOCAL_MODULE", "bar", entries.EntryMap["LOCAL_MODULE"][0]) } } + +func TestApiLibraryAconfigDeclarations(t *testing.T) { + result := android.GroupFixturePreparers( + prepareForJavaTest, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + }), + android.FixtureMergeMockFs(map[string][]byte{ + "a/A.java": nil, + "a/current.txt": nil, + "a/removed.txt": nil, + }), + ).RunTestWithBp(t, ` + aconfig_declarations { + name: "bar", + package: "com.example.package", + srcs: [ + "bar.aconfig", + ], + } + java_api_contribution { + name: "baz", + api_file: "a/current.txt", + api_surface: "public", + } + java_api_library { + name: "foo", + api_surface: "public", + api_contributions: [ + "baz", + ], + aconfig_declarations: [ + "bar", + ], + stubs_type: "exportable", + enable_validation: false, + } + `) + + // Check if java_api_library depends on aconfig_declarations + android.AssertBoolEquals(t, "foo expected to depend on bar", + CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"), true) + + m := result.ModuleForTests("foo", "android_common") + android.AssertStringDoesContain(t, "foo generates revert annotations file", + strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt") + + // revert-annotations.txt passed to exportable stubs generation metalava command + manifest := m.Output("metalava.sbox.textproto") + cmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, manifest).Commands[0].Command) + android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "revert-annotations-exportable.txt") +} diff --git a/java/sdk_library.go b/java/sdk_library.go index d532aaa00..cdd04483d 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2024,6 +2024,7 @@ func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, Full_api_surface_stub *string System_modules *string Enable_validation *bool + Stubs_type *string }{} props.Name = proptools.StringPtr(module.apiLibraryModuleName(apiScope)) @@ -2073,6 +2074,7 @@ func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, props.System_modules = module.deviceProperties.System_modules props.Enable_validation = proptools.BoolPtr(true) + props.Stubs_type = proptools.StringPtr("everything") mctx.CreateModule(ApiLibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) } diff --git a/java/testing.go b/java/testing.go index 04e8c734e..631d51662 100644 --- a/java/testing.go +++ b/java/testing.go @@ -523,10 +523,11 @@ func gatherRequiredDepsForTest() string { for libName, droidstubs := range extraApiLibraryModules { bp += fmt.Sprintf(` - java_api_library { - name: "%s", - api_contributions: ["%s"], - } + java_api_library { + name: "%s", + api_contributions: ["%s"], + stubs_type: "everything", + } `, libName, droidstubs.name+".api.contribution") } |
