diff options
Diffstat (limited to 'java')
| -rw-r--r-- | java/app_builder.go | 2 | ||||
| -rw-r--r-- | java/builder.go | 9 | ||||
| -rw-r--r-- | java/config/config.go | 16 | ||||
| -rw-r--r-- | java/dex.go | 4 | ||||
| -rw-r--r-- | java/dexpreopt_bootjars_test.go | 7 | ||||
| -rw-r--r-- | java/droiddoc.go | 13 | ||||
| -rw-r--r-- | java/java_test.go | 66 | ||||
| -rw-r--r-- | java/lint.go | 92 | ||||
| -rw-r--r-- | java/platform_compat_config.go | 44 | ||||
| -rw-r--r-- | java/sdk_test.go | 95 | ||||
| -rw-r--r-- | java/testing.go | 44 |
11 files changed, 185 insertions, 207 deletions
diff --git a/java/app_builder.go b/java/app_builder.go index b53c15ab4..4a18dcada 100644 --- a/java/app_builder.go +++ b/java/app_builder.go @@ -30,7 +30,7 @@ import ( ) var ( - Signapk, SignapkRE = remoteexec.StaticRules(pctx, "signapk", + Signapk, SignapkRE = pctx.RemoteStaticRules("signapk", blueprint.RuleParams{ Command: `rm -f $out && $reTemplate${config.JavaCmd} ${config.JavaVmFlags} -Djava.library.path=$$(dirname ${config.SignapkJniLibrary}) ` + `-jar ${config.SignapkCmd} $flags $certificates $in $out`, diff --git a/java/builder.go b/java/builder.go index 33206ceeb..fc740a831 100644 --- a/java/builder.go +++ b/java/builder.go @@ -40,7 +40,7 @@ var ( // (if the rule produces .class files) or a .srcjar file (if the rule produces .java files). // .srcjar files are unzipped into a temporary directory when compiled with javac. // TODO(b/143658984): goma can't handle the --system argument to javac. - javac, javacRE = remoteexec.MultiCommandStaticRules(pctx, "javac", + javac, javacRE = pctx.MultiCommandRemoteStaticRules("javac", blueprint.RuleParams{ Command: `rm -rf "$outDir" "$annoDir" "$srcJarDir" "$out" && mkdir -p "$outDir" "$annoDir" "$srcJarDir" && ` + `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` + @@ -129,7 +129,7 @@ var ( }, "abis", "allow-prereleased", "screen-densities", "sdk-version", "stem", "apkcerts", "partition") - turbine, turbineRE = remoteexec.StaticRules(pctx, "turbine", + turbine, turbineRE = pctx.RemoteStaticRules("turbine", blueprint.RuleParams{ Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + `$reTemplate${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.TurbineJar} --output $out.tmp ` + @@ -157,7 +157,7 @@ var ( Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"}, }, []string{"javacFlags", "bootClasspath", "classpath", "srcJars", "outDir", "javaVersion"}, []string{"implicits"}) - jar, jarRE = remoteexec.StaticRules(pctx, "jar", + jar, jarRE = pctx.RemoteStaticRules("jar", blueprint.RuleParams{ Command: `$reTemplate${config.SoongZipCmd} -jar -o $out @$out.rsp`, CommandDeps: []string{"${config.SoongZipCmd}"}, @@ -172,7 +172,7 @@ var ( Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"}, }, []string{"jarArgs"}, nil) - zip, zipRE = remoteexec.StaticRules(pctx, "zip", + zip, zipRE = pctx.RemoteStaticRules("zip", blueprint.RuleParams{ Command: `${config.SoongZipCmd} -o $out @$out.rsp`, CommandDeps: []string{"${config.SoongZipCmd}"}, @@ -244,7 +244,6 @@ var ( func init() { pctx.Import("android/soong/android") pctx.Import("android/soong/java/config") - pctx.Import("android/soong/remoteexec") } type javaBuilderFlags struct { diff --git a/java/config/config.go b/java/config/config.go index 31e2b0ffe..30c6f91aa 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -149,14 +149,14 @@ func init() { pctx.HostBinToolVariable("SoongJavacWrapper", "soong_javac_wrapper") pctx.HostBinToolVariable("DexpreoptGen", "dexpreopt_gen") - pctx.VariableFunc("REJavaPool", remoteexec.EnvOverrideFunc("RBE_JAVA_POOL", "java16")) - pctx.VariableFunc("REJavacExecStrategy", remoteexec.EnvOverrideFunc("RBE_JAVAC_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)) - pctx.VariableFunc("RED8ExecStrategy", remoteexec.EnvOverrideFunc("RBE_D8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)) - pctx.VariableFunc("RER8ExecStrategy", remoteexec.EnvOverrideFunc("RBE_R8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)) - pctx.VariableFunc("RETurbineExecStrategy", remoteexec.EnvOverrideFunc("RBE_TURBINE_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) - pctx.VariableFunc("RESignApkExecStrategy", remoteexec.EnvOverrideFunc("RBE_SIGNAPK_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) - pctx.VariableFunc("REJarExecStrategy", remoteexec.EnvOverrideFunc("RBE_JAR_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) - pctx.VariableFunc("REZipExecStrategy", remoteexec.EnvOverrideFunc("RBE_ZIP_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) + pctx.StaticVariableWithEnvOverride("REJavaPool", "RBE_JAVA_POOL", "java16") + pctx.StaticVariableWithEnvOverride("REJavacExecStrategy", "RBE_JAVAC_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy) + pctx.StaticVariableWithEnvOverride("RED8ExecStrategy", "RBE_D8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy) + pctx.StaticVariableWithEnvOverride("RER8ExecStrategy", "RBE_R8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy) + pctx.StaticVariableWithEnvOverride("RETurbineExecStrategy", "RBE_TURBINE_EXEC_STRATEGY", remoteexec.LocalExecStrategy) + pctx.StaticVariableWithEnvOverride("RESignApkExecStrategy", "RBE_SIGNAPK_EXEC_STRATEGY", remoteexec.LocalExecStrategy) + pctx.StaticVariableWithEnvOverride("REJarExecStrategy", "RBE_JAR_EXEC_STRATEGY", remoteexec.LocalExecStrategy) + pctx.StaticVariableWithEnvOverride("REZipExecStrategy", "RBE_ZIP_EXEC_STRATEGY", remoteexec.LocalExecStrategy) pctx.HostJavaToolVariable("JacocoCLIJar", "jacoco-cli.jar") diff --git a/java/dex.go b/java/dex.go index b2a998f78..b042f133f 100644 --- a/java/dex.go +++ b/java/dex.go @@ -83,7 +83,7 @@ func (d *dexer) effectiveOptimizeEnabled() bool { return BoolDefault(d.dexProperties.Optimize.Enabled, d.dexProperties.Optimize.EnabledByDefault) } -var d8, d8RE = remoteexec.MultiCommandStaticRules(pctx, "d8", +var d8, d8RE = pctx.MultiCommandRemoteStaticRules("d8", blueprint.RuleParams{ Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + `$d8Template${config.D8Cmd} ${config.DexFlags} --output $outDir $d8Flags $in && ` + @@ -111,7 +111,7 @@ var d8, d8RE = remoteexec.MultiCommandStaticRules(pctx, "d8", }, }, []string{"outDir", "d8Flags", "zipFlags"}, nil) -var r8, r8RE = remoteexec.MultiCommandStaticRules(pctx, "r8", +var r8, r8RE = pctx.MultiCommandRemoteStaticRules("r8", blueprint.RuleParams{ Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + `rm -f "$outDict" && rm -rf "${outUsageDir}" && ` + diff --git a/java/dexpreopt_bootjars_test.go b/java/dexpreopt_bootjars_test.go index 1b910fab7..aadf6ad8c 100644 --- a/java/dexpreopt_bootjars_test.go +++ b/java/dexpreopt_bootjars_test.go @@ -44,8 +44,11 @@ func testDexpreoptBoot(t *testing.T, ruleFile string, expectedInputs, expectedOu ` result := javaFixtureFactory. - Extend(dexpreopt.FixtureSetBootJars("platform:foo", "platform:bar", "platform:baz")). - RunTestWithBp(t, bp) + Extend( + PrepareForTestWithJavaSdkLibraryFiles, + FixtureWithLastReleaseApis("foo"), + dexpreopt.FixtureSetBootJars("platform:foo", "platform:bar", "platform:baz"), + ).RunTestWithBp(t, bp) dexpreoptBootJars := result.SingletonForTests("dex_bootjars") rule := dexpreoptBootJars.Output(ruleFile) diff --git a/java/droiddoc.go b/java/droiddoc.go index da13c621b..a892b363e 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -1235,7 +1235,7 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi ToolchainInputs: []string{config.JavaCmd(ctx).String()}, Platform: map[string]string{remoteexec.PoolKey: pool}, EnvironmentVariables: []string{"ANDROID_SDK_HOME"}, - }).NoVarTemplate(ctx.Config())) + }).NoVarTemplate(ctx.Config().RBEWrapper())) } cmd.BuiltTool("metalava"). @@ -1678,14 +1678,17 @@ func StubsDefaultsFactory() android.Module { func zipSyncCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcJarDir android.ModuleOutPath, srcJars android.Paths) android.OutputPath { - rule.Command().Text("rm -rf").Text(srcJarDir.String()) - rule.Command().Text("mkdir -p").Text(srcJarDir.String()) + cmd := rule.Command() + cmd.Text("rm -rf").Text(cmd.PathForOutput(srcJarDir)) + cmd = rule.Command() + cmd.Text("mkdir -p").Text(cmd.PathForOutput(srcJarDir)) srcJarList := srcJarDir.Join(ctx, "list") rule.Temporary(srcJarList) - rule.Command().BuiltTool("zipsync"). - FlagWithArg("-d ", srcJarDir.String()). + cmd = rule.Command() + cmd.BuiltTool("zipsync"). + FlagWithArg("-d ", cmd.PathForOutput(srcJarDir)). FlagWithOutput("-l ", srcJarList). FlagWithArg("-f ", `"*.java"`). Inputs(srcJars) diff --git a/java/java_test.go b/java/java_test.go index 990e0102e..99a96e121 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -25,12 +25,12 @@ import ( "strings" "testing" - "android/soong/genrule" "github.com/google/blueprint/proptools" "android/soong/android" "android/soong/cc" "android/soong/dexpreopt" + "android/soong/genrule" "android/soong/python" ) @@ -57,16 +57,13 @@ var javaFixtureFactory = emptyFixtureFactory.Extend( cc.PrepareForTestWithCcBuildComponents, // Include all the default java modules. PrepareForTestWithJavaDefaultModules, + python.PrepareForTestWithPythonBuildComponents, android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { ctx.RegisterModuleType("java_plugin", PluginFactory) - ctx.RegisterModuleType("python_binary_host", python.PythonBinaryHostFactory) - ctx.PreDepsMutators(python.RegisterPythonPreDepsMutators) ctx.RegisterPreSingletonType("overlay", OverlaySingletonFactory) ctx.RegisterPreSingletonType("sdk_versions", sdkPreSingletonFactory) }), - javaMockFS().AddToFixture(), - PrepareForTestWithJavaSdkLibraryFiles, dexpreopt.PrepareForTestWithDexpreopt, ) @@ -101,11 +98,9 @@ func testContext(config android.Config) *android.TestContext { RegisterRequiredBuildComponentsForTest(ctx) ctx.RegisterModuleType("java_plugin", PluginFactory) ctx.RegisterModuleType("filegroup", android.FileGroupFactory) - ctx.RegisterModuleType("python_binary_host", python.PythonBinaryHostFactory) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) ctx.PreArchMutators(android.RegisterComponentsMutator) - ctx.PreDepsMutators(python.RegisterPythonPreDepsMutators) ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators) ctx.RegisterPreSingletonType("overlay", OverlaySingletonFactory) ctx.RegisterPreSingletonType("sdk_versions", sdkPreSingletonFactory) @@ -248,7 +243,14 @@ func moduleToPath(name string) string { // defaultModuleToPath constructs a path to the turbine generate jar for a default test module that // is defined in PrepareForIntegrationTestWithJava func defaultModuleToPath(name string) string { - return filepath.Join(buildDir, ".intermediates", defaultJavaDir, name, "android_common", "turbine-combined", name+".jar") + switch { + case name == `""`: + return name + case strings.HasSuffix(name, ".jar"): + return name + default: + return filepath.Join(buildDir, ".intermediates", defaultJavaDir, name, "android_common", "turbine-combined", name+".jar") + } } func TestJavaLinkType(t *testing.T) { @@ -1299,9 +1301,9 @@ func TestJavaLint(t *testing.T) { }) foo := ctx.ModuleForTests("foo", "android_common") - rule := foo.Rule("lint") - if !strings.Contains(rule.RuleParams.Command, "--baseline lint-baseline.xml") { + sboxProto := android.RuleBuilderSboxProtoForTests(t, foo.Output("lint.sbox.textproto")) + if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml") { t.Error("did not pass --baseline flag") } } @@ -1321,9 +1323,9 @@ func TestJavaLintWithoutBaseline(t *testing.T) { `, map[string][]byte{}) foo := ctx.ModuleForTests("foo", "android_common") - rule := foo.Rule("lint") - if strings.Contains(rule.RuleParams.Command, "--baseline") { + sboxProto := android.RuleBuilderSboxProtoForTests(t, foo.Output("lint.sbox.textproto")) + if strings.Contains(*sboxProto.Commands[0].Command, "--baseline") { t.Error("passed --baseline flag for non existent file") } } @@ -1379,9 +1381,9 @@ func TestJavaLintUsesCorrectBpConfig(t *testing.T) { }) foo := ctx.ModuleForTests("foo", "android_common") - rule := foo.Rule("lint") - if !strings.Contains(rule.RuleParams.Command, "--baseline mybaseline.xml") { + sboxProto := android.RuleBuilderSboxProtoForTests(t, foo.Output("lint.sbox.textproto")) + if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline mybaseline.xml") { t.Error("did not use the correct file for baseline") } } @@ -1423,7 +1425,9 @@ func TestGeneratedSources(t *testing.T) { } func TestTurbine(t *testing.T) { - ctx, _ := testJava(t, ` + result := javaFixtureFactory. + Extend(FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})). + RunTestWithBp(t, ` java_library { name: "foo", srcs: ["a.java"], @@ -1445,30 +1449,20 @@ func TestTurbine(t *testing.T) { } `) - fooTurbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine") - barTurbine := ctx.ModuleForTests("bar", "android_common").Rule("turbine") - barJavac := ctx.ModuleForTests("bar", "android_common").Rule("javac") - barTurbineCombined := ctx.ModuleForTests("bar", "android_common").Description("for turbine") - bazJavac := ctx.ModuleForTests("baz", "android_common").Rule("javac") + fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine") + barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine") + barJavac := result.ModuleForTests("bar", "android_common").Rule("javac") + barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine") + bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac") - if len(fooTurbine.Inputs) != 1 || fooTurbine.Inputs[0].String() != "a.java" { - t.Errorf(`foo inputs %v != ["a.java"]`, fooTurbine.Inputs) - } + android.AssertArrayString(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs.Strings()) fooHeaderJar := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar") - if !strings.Contains(barTurbine.Args["classpath"], fooHeaderJar) { - t.Errorf("bar turbine classpath %v does not contain %q", barTurbine.Args["classpath"], fooHeaderJar) - } - if !strings.Contains(barJavac.Args["classpath"], fooHeaderJar) { - t.Errorf("bar javac classpath %v does not contain %q", barJavac.Args["classpath"], fooHeaderJar) - } - if len(barTurbineCombined.Inputs) != 2 || barTurbineCombined.Inputs[1].String() != fooHeaderJar { - t.Errorf("bar turbine combineJar inputs %v does not contain %q", barTurbineCombined.Inputs, fooHeaderJar) - } - if !strings.Contains(bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar") { - t.Errorf("baz javac classpath %v does not contain %q", bazJavac.Args["classpath"], - "prebuilts/sdk/14/public/android.jar") - } + barTurbineJar := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "turbine", "bar.jar") + android.AssertStringDoesContain(t, "bar turbine classpath", barTurbine.Args["classpath"], fooHeaderJar) + android.AssertStringDoesContain(t, "bar javac classpath", barJavac.Args["classpath"], fooHeaderJar) + android.AssertArrayString(t, "bar turbine combineJar", []string{barTurbineJar, fooHeaderJar}, barTurbineCombined.Inputs.Strings()) + android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar") } func TestSharding(t *testing.T) { diff --git a/java/lint.go b/java/lint.go index fccd1a552..938e2b0d7 100644 --- a/java/lint.go +++ b/java/lint.go @@ -218,7 +218,7 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru // The list of resources may be too long to put on the command line, but // we can't use the rsp file because it is already being used for srcs. // Insert a second rule to write out the list of resources to a file. - resourcesList = android.PathForModuleOut(ctx, "lint", "resources.list") + resourcesList = android.PathForModuleOut(ctx, "resources.list") resListRule := android.NewRuleBuilder(pctx, ctx) resListRule.Command().Text("cp"). FlagWithRspFileInputList("", resourcesList.ReplaceExtension(ctx, "rsp"), l.resources). @@ -233,7 +233,7 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru cacheDir := android.PathForModuleOut(ctx, "lint", "cache") homeDir := android.PathForModuleOut(ctx, "lint", "home") - srcJarDir := android.PathForModuleOut(ctx, "lint-srcjars") + srcJarDir := android.PathForModuleOut(ctx, "lint", "srcjars") srcJarList := zipSyncCmd(ctx, rule, srcJarDir, l.srcJars) // TODO(ccross): this is a little fishy. The files extracted from the srcjars are referenced // by the project.xml and used by the later lint rule, but the lint rule depends on the srcjars, @@ -248,6 +248,7 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru FlagWithRspFileInputList("", srcsListRsp, l.srcs). Output(srcsList) trackRSPDependency(l.srcs, srcsList) + rule.Temporary(srcsList) cmd := rule.Command(). BuiltTool("lint-project-xml"). @@ -262,11 +263,11 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru cmd.Flag("--test") } if l.manifest != nil { - cmd.FlagWithArg("--manifest ", l.manifest.String()) + cmd.FlagWithArg("--manifest ", cmd.PathForInput(l.manifest)) trackInputDependency(l.manifest) } if l.mergedManifest != nil { - cmd.FlagWithArg("--merged_manifest ", l.mergedManifest.String()) + cmd.FlagWithArg("--merged_manifest ", cmd.PathForInput(l.mergedManifest)) trackInputDependency(l.mergedManifest) } @@ -279,23 +280,17 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru } if l.classes != nil { - cmd.FlagWithArg("--classes ", l.classes.String()) + cmd.FlagWithArg("--classes ", cmd.PathForInput(l.classes)) trackInputDependency(l.classes) } - cmd.FlagForEachArg("--classpath ", l.classpath.Strings()) + cmd.FlagForEachArg("--classpath ", cmd.PathsForInputs(l.classpath)) trackInputDependency(l.classpath...) - cmd.FlagForEachArg("--extra_checks_jar ", l.extraLintCheckJars.Strings()) + cmd.FlagForEachArg("--extra_checks_jar ", cmd.PathsForInputs(l.extraLintCheckJars)) trackInputDependency(l.extraLintCheckJars...) - if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_LINT") && - lintRBEExecStrategy(ctx) != remoteexec.LocalExecStrategy { - // TODO(b/181912787): remove these and use "." instead. - cmd.FlagWithArg("--root_dir ", "/b/f/w") - } else { - cmd.FlagWithArg("--root_dir ", "$PWD") - } + cmd.FlagWithArg("--root_dir ", "$PWD") // The cache tag in project.xml is relative to the root dir, or the project.xml file if // the root dir is not set. @@ -325,7 +320,7 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru // generateManifest adds a command to the rule to write a simple manifest that contains the // minSdkVersion and targetSdkVersion for modules (like java_library) that don't have a manifest. -func (l *linter) generateManifest(ctx android.ModuleContext, rule *android.RuleBuilder) android.Path { +func (l *linter) generateManifest(ctx android.ModuleContext, rule *android.RuleBuilder) android.WritablePath { manifestPath := android.PathForModuleOut(ctx, "lint", "AndroidManifest.xml") rule.Command().Text("("). @@ -356,18 +351,36 @@ func (l *linter) lint(ctx android.ModuleContext) { } } - rule := android.NewRuleBuilder(pctx, ctx) + rule := android.NewRuleBuilder(pctx, ctx). + Sbox(android.PathForModuleOut(ctx, "lint"), + android.PathForModuleOut(ctx, "lint.sbox.textproto")). + SandboxInputs() + + if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_LINT") { + pool := ctx.Config().GetenvWithDefault("RBE_LINT_POOL", "java16") + rule.Remoteable(android.RemoteRuleSupports{RBE: true}) + rule.Rewrapper(&remoteexec.REParams{ + Labels: map[string]string{"type": "tool", "name": "lint"}, + ExecStrategy: lintRBEExecStrategy(ctx), + ToolchainInputs: []string{config.JavaCmd(ctx).String()}, + EnvironmentVariables: []string{ + "LANG", + }, + Platform: map[string]string{remoteexec.PoolKey: pool}, + }) + } if l.manifest == nil { manifest := l.generateManifest(ctx, rule) l.manifest = manifest + rule.Temporary(manifest) } lintPaths := l.writeLintProjectXML(ctx, rule) - html := android.PathForModuleOut(ctx, "lint-report.html") - text := android.PathForModuleOut(ctx, "lint-report.txt") - xml := android.PathForModuleOut(ctx, "lint-report.xml") + html := android.PathForModuleOut(ctx, "lint", "lint-report.html") + text := android.PathForModuleOut(ctx, "lint", "lint-report.txt") + xml := android.PathForModuleOut(ctx, "lint", "lint-report.xml") depSetsBuilder := NewLintDepSetBuilder().Direct(html, text, xml) @@ -397,43 +410,7 @@ func (l *linter) lint(ctx android.ModuleContext) { FlagWithInput("SDK_ANNOTATIONS=", annotationsZipPath). FlagWithInput("LINT_OPTS=-DLINT_API_DATABASE=", apiVersionsXMLPath) - if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_LINT") { - pool := ctx.Config().GetenvWithDefault("RBE_LINT_POOL", "java16") - // TODO(b/181912787): this should be local fallback once the hack that passes /b/f/w in project.xml - // is removed. - execStrategy := lintRBEExecStrategy(ctx) - labels := map[string]string{"type": "tool", "name": "lint"} - rule.Remoteable(android.RemoteRuleSupports{RBE: true}) - remoteInputs := lintPaths.remoteInputs - remoteInputs = append(remoteInputs, - lintPaths.projectXML, - lintPaths.configXML, - lintPaths.homeDir, - lintPaths.cacheDir, - ctx.Config().HostJavaToolPath(ctx, "lint.jar"), - annotationsZipPath, - apiVersionsXMLPath, - ) - - cmd.Text((&remoteexec.REParams{ - Labels: labels, - ExecStrategy: execStrategy, - ToolchainInputs: []string{config.JavaCmd(ctx).String()}, - Inputs: remoteInputs.Strings(), - OutputFiles: android.Paths{html, text, xml}.Strings(), - RSPFile: strings.Join(lintPaths.remoteRSPInputs.Strings(), ","), - EnvironmentVariables: []string{ - "JAVA_OPTS", - "ANDROID_SDK_HOME", - "SDK_ANNOTATIONS", - "LINT_OPTS", - "LANG", - }, - Platform: map[string]string{remoteexec.PoolKey: pool}, - }).NoVarTemplate(ctx.Config())) - } - - cmd.BuiltTool("lint"). + cmd.BuiltTool("lint").ImplicitTool(ctx.Config().HostJavaToolPath(ctx, "lint.jar")). Flag("--quiet"). FlagWithInput("--project ", lintPaths.projectXML). FlagWithInput("--config ", lintPaths.configXML). @@ -450,6 +427,9 @@ func (l *linter) lint(ctx android.ModuleContext) { Implicit(apiVersionsXMLPath). Implicits(lintPaths.deps) + rule.Temporary(lintPaths.projectXML) + rule.Temporary(lintPaths.configXML) + if checkOnly := ctx.Config().Getenv("ANDROID_LINT_CHECK"); checkOnly != "" { cmd.FlagWithArg("--check ", checkOnly) } diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go index 4c3143a48..3c43a8e55 100644 --- a/java/platform_compat_config.go +++ b/java/platform_compat_config.go @@ -26,6 +26,7 @@ func init() { func registerPlatformCompatConfigBuildComponents(ctx android.RegistrationContext) { ctx.RegisterSingletonType("platform_compat_config_singleton", platformCompatConfigSingletonFactory) ctx.RegisterModuleType("platform_compat_config", PlatformCompatConfigFactory) + ctx.RegisterModuleType("prebuilt_platform_compat_config", prebuiltCompatConfigFactory) ctx.RegisterModuleType("global_compat_config", globalCompatConfigFactory) } @@ -116,6 +117,49 @@ func PlatformCompatConfigFactory() android.Module { return module } +// A prebuilt version of the platform compat config module. +type prebuiltCompatConfigModule struct { + android.ModuleBase + android.SdkBase + prebuilt android.Prebuilt + + properties prebuiltCompatConfigProperties + + metadataFile android.Path +} + +type prebuiltCompatConfigProperties struct { + Metadata *string `android:"path"` +} + +func (module *prebuiltCompatConfigModule) Prebuilt() *android.Prebuilt { + return &module.prebuilt +} + +func (module *prebuiltCompatConfigModule) Name() string { + return module.prebuilt.Name(module.ModuleBase.Name()) +} + +func (module *prebuiltCompatConfigModule) compatConfigMetadata() android.Path { + return module.metadataFile +} + +var _ platformCompatConfigMetadataProvider = (*prebuiltCompatConfigModule)(nil) + +func (module *prebuiltCompatConfigModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { + module.metadataFile = module.prebuilt.SingleSourcePath(ctx) +} + +// A prebuilt version of platform_compat_config that provides the metadata. +func prebuiltCompatConfigFactory() android.Module { + m := &prebuiltCompatConfigModule{} + m.AddProperties(&m.properties) + android.InitSingleSourcePrebuiltModule(m, &m.properties, "Metadata") + android.InitSdkAwareModule(m) + android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon) + return m +} + // compat singleton rules type platformCompatConfigSingleton struct { metadata android.Path diff --git a/java/sdk_test.go b/java/sdk_test.go index dc90ea304..37875a43b 100644 --- a/java/sdk_test.go +++ b/java/sdk_test.go @@ -27,6 +27,7 @@ import ( ) func TestClasspath(t *testing.T) { + const frameworkAidl = "-I" + defaultJavaDir + "/framework/aidl" var classpathTestcases = []struct { name string unbundled bool @@ -52,7 +53,7 @@ func TestClasspath(t *testing.T) { system: config.StableCorePlatformSystemModules, java8classpath: config.FrameworkLibraries, java9classpath: config.FrameworkLibraries, - aidl: "-Iframework/aidl", + aidl: frameworkAidl, }, { name: `sdk_version:"core_platform"`, @@ -69,7 +70,7 @@ func TestClasspath(t *testing.T) { system: config.StableCorePlatformSystemModules, java8classpath: config.FrameworkLibraries, java9classpath: config.FrameworkLibraries, - aidl: "-Iframework/aidl", + aidl: frameworkAidl, }, { @@ -263,7 +264,7 @@ func TestClasspath(t *testing.T) { convertModulesToPaths := func(cp []string) []string { ret := make([]string, len(cp)) for i, e := range cp { - ret[i] = moduleToPath(e) + ret[i] = defaultModuleToPath(e) } return ret } @@ -299,6 +300,8 @@ func TestClasspath(t *testing.T) { dir := "" if strings.HasPrefix(testcase.system, "sdk_public_") { dir = "prebuilts/sdk" + } else { + dir = defaultJavaDir } system = "--system=" + filepath.Join(buildDir, ".intermediates", dir, testcase.system, "android_common", "system") // The module-relative parts of these paths are hardcoded in system_modules.go: @@ -309,8 +312,8 @@ func TestClasspath(t *testing.T) { } } - checkClasspath := func(t *testing.T, ctx *android.TestContext, isJava8 bool) { - foo := ctx.ModuleForTests("foo", variant) + checkClasspath := func(t *testing.T, result *android.TestResult, isJava8 bool) { + foo := result.ModuleForTests("foo", variant) javac := foo.Rule("javac") var deps []string @@ -349,78 +352,68 @@ func TestClasspath(t *testing.T) { } } + fixtureFactory := javaFixtureFactory.Extend( + FixtureWithPrebuiltApis(map[string][]string{ + "29": {}, + "30": {}, + "current": {}, + }), + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + if testcase.unbundled { + variables.Unbundled_build = proptools.BoolPtr(true) + variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) + } + }), + android.FixtureModifyEnv(func(env map[string]string) { + if env["ANDROID_JAVA8_HOME"] == "" { + env["ANDROID_JAVA8_HOME"] = "jdk8" + } + }), + ) + // Test with legacy javac -source 1.8 -target 1.8 t.Run("Java language level 8", func(t *testing.T) { - config := testConfig(nil, bpJava8, nil) - if testcase.unbundled { - config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) - config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) - } - ctx := testContext(config) - run(t, ctx, config) + result := fixtureFactory.RunTestWithBp(t, bpJava8) - checkClasspath(t, ctx, true /* isJava8 */) + checkClasspath(t, result, true /* isJava8 */) if testcase.host != android.Host { - aidl := ctx.ModuleForTests("foo", variant).Rule("aidl") + aidl := result.ModuleForTests("foo", variant).Rule("aidl") - if g, w := aidl.RuleParams.Command, testcase.aidl+" -I."; !strings.Contains(g, w) { - t.Errorf("want aidl command to contain %q, got %q", w, g) - } + android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.") } }) // Test with default javac -source 9 -target 9 t.Run("Java language level 9", func(t *testing.T) { - config := testConfig(nil, bp, nil) - if testcase.unbundled { - config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) - config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) - } - ctx := testContext(config) - run(t, ctx, config) + result := fixtureFactory.RunTestWithBp(t, bp) - checkClasspath(t, ctx, false /* isJava8 */) + checkClasspath(t, result, false /* isJava8 */) if testcase.host != android.Host { - aidl := ctx.ModuleForTests("foo", variant).Rule("aidl") + aidl := result.ModuleForTests("foo", variant).Rule("aidl") - if g, w := aidl.RuleParams.Command, testcase.aidl+" -I."; !strings.Contains(g, w) { - t.Errorf("want aidl command to contain %q, got %q", w, g) - } + android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.") } }) + prepareWithPlatformVersionRel := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.Platform_sdk_codename = proptools.StringPtr("REL") + variables.Platform_sdk_final = proptools.BoolPtr(true) + }) + // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 8 -target 8 t.Run("REL + Java language level 8", func(t *testing.T) { - config := testConfig(nil, bpJava8, nil) - config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL") - config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true) + result := fixtureFactory.Extend(prepareWithPlatformVersionRel).RunTestWithBp(t, bpJava8) - if testcase.unbundled { - config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) - config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) - } - ctx := testContext(config) - run(t, ctx, config) - - checkClasspath(t, ctx, true /* isJava8 */) + checkClasspath(t, result, true /* isJava8 */) }) // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 9 -target 9 t.Run("REL + Java language level 9", func(t *testing.T) { - config := testConfig(nil, bp, nil) - config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL") - config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true) - - if testcase.unbundled { - config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) - config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) - } - ctx := testContext(config) - run(t, ctx, config) + result := fixtureFactory.Extend(prepareWithPlatformVersionRel).RunTestWithBp(t, bp) - checkClasspath(t, ctx, false /* isJava8 */) + checkClasspath(t, result, false /* isJava8 */) }) }) } diff --git a/java/testing.go b/java/testing.go index 896bcf8df..6fc3b0396 100644 --- a/java/testing.go +++ b/java/testing.go @@ -24,8 +24,6 @@ import ( "android/soong/android" "android/soong/cc" "android/soong/dexpreopt" - "android/soong/python" - "github.com/google/blueprint" ) @@ -62,9 +60,7 @@ var PrepareForIntegrationTestWithJava = android.GroupFixturePreparers( ) // Prepare a fixture with the standard files required by a java_sdk_library module. -var PrepareForTestWithJavaSdkLibraryFiles = android.FixtureMergeMockFs(javaSdkLibraryFiles) - -var javaSdkLibraryFiles = android.MockFS{ +var PrepareForTestWithJavaSdkLibraryFiles = android.FixtureMergeMockFs(android.MockFS{ "api/current.txt": nil, "api/removed.txt": nil, "api/system-current.txt": nil, @@ -75,7 +71,7 @@ var javaSdkLibraryFiles = android.MockFS{ "api/module-lib-removed.txt": nil, "api/system-server-current.txt": nil, "api/system-server-removed.txt": nil, -} +}) // FixtureWithLastReleaseApis creates a preparer that creates prebuilt versions of the specified // modules for the `last` API release. By `last` it just means last in the list of supplied versions @@ -127,49 +123,15 @@ func FixtureWithPrebuiltApis(release2Modules map[string][]string) android.Fixtur mockFS.Merge(prebuiltApisFilesForLibs([]string{release}, libs)) } return android.GroupFixturePreparers( - // A temporary measure to discard the definitions provided by default by javaMockFS() to allow - // the changes that use this preparer to fix tests to be separated from the change to remove - // javaMockFS(). - android.FixtureModifyMockFS(func(fs android.MockFS) { - for k, _ := range fs { - if strings.HasPrefix(k, "prebuilts/sdk/") { - delete(fs, k) - } - } - }), android.FixtureAddTextFile(path, bp), android.FixtureMergeMockFs(mockFS), ) } -func javaMockFS() android.MockFS { - mockFS := android.MockFS{ - "prebuilts/sdk/tools/core-lambda-stubs.jar": nil, - "prebuilts/sdk/Android.bp": []byte(`prebuilt_apis { name: "sdk", api_dirs: ["14", "28", "30", "current"], imports_sdk_version: "none", imports_compile_dex:true,}`), - - "bin.py": nil, - python.StubTemplateHost: []byte(`PYTHON_BINARY = '%interpreter%' - MAIN_FILE = '%main%'`), - } - - levels := []string{"14", "28", "29", "30", "current"} - libs := []string{ - "android", "foo", "bar", "sdklib", "barney", "betty", "foo-shared_library", - "foo-no_shared_library", "core-for-system-modules", "quuz", "qux", "fred", - "runtime-library", - } - for k, v := range prebuiltApisFilesForLibs(levels, libs) { - mockFS[k] = v - } - - return mockFS -} - func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) android.Config { bp += GatherRequiredDepsForTest() - mockFS := javaMockFS() - mockFS.Merge(javaSdkLibraryFiles) + mockFS := android.MockFS{} cc.GatherRequiredFilesForTest(mockFS) |