diff options
Diffstat (limited to 'java')
| -rw-r--r-- | java/aar.go | 22 | ||||
| -rw-r--r-- | java/aar_test.go | 45 | ||||
| -rwxr-xr-x | java/app.go | 2 | ||||
| -rw-r--r-- | java/app_test.go | 54 | ||||
| -rw-r--r-- | java/base.go | 55 | ||||
| -rw-r--r-- | java/config/config.go | 27 | ||||
| -rw-r--r-- | java/config/droidstubs.go | 8 | ||||
| -rw-r--r-- | java/config/error_prone.go | 21 | ||||
| -rw-r--r-- | java/droidstubs.go | 36 | ||||
| -rw-r--r-- | java/java.go | 9 | ||||
| -rw-r--r-- | java/sdk.go | 15 | ||||
| -rw-r--r-- | java/sdk_library.go | 38 | ||||
| -rw-r--r-- | java/sdk_library_test.go | 13 |
13 files changed, 209 insertions, 136 deletions
diff --git a/java/aar.go b/java/aar.go index 1734da945..fef0d8c58 100644 --- a/java/aar.go +++ b/java/aar.go @@ -164,7 +164,9 @@ func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) { } func (a *aapt) useResourceProcessorBusyBox(ctx android.BaseModuleContext) bool { - return BoolDefault(a.aaptProperties.Use_resource_processor, ctx.Config().UseResourceProcessorByDefault()) + return BoolDefault(a.aaptProperties.Use_resource_processor, ctx.Config().UseResourceProcessorByDefault()) && + // TODO(b/331641946): remove this when ResourceProcessorBusyBox supports generating shared libraries. + !slices.Contains(a.aaptProperties.Aaptflags, "--shared-lib") } func (a *aapt) filterProduct() string { @@ -1154,16 +1156,22 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { } extractedAARDir := android.PathForModuleOut(ctx, "aar") - classpathFile := extractedAARDir.Join(ctx, "classes-combined.jar") + classpathFile := extractedAARDir.Join(ctx, ctx.ModuleName()+".jar") a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml") a.rTxt = extractedAARDir.Join(ctx, "R.txt") a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip") a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt") + transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx) android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{ ProguardFlagsFiles: android.NewDepSet[android.Path]( android.POSTORDER, android.Paths{a.proguardFlags}, + transitiveProguardFlags, + ), + UnconditionallyExportedProguardFlags: android.NewDepSet[android.Path]( + android.POSTORDER, nil, + transitiveUnconditionalExportedFlags, ), }) @@ -1276,14 +1284,18 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { addCLCFromDep(ctx, module, a.classLoaderContexts) }) + var implementationJarFile android.OutputPath if len(staticJars) > 0 { combineJars := append(android.Paths{classpathFile}, staticJars...) - a.implementationJarFile = android.PathForModuleOut(ctx, "combined", ctx.ModuleName()+".jar") - TransformJarsToJar(ctx, a.implementationJarFile, "combine", combineJars, android.OptionalPath{}, false, nil, nil) + implementationJarFile = android.PathForModuleOut(ctx, "combined", ctx.ModuleName()+".jar").OutputPath + TransformJarsToJar(ctx, implementationJarFile, "combine", combineJars, android.OptionalPath{}, false, nil, nil) } else { - a.implementationJarFile = classpathFile + implementationJarFile = classpathFile } + // Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource + a.implementationJarFile = implementationJarFile.WithoutRel() + if len(staticHeaderJars) > 0 { combineJars := append(android.Paths{classpathFile}, staticHeaderJars...) a.headerJarFile = android.PathForModuleOut(ctx, "turbine-combined", ctx.ModuleName()+".jar") diff --git a/java/aar_test.go b/java/aar_test.go index 6bd53f228..3361bf929 100644 --- a/java/aar_test.go +++ b/java/aar_test.go @@ -128,3 +128,48 @@ func TestLibraryFlagsPackages(t *testing.T) { "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt", ) } + +func TestAndroidLibraryOutputFilesRel(t *testing.T) { + result := android.GroupFixturePreparers( + PrepareForTestWithJavaDefaultModules, + ).RunTestWithBp(t, ` + android_library { + name: "foo", + srcs: ["a.java"], + } + + android_library_import { + name: "bar", + aars: ["bar.aar"], + + } + + android_library_import { + name: "baz", + aars: ["baz.aar"], + static_libs: ["bar"], + } + `) + + foo := result.ModuleForTests("foo", "android_common") + bar := result.ModuleForTests("bar", "android_common") + baz := result.ModuleForTests("baz", "android_common") + + fooOutputPath := android.OutputFileForModule(android.PathContext(nil), foo.Module(), "") + barOutputPath := android.OutputFileForModule(android.PathContext(nil), bar.Module(), "") + bazOutputPath := android.OutputFileForModule(android.PathContext(nil), baz.Module(), "") + + android.AssertPathRelativeToTopEquals(t, "foo output path", + "out/soong/.intermediates/foo/android_common/javac/foo.jar", fooOutputPath) + android.AssertPathRelativeToTopEquals(t, "bar output path", + "out/soong/.intermediates/bar/android_common/aar/bar.jar", barOutputPath) + android.AssertPathRelativeToTopEquals(t, "baz output path", + "out/soong/.intermediates/baz/android_common/combined/baz.jar", bazOutputPath) + + android.AssertStringEquals(t, "foo relative output path", + "foo.jar", fooOutputPath.Rel()) + android.AssertStringEquals(t, "bar relative output path", + "bar.jar", barOutputPath.Rel()) + android.AssertStringEquals(t, "baz relative output path", + "baz.jar", bazOutputPath.Rel()) +} diff --git a/java/app.go b/java/app.go index 2abc45107..7b2577538 100755 --- a/java/app.go +++ b/java/app.go @@ -1337,6 +1337,8 @@ func (a *AndroidTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { OutputFile: a.OutputFile(), TestConfig: a.testConfig, HostRequiredModuleNames: a.HostRequiredModuleNames(), + TestSuites: a.testProperties.Test_suites, + IsHost: false, }) } diff --git a/java/app_test.go b/java/app_test.go index ca9d31704..8262777b2 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -3625,7 +3625,10 @@ func TestExportedProguardFlagFiles(t *testing.T) { android_app { name: "foo", sdk_version: "current", - static_libs: ["lib1"], + static_libs: [ + "lib1", + "lib3", + ], } android_library { @@ -3633,22 +3636,49 @@ func TestExportedProguardFlagFiles(t *testing.T) { sdk_version: "current", optimize: { proguard_flags_files: ["lib1proguard.cfg"], + }, + static_libs: ["lib2"], + } + + android_library { + name: "lib2", + sdk_version: "current", + optimize: { + proguard_flags_files: ["lib2proguard.cfg"], } } - `) - m := ctx.ModuleForTests("foo", "android_common") - hasLib1Proguard := false - for _, s := range m.Rule("java.r8").Implicits.Strings() { - if s == "lib1proguard.cfg" { - hasLib1Proguard = true - break + android_library_import { + name: "lib3", + sdk_version: "current", + aars: ["lib3.aar"], + static_libs: ["lib4"], } - } - if !hasLib1Proguard { - t.Errorf("App does not use library proguard config") - } + android_library { + name: "lib4", + sdk_version: "current", + optimize: { + proguard_flags_files: ["lib4proguard.cfg"], + } + } + + + `) + + m := ctx.ModuleForTests("foo", "android_common") + r8 := m.Rule("java.r8") + implicits := r8.Implicits.RelativeToTop().Strings() + android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg") + android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg") + android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg") + android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt") + + flags := r8.Args["r8Flags"] + android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg") + android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg") + android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg") + android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt") } func TestTargetSdkVersionManifestFixer(t *testing.T) { diff --git a/java/base.go b/java/base.go index be286fe33..e2f20cee5 100644 --- a/java/base.go +++ b/java/base.go @@ -94,9 +94,6 @@ type CommonProperties struct { // if not blank, used as prefix to generate repackage rule Jarjar_prefix *string - // if set to true, skip the jarjar repackaging - Skip_jarjar_repackage *bool - // If not blank, set the java version passed to javac as -source and -target Java_version *string @@ -804,7 +801,7 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { // Add dependency on libraries that provide additional hidden api annotations. ctx.AddVariationDependencies(nil, hiddenApiAnnotationsTag, j.properties.Hiddenapi_additional_annotations...) - if ctx.DeviceConfig().VndkVersion() != "" && ctx.Config().EnforceInterPartitionJavaSdkLibrary() { + if ctx.Config().EnforceInterPartitionJavaSdkLibrary() { // Require java_sdk_library at inter-partition java dependency to ensure stable // interface between partitions. If inter-partition java_library dependency is detected, // raise build error because java_library doesn't have a stable interface. @@ -1103,13 +1100,11 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath jarjarProviderData := j.collectJarJarRules(ctx) if jarjarProviderData != nil { android.SetProvider(ctx, JarJarProvider, *jarjarProviderData) - if !proptools.Bool(j.properties.Skip_jarjar_repackage) { - text := getJarJarRuleText(jarjarProviderData) - if text != "" { - ruleTextFile := android.PathForModuleOut(ctx, "repackaged-jarjar", "repackaging.txt") - android.WriteFileRule(ctx, ruleTextFile, text) - j.repackageJarjarRules = ruleTextFile - } + text := getJarJarRuleText(jarjarProviderData) + if text != "" { + ruleTextFile := android.PathForModuleOut(ctx, "repackaged-jarjar", "repackaging.txt") + android.WriteFileRule(ctx, ruleTextFile, text) + j.repackageJarjarRules = ruleTextFile } } @@ -1294,10 +1289,12 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath return } + kotlinJarPath := j.repackageFlagsIfNecessary(ctx, kotlinJar.OutputPath, jarName, "kotlinc") + // Make javac rule depend on the kotlinc rule flags.classpath = append(classpath{kotlinHeaderJar}, flags.classpath...) - kotlinJars = append(kotlinJars, kotlinJar) + kotlinJars = append(kotlinJars, kotlinJarPath) kotlinHeaderJars = append(kotlinHeaderJars, kotlinHeaderJar) // Jar kotlin classes into the final jar after javac @@ -1377,6 +1374,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath for idx, shardSrc := range shardSrcs { classes := j.compileJavaClasses(ctx, jarName, idx, shardSrc, nil, flags, extraJarDeps) + classes = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac-"+strconv.Itoa(idx)) jars = append(jars, classes) } } @@ -1389,11 +1387,13 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath for idx, shardSrcJars := range shardSrcJarsList { classes := j.compileJavaClasses(ctx, jarName, startIdx+idx, nil, shardSrcJars, flags, extraJarDeps) + classes = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac-"+strconv.Itoa(startIdx+idx)) jars = append(jars, classes) } } } else { classes := j.compileJavaClasses(ctx, jarName, -1, uniqueJavaFiles, srcJars, flags, extraJarDeps) + classes = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac") jars = append(jars, classes) } if ctx.Failed() { @@ -1552,16 +1552,6 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath } } - // Automatic jarjar rules propagation - if j.repackageJarjarRules != nil { - repackagedJarjarFile := android.PathForModuleOut(ctx, "repackaged-jarjar", jarName).OutputPath - TransformJarJar(ctx, repackagedJarjarFile, outputFile, j.repackageJarjarRules) - outputFile = repackagedJarjarFile - if ctx.Failed() { - return - } - } - // Check package restrictions if necessary. if len(j.properties.Permitted_packages) > 0 { // Time stamp file created by the package check rule. @@ -1757,10 +1747,7 @@ func (j *Module) useCompose() bool { return android.InList("androidx.compose.runtime_runtime", j.properties.Static_libs) } -func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo { - transitiveUnconditionalExportedFlags := []*android.DepSet[android.Path]{} - transitiveProguardFlags := []*android.DepSet[android.Path]{} - +func collectDepProguardSpecInfo(ctx android.ModuleContext) (transitiveProguardFlags, transitiveUnconditionalExportedFlags []*android.DepSet[android.Path]) { ctx.VisitDirectDeps(func(m android.Module) { depProguardInfo, _ := android.OtherModuleProvider(ctx, m, ProguardSpecInfoProvider) depTag := ctx.OtherModuleDependencyTag(m) @@ -1775,6 +1762,12 @@ func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpec } }) + return transitiveProguardFlags, transitiveUnconditionalExportedFlags +} + +func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo { + transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx) + directUnconditionalExportedFlags := android.Paths{} proguardFlagsForThisModule := android.PathsForModuleSrc(ctx, j.dexProperties.Optimize.Proguard_flags_files) exportUnconditionally := proptools.Bool(j.dexProperties.Optimize.Export_proguard_flags_files) @@ -2683,6 +2676,16 @@ func getJarJarRuleText(provider *JarJarProviderData) string { return result } +// Repackage the flags if the jarjar rule txt for the flags is generated +func (j *Module) repackageFlagsIfNecessary(ctx android.ModuleContext, infile android.WritablePath, jarName, info string) android.WritablePath { + if j.repackageJarjarRules == nil { + return infile + } + repackagedJarjarFile := android.PathForModuleOut(ctx, "repackaged-jarjar", info+jarName) + TransformJarJar(ctx, repackagedJarjarFile, infile, j.repackageJarjarRules) + return repackagedJarjarFile +} + func addPlugins(deps *deps, pluginJars android.Paths, pluginClasses ...string) { deps.processorPath = append(deps.processorPath, pluginJars...) deps.processorClasses = append(deps.processorClasses, pluginClasses...) diff --git a/java/config/config.go b/java/config/config.go index d720046a1..2bb50f62a 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -26,8 +26,7 @@ import ( ) var ( - pctx = android.NewPackageContext("android/soong/java/config") - exportedVars = android.NewExportedVariables(pctx) + pctx = android.NewPackageContext("android/soong/java/config") LegacyCorePlatformBootclasspathLibraries = []string{"legacy.core.platform.api.stubs", "core-lambda-stubs"} LegacyCorePlatformSystemModules = "legacy-core-platform-api-stubs-system-modules" @@ -79,30 +78,30 @@ var ( func init() { pctx.Import("github.com/google/blueprint/bootstrap") - exportedVars.ExportStringStaticVariable("JavacHeapSize", "4096M") - exportedVars.ExportStringStaticVariable("JavacHeapFlags", "-J-Xmx${JavacHeapSize}") + pctx.StaticVariable("JavacHeapSize", "4096M") + pctx.StaticVariable("JavacHeapFlags", "-J-Xmx${JavacHeapSize}") // ErrorProne can use significantly more memory than javac alone, give it a higher heap // size (b/221480398). - exportedVars.ExportStringStaticVariable("ErrorProneHeapSize", "8192M") - exportedVars.ExportStringStaticVariable("ErrorProneHeapFlags", "-J-Xmx${ErrorProneHeapSize}") + pctx.StaticVariable("ErrorProneHeapSize", "8192M") + pctx.StaticVariable("ErrorProneHeapFlags", "-J-Xmx${ErrorProneHeapSize}") // D8 invocations are shorter lived, so we restrict their JIT tiering relative to R8. // Note that the `-JXX` prefix syntax is specific to the R8/D8 invocation wrappers. - exportedVars.ExportStringListStaticVariable("D8Flags", append([]string{ + pctx.StaticVariable("D8Flags", strings.Join(append([]string{ "-JXmx4096M", "-JXX:+TieredCompilation", "-JXX:TieredStopAtLevel=1", "-JDcom.android.tools.r8.emitRecordAnnotationsInDex", "-JDcom.android.tools.r8.emitPermittedSubclassesAnnotationsInDex", - }, dexerJavaVmFlagsList...)) - exportedVars.ExportStringListStaticVariable("R8Flags", append([]string{ + }, dexerJavaVmFlagsList...), " ")) + pctx.StaticVariable("R8Flags", strings.Join(append([]string{ "-JXmx4096M", "-JDcom.android.tools.r8.emitRecordAnnotationsInDex", "-JDcom.android.tools.r8.emitPermittedSubclassesAnnotationsInDex", - }, dexerJavaVmFlagsList...)) + }, dexerJavaVmFlagsList...), " ")) - exportedVars.ExportStringListStaticVariable("CommonJdkFlags", []string{ + pctx.StaticVariable("CommonJdkFlags", strings.Join([]string{ `-Xmaxerrs 9999999`, `-encoding UTF-8`, `-sourcepath ""`, @@ -116,10 +115,10 @@ func init() { // b/65004097: prevent using java.lang.invoke.StringConcatFactory when using -target 1.9 `-XDstringConcat=inline`, - }) + }, " ")) - exportedVars.ExportStringListStaticVariable("JavaVmFlags", javaVmFlagsList) - exportedVars.ExportStringListStaticVariable("JavacVmFlags", javacVmFlagsList) + pctx.StaticVariable("JavaVmFlags", strings.Join(javaVmFlagsList, " ")) + pctx.StaticVariable("JavacVmFlags", strings.Join(javacVmFlagsList, " ")) pctx.VariableConfigMethod("hostPrebuiltTag", android.Config.PrebuiltOS) diff --git a/java/config/droidstubs.go b/java/config/droidstubs.go index 39eec444c..04a3f96b9 100644 --- a/java/config/droidstubs.go +++ b/java/config/droidstubs.go @@ -58,11 +58,7 @@ const ( ) func init() { - exportedVars.ExportStringList("MetalavaFlags", metalavaFlags) + pctx.StaticVariable("MetalavaAnnotationsFlags", strings.Join(metalavaAnnotationsFlags, " ")) - exportedVars.ExportString("MetalavaAddOpens", MetalavaAddOpens) - - exportedVars.ExportStringListStaticVariable("MetalavaAnnotationsFlags", metalavaAnnotationsFlags) - - exportedVars.ExportStringListStaticVariable("MetalavaAnnotationWarningsFlags", metalavaAnnotationsWarningsFlags) + pctx.StaticVariable("MetalavaAnnotationWarningsFlags", strings.Join(metalavaAnnotationsWarningsFlags, " ")) } diff --git a/java/config/error_prone.go b/java/config/error_prone.go index 5f853c812..767164f70 100644 --- a/java/config/error_prone.go +++ b/java/config/error_prone.go @@ -15,6 +15,7 @@ package config import ( + "android/soong/android" "strings" ) @@ -29,23 +30,23 @@ var ( ) // Wrapper that grabs value of val late so it can be initialized by a later module's init function -func errorProneVar(val *[]string, sep string) func() string { - return func() string { +func errorProneVar(val *[]string, sep string) func(android.PackageVarContext) string { + return func(android.PackageVarContext) string { return strings.Join(*val, sep) } } func init() { - exportedVars.ExportVariableFuncVariable("ErrorProneClasspath", errorProneVar(&ErrorProneClasspath, ":")) - exportedVars.ExportVariableFuncVariable("ErrorProneChecksError", errorProneVar(&ErrorProneChecksError, " ")) - exportedVars.ExportVariableFuncVariable("ErrorProneChecksWarning", errorProneVar(&ErrorProneChecksWarning, " ")) - exportedVars.ExportVariableFuncVariable("ErrorProneChecksDefaultDisabled", errorProneVar(&ErrorProneChecksDefaultDisabled, " ")) - exportedVars.ExportVariableFuncVariable("ErrorProneChecksOff", errorProneVar(&ErrorProneChecksOff, " ")) - exportedVars.ExportVariableFuncVariable("ErrorProneFlags", errorProneVar(&ErrorProneFlags, " ")) - exportedVars.ExportStringListStaticVariable("ErrorProneChecks", []string{ + pctx.VariableFunc("ErrorProneClasspath", errorProneVar(&ErrorProneClasspath, ":")) + pctx.VariableFunc("ErrorProneChecksError", errorProneVar(&ErrorProneChecksError, " ")) + pctx.VariableFunc("ErrorProneChecksWarning", errorProneVar(&ErrorProneChecksWarning, " ")) + pctx.VariableFunc("ErrorProneChecksDefaultDisabled", errorProneVar(&ErrorProneChecksDefaultDisabled, " ")) + pctx.VariableFunc("ErrorProneChecksOff", errorProneVar(&ErrorProneChecksOff, " ")) + pctx.VariableFunc("ErrorProneFlags", errorProneVar(&ErrorProneFlags, " ")) + pctx.StaticVariable("ErrorProneChecks", strings.Join([]string{ "${ErrorProneChecksOff}", "${ErrorProneChecksError}", "${ErrorProneChecksWarning}", "${ErrorProneChecksDefaultDisabled}", - }) + }, " ")) } diff --git a/java/droidstubs.go b/java/droidstubs.go index 9556e956a..02b81a4fe 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -687,6 +687,23 @@ func (d *Droidstubs) apiLevelsGenerationFlags(ctx android.ModuleContext, cmd *an } } +func (d *Droidstubs) apiCompatibilityFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsType StubsType) { + if len(d.Javadoc.properties.Out) > 0 { + ctx.PropertyErrorf("out", "out property may not be combined with check_api") + } + + apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file)) + removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file)) + + cmd.FlagWithInput("--check-compatibility:api:released ", apiFile) + cmd.FlagWithInput("--check-compatibility:removed:released ", removedApiFile) + + baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Last_released.Baseline_file) + if baselineFile.Valid() { + cmd.FlagWithInput("--baseline:compatibility:released ", baselineFile.Path()) + } +} + func metalavaUseRbe(ctx android.ModuleContext) bool { return ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_METALAVA") } @@ -831,6 +848,10 @@ func (d *Droidstubs) commonMetalavaStubCmd(ctx android.ModuleContext, rule *andr d.inclusionAnnotationsFlags(ctx, cmd) d.apiLevelsAnnotationsFlags(ctx, cmd, params.stubConfig.stubsType, params.apiVersionsXml) + if params.stubConfig.doCheckReleased { + d.apiCompatibilityFlags(ctx, cmd, params.stubConfig.stubsType) + } + d.expandArgs(ctx, cmd) for _, o := range d.Javadoc.properties.Out { @@ -989,25 +1010,12 @@ func (d *Droidstubs) everythingOptionalCmd(ctx android.ModuleContext, cmd *andro // Add "check released" options. (Detect incompatible API changes from the last public release) if doCheckReleased { - if len(d.Javadoc.properties.Out) > 0 { - ctx.PropertyErrorf("out", "out property may not be combined with check_api") - } - - apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file)) - removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file)) baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Last_released.Baseline_file) - updatedBaselineOutput := android.PathForModuleOut(ctx, Everything.String(), "last_released_baseline.txt") - d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, Everything.String(), "check_last_released_api.timestamp") - - cmd.FlagWithInput("--check-compatibility:api:released ", apiFile) - cmd.FlagWithInput("--check-compatibility:removed:released ", removedApiFile) - if baselineFile.Valid() { - cmd.FlagWithInput("--baseline:compatibility:released ", baselineFile.Path()) + updatedBaselineOutput := android.PathForModuleOut(ctx, Everything.String(), "last_released_baseline.txt") cmd.FlagWithOutput("--update-baseline:compatibility:released ", updatedBaselineOutput) } - // Note this string includes quote ($' ... '), which decodes the "\n"s. msg := `$'\n******************************\n` + `You have tried to change the API from what has been previously released in\n` + diff --git a/java/java.go b/java/java.go index 72536cd6d..fb5bb1cae 100644 --- a/java/java.go +++ b/java/java.go @@ -800,6 +800,7 @@ var ( "android.hardware.security.keymint-V2-java": true, "android.hardware.security.keymint-V3-java": true, "android.hardware.security.keymint-V4-java": true, + "android.hardware.security.secretkeeper-V1-java": true, "android.hardware.security.secureclock-V1-java": true, "android.hardware.security.secureclock-V2-java": true, "android.hardware.thermal-V1-java": true, @@ -1438,6 +1439,14 @@ func (j *TestHost) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.Test.generateAndroidBuildActionsWithConfig(ctx, configs) android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{}) + android.SetProvider(ctx, tradefed.BaseTestProviderKey, tradefed.BaseTestProviderData{ + InstalledFiles: j.data, + OutputFile: j.outputFile, + TestConfig: j.testConfig, + RequiredModuleNames: j.RequiredModuleNames(), + TestSuites: j.testProperties.Test_suites, + IsHost: true, + }) } func (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) { diff --git a/java/sdk.go b/java/sdk.go index 3591ccdb6..d972c19bd 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -31,7 +31,6 @@ func init() { var sdkFrameworkAidlPathKey = android.NewOnceKey("sdkFrameworkAidlPathKey") var nonUpdatableFrameworkAidlPathKey = android.NewOnceKey("nonUpdatableFrameworkAidlPathKey") -var apiFingerprintPathKey = android.NewOnceKey("apiFingerprintPathKey") func UseApiFingerprint(ctx android.BaseModuleContext) (useApiFingerprint bool, fingerprintSdkVersion string, fingerprintDeps android.OutputPath) { if ctx.Config().UnbundledBuild() && !ctx.Config().AlwaysUsePrebuiltSdks() { @@ -45,8 +44,8 @@ func UseApiFingerprint(ctx android.BaseModuleContext) (useApiFingerprint bool, f useApiFingerprint = apiFingerprintTrue || dessertShaIsSet if apiFingerprintTrue { - fingerprintSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String()) - fingerprintDeps = ApiFingerprintPath(ctx) + fingerprintSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", android.ApiFingerprintPath(ctx).String()) + fingerprintDeps = android.ApiFingerprintPath(ctx) } if dessertShaIsSet { fingerprintSdkVersion = ctx.Config().Getenv("UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA") @@ -337,7 +336,7 @@ func nonUpdatableFrameworkAidlPath(ctx android.PathContext) android.OutputPath { // Create api_fingerprint.txt func createAPIFingerprint(ctx android.SingletonContext) { - out := ApiFingerprintPath(ctx) + out := android.ApiFingerprintPath(ctx) rule := android.NewRuleBuilder(pctx, ctx) @@ -378,17 +377,11 @@ func createAPIFingerprint(ctx android.SingletonContext) { rule.Build("api_fingerprint", "generate api_fingerprint.txt") } -func ApiFingerprintPath(ctx android.PathContext) android.OutputPath { - return ctx.Config().Once(apiFingerprintPathKey, func() interface{} { - return android.PathForOutput(ctx, "api_fingerprint.txt") - }).(android.OutputPath) -} - func sdkMakeVars(ctx android.MakeVarsContext) { if ctx.Config().AlwaysUsePrebuiltSdks() { return } ctx.Strict("FRAMEWORK_AIDL", sdkFrameworkAidlPath(ctx).String()) - ctx.Strict("API_FINGERPRINT", ApiFingerprintPath(ctx).String()) + ctx.Strict("API_FINGERPRINT", android.ApiFingerprintPath(ctx).String()) } diff --git a/java/sdk_library.go b/java/sdk_library.go index 5ddc6751c..355654fb2 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -949,6 +949,10 @@ type commonToSdkLibraryAndImport struct { // Functionality related to this being used as a component of a java_sdk_library. EmbeddableSdkLibraryComponent + + // Path to the header jars of the implementation library + // This is non-empty only when api_only is false. + implLibraryHeaderJars android.Paths } func (c *commonToSdkLibraryAndImport) initCommon(module commonSdkLibraryAndImportModule) { @@ -1356,13 +1360,6 @@ type SdkLibraryDependency interface { // class changes but it does not contain and implementation or JavaDoc. SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths - // Get the implementation jars appropriate for the supplied sdk version. - // - // These are either the implementation jar for the whole sdk library or the implementation - // jars for the stubs. The latter should only be needed when generating JavaDoc as otherwise - // they are identical to the corresponding header jars. - SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths - // SdkApiStubDexJar returns the dex jar for the stubs for the prebuilt // java_sdk_library_import module. It is needed by the hiddenapi processing tool which // processes dex files. @@ -1599,6 +1596,12 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) exportedComponents[ctx.OtherModuleName(to)] = struct{}{} } + + if tag == implLibraryTag { + if dep, ok := android.OtherModuleProvider(ctx, to, JavaInfoProvider); ok { + module.implLibraryHeaderJars = append(module.implLibraryHeaderJars, dep.HeaderJars...) + } + } }) // Make the set of components exported by this module available for use elsewhere. @@ -2238,7 +2241,7 @@ func withinSameApexesAs(ctx android.BaseModuleContext, other android.Module) boo return len(otherApexInfo.InApexVariants) > 0 && reflect.DeepEqual(apexInfo.InApexVariants, otherApexInfo.InApexVariants) } -func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec, headerJars bool) android.Paths { +func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { // If the client doesn't set sdk_version, but if this library prefers stubs over // the impl library, let's provide the widest API surface possible. To do so, // force override sdk_version to module_current so that the closest possible API @@ -2255,11 +2258,7 @@ func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion andr // * No sdk_version specified on the referencing module. // * The referencing module is in the same apex as this. if sdkVersion.Kind == android.SdkPrivate || withinSameApexesAs(ctx, module) { - if headerJars { - return module.HeaderJars() - } else { - return module.ImplementationJars() - } + return module.implLibraryHeaderJars } } @@ -2268,12 +2267,7 @@ func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion andr // to satisfy SdkLibraryDependency interface func (module *SdkLibrary) SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { - return module.sdkJars(ctx, sdkVersion, true /*headerJars*/) -} - -// to satisfy SdkLibraryDependency interface -func (module *SdkLibrary) SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { - return module.sdkJars(ctx, sdkVersion, false /*headerJars*/) + return module.sdkJars(ctx, sdkVersion) } var javaSdkLibrariesKey = android.NewOnceKey("javaSdkLibraries") @@ -2983,12 +2977,6 @@ func (module *SdkLibraryImport) SdkHeaderJars(ctx android.BaseModuleContext, sdk return module.sdkJars(ctx, sdkVersion, true) } -// to satisfy SdkLibraryDependency interface -func (module *SdkLibraryImport) SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion android.SdkSpec) android.Paths { - // This module is just a wrapper for the stubs. - return module.sdkJars(ctx, sdkVersion, false) -} - // to satisfy UsesLibraryDependency interface func (module *SdkLibraryImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { // The dex implementation jar extracted from the .apex file should be used in preference to the diff --git a/java/sdk_library_test.go b/java/sdk_library_test.go index fb584c5c7..a19d3829f 100644 --- a/java/sdk_library_test.go +++ b/java/sdk_library_test.go @@ -1239,7 +1239,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType string fromPartition string toPartition string - enforceVendorInterface bool enforceProductInterface bool enforceJavaSdkLibraryCheck bool allowList []string @@ -1274,9 +1273,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { android.FixtureWithRootAndroidBp(bpFile), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface) - if info.enforceVendorInterface { - variables.DeviceVndkVersion = proptools.StringPtr("current") - } variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck) variables.InterPartitionJavaLibraryAllowList = info.allowList }), @@ -1304,7 +1300,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: false, }, "") @@ -1313,7 +1308,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: false, enforceJavaSdkLibraryCheck: true, }, "") @@ -1322,7 +1316,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, errorMessage) @@ -1331,7 +1324,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "vendor", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, errorMessage) @@ -1340,7 +1332,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "vendor", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, allowList: []string{"bar"}, @@ -1350,7 +1341,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "vendor", toPartition: "product", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, errorMessage) @@ -1359,7 +1349,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_sdk_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, "") @@ -1368,7 +1357,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_sdk_library", fromPartition: "vendor", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, "") @@ -1377,7 +1365,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_sdk_library", fromPartition: "vendor", toPartition: "product", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, "") |