diff options
Diffstat (limited to 'java')
| -rw-r--r-- | java/app_import.go | 16 | ||||
| -rw-r--r-- | java/app_import_test.go | 18 | ||||
| -rw-r--r-- | java/droiddoc.go | 30 | ||||
| -rw-r--r-- | java/legacy_core_platform_api_usage.go | 35 | ||||
| -rw-r--r-- | java/lint.go | 158 |
5 files changed, 195 insertions, 62 deletions
diff --git a/java/app_import.go b/java/app_import.go index d69dd10f9..d38f63e06 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -67,6 +67,9 @@ type AndroidAppImportProperties struct { // module name in the form ":module". Should be empty if presigned or default_dev_cert is set. Certificate *string + // Names of extra android_app_certificate modules to sign the apk with in the form ":module". + Additional_certificates []string + // Set this flag to true if the prebuilt apk is already signed. The certificate property must not // be set for presigned modules. Presigned *bool @@ -156,6 +159,16 @@ func (a *AndroidAppImport) DepsMutator(ctx android.BottomUpMutatorContext) { ctx.AddDependency(ctx.Module(), certificateTag, cert) } + for _, cert := range a.properties.Additional_certificates { + cert = android.SrcIsModule(cert) + if cert != "" { + ctx.AddDependency(ctx.Module(), certificateTag, cert) + } else { + ctx.PropertyErrorf("additional_certificates", + `must be names of android_app_certificate modules in the form ":module"`) + } + } + a.usesLibrary.deps(ctx, !a.isPrebuiltFrameworkRes()) } @@ -303,9 +316,6 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext // If the certificate property is empty at this point, default_dev_cert must be set to true. // Which makes processMainCert's behavior for the empty cert string WAI. certificates = processMainCert(a.ModuleBase, String(a.properties.Certificate), certificates, ctx) - if len(certificates) != 1 { - ctx.ModuleErrorf("Unexpected number of certificates were extracted: %q", certificates) - } a.certificate = certificates[0] signed := android.PathForModuleOut(ctx, "signed", apkFilename) var lineageFile android.Path diff --git a/java/app_import_test.go b/java/app_import_test.go index dc31d07c9..00406aa2e 100644 --- a/java/app_import_test.go +++ b/java/app_import_test.go @@ -109,16 +109,30 @@ func TestAndroidAppImport_SigningLineage(t *testing.T) { name: "foo", apk: "prebuilts/apk/app.apk", certificate: "platform", + additional_certificates: [":additional_certificate"], lineage: "lineage.bin", } + + android_app_certificate { + name: "additional_certificate", + certificate: "cert/additional_cert", + } `) variant := ctx.ModuleForTests("foo", "android_common") - // Check cert signing lineage flag. signedApk := variant.Output("signed/foo.apk") + // Check certificates + certificatesFlag := signedApk.Args["certificates"] + expected := "build/make/target/product/security/platform.x509.pem " + + "build/make/target/product/security/platform.pk8 " + + "cert/additional_cert.x509.pem cert/additional_cert.pk8" + if expected != certificatesFlag { + t.Errorf("Incorrect certificates flags, expected: %q, got: %q", expected, certificatesFlag) + } + // Check cert signing lineage flag. signingFlag := signedApk.Args["flags"] - expected := "--lineage lineage.bin" + expected = "--lineage lineage.bin" if expected != signingFlag { t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag) } diff --git a/java/droiddoc.go b/java/droiddoc.go index 8f1644c7f..f0decec74 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -1203,8 +1203,14 @@ func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *a } func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersion javaVersion, srcs android.Paths, - srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths, implicitsRsp android.WritablePath, sandbox bool) *android.RuleBuilderCommand { + srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths, + implicitsRsp, homeDir android.WritablePath, sandbox bool) *android.RuleBuilderCommand { + rule.Command().Text("rm -rf").Flag(homeDir.String()) + rule.Command().Text("mkdir -p").Flag(homeDir.String()) + cmd := rule.Command() + cmd.FlagWithArg("ANDROID_SDK_HOME=", homeDir.String()) + if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_METALAVA") { rule.Remoteable(android.RemoteRuleSupports{RBE: true}) pool := ctx.Config().GetenvWithDefault("RBE_METALAVA_POOL", "metalava") @@ -1214,17 +1220,21 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi execStrategy = remoteexec.LocalExecStrategy labels["shallow"] = "true" } - inputs := []string{android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "metalava.jar").String()} + inputs := []string{ + ctx.Config().HostJavaToolPath(ctx, "metalava").String(), + homeDir.String(), + } if v := ctx.Config().Getenv("RBE_METALAVA_INPUTS"); v != "" { inputs = append(inputs, strings.Split(v, ",")...) } cmd.Text((&remoteexec.REParams{ - Labels: labels, - ExecStrategy: execStrategy, - Inputs: inputs, - RSPFile: implicitsRsp.String(), - ToolchainInputs: []string{config.JavaCmd(ctx).String()}, - Platform: map[string]string{remoteexec.PoolKey: pool}, + Labels: labels, + ExecStrategy: execStrategy, + Inputs: inputs, + RSPFile: implicitsRsp.String(), + ToolchainInputs: []string{config.JavaCmd(ctx).String()}, + Platform: map[string]string{remoteexec.PoolKey: pool}, + EnvironmentVariables: []string{"ANDROID_SDK_HOME"}, }).NoVarTemplate(ctx.Config())) } @@ -1302,9 +1312,9 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars) implicitsRsp := android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"implicits.rsp") - + homeDir := android.PathForModuleOut(ctx, "metalava-home") cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList, - deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths, implicitsRsp, + deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths, implicitsRsp, homeDir, Bool(d.Javadoc.properties.Sandbox)) cmd.Implicits(d.Javadoc.implicits) diff --git a/java/legacy_core_platform_api_usage.go b/java/legacy_core_platform_api_usage.go index 021920af6..874338d10 100644 --- a/java/legacy_core_platform_api_usage.go +++ b/java/legacy_core_platform_api_usage.go @@ -19,10 +19,6 @@ import ( "android/soong/java/config" ) -// This variable is effectively unused in pre-master branches, and is -// included (with the same value as it has in AOSP) only to ease -// merges between branches (see the comment in the -// useLegacyCorePlatformApi() function): var legacyCorePlatformApiModules = []string{ "ahat-test-dump", "android.car", @@ -34,29 +30,44 @@ var legacyCorePlatformApiModules = []string{ "art_cts_jvmti_test_library", "art-gtest-jars-MyClassNatives", "BackupFrameworksServicesRoboTests", + "backuplib", "BandwidthEnforcementTest", "BlockedNumberProvider", "BluetoothInstrumentationTests", "BluetoothMidiService", + "CarDeveloperOptions", + "CarService", + "CarServiceTest", "car-apps-common", + "car-service-test-lib", + "car-service-test-static-lib", "CertInstaller", "ConnectivityManagerTest", "ContactsProvider", + "CorePerfTests", "core-tests-support", + "CtsAppExitTestCases", "CtsContentTestCases", "CtsIkeTestCases", + "CtsAppExitTestCases", "CtsLibcoreWycheproofBCTestCases", "CtsMediaTestCases", "CtsNetTestCases", "CtsNetTestCasesLatestSdk", "CtsSecurityTestCases", + "CtsSuspendAppsTestCases", "CtsUsageStatsTestCases", + "DeadpoolService", + "DeadpoolServiceBtServices", + "DeviceInfo", + "DiagnosticTools", "DisplayCutoutEmulationEmu01Overlay", "DocumentsUIPerfTests", "DocumentsUITests", "DownloadProvider", "DownloadProviderTests", "DownloadProviderUi", + "ds-car-docs", // for AAOS API documentation only "DynamicSystemInstallationService", "EmergencyInfo-lib", "ethernet-service", @@ -73,6 +84,7 @@ var legacyCorePlatformApiModules = []string{ "FrameworksServicesRoboTests", "FrameworksServicesTests", "FrameworksUtilTests", + "FrameworksWifiTests", "hid", "hidl_test_java_java", "hwbinder", @@ -95,6 +107,9 @@ var legacyCorePlatformApiModules = []string{ "platform_library-docs", "PrintSpooler", "RollbackTest", + "service-blobstore", + "service-connectivity", + "service-jobscheduler", "services", "services.accessibility", "services.backup", @@ -136,10 +151,6 @@ var legacyCorePlatformApiModules = []string{ "wifi-service", } -// This variable is effectively unused in pre-master branches, and is -// included (with the same value as it has in AOSP) only to ease -// merges between branches (see the comment in the -// useLegacyCorePlatformApi() function): var legacyCorePlatformApiLookup = make(map[string]struct{}) func init() { @@ -149,12 +160,8 @@ func init() { } func useLegacyCorePlatformApi(ctx android.EarlyModuleContext) bool { - // In pre-master branches, we don't attempt to force usage of the stable - // version of the core/platform API. Instead, we always use the legacy - // version --- except in tests, where we always use stable, so that we - // can make the test assertions the same as other branches. - // This should be false in tests and true otherwise: - return ctx.Config().TestProductVariables == nil + _, found := legacyCorePlatformApiLookup[ctx.ModuleName()] + return found } func corePlatformSystemModules(ctx android.EarlyModuleContext) string { diff --git a/java/lint.go b/java/lint.go index 50b84dc71..f9a89d0f7 100644 --- a/java/lint.go +++ b/java/lint.go @@ -22,6 +22,8 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/java/config" + "android/soong/remoteexec" ) type LintProperties struct { @@ -172,8 +174,38 @@ func (l *linter) deps(ctx android.BottomUpMutatorContext) { extraLintCheckTag, extraCheckModules...) } -func (l *linter) writeLintProjectXML(ctx android.ModuleContext, - rule *android.RuleBuilder) (projectXMLPath, configXMLPath, cacheDir, homeDir android.WritablePath, deps android.Paths) { +type lintPaths struct { + projectXML android.WritablePath + configXML android.WritablePath + cacheDir android.WritablePath + homeDir android.WritablePath + srcjarDir android.WritablePath + + deps android.Paths + + remoteInputs android.Paths + remoteRSPInputs android.Paths +} + +func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.RuleBuilder) lintPaths { + var deps android.Paths + var remoteInputs android.Paths + var remoteRSPInputs android.Paths + + // Paths passed to trackInputDependency will be added as dependencies of the rule that runs + // lint and passed as inputs to the remote execution proxy. + trackInputDependency := func(paths ...android.Path) { + deps = append(deps, paths...) + remoteInputs = append(remoteInputs, paths...) + } + + // Paths passed to trackRSPDependency will be added as dependencies of the rule that runs + // lint, but the RSP file will be used by the remote execution proxy to find the files so that + // it doesn't overflow command line limits. + trackRSPDependency := func(paths android.Paths, rsp android.Path) { + deps = append(deps, paths...) + remoteRSPInputs = append(remoteRSPInputs, rsp) + } var resourcesList android.WritablePath if len(l.resources) > 0 { @@ -184,17 +216,27 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, resListRule := android.NewRuleBuilder(pctx, ctx) resListRule.Command().Text("cp").FlagWithRspFileInputList("", l.resources).Output(resourcesList) resListRule.Build("lint_resources_list", "lint resources list") - deps = append(deps, l.resources...) + trackRSPDependency(l.resources, resourcesList) } - projectXMLPath = android.PathForModuleOut(ctx, "lint", "project.xml") + projectXMLPath := android.PathForModuleOut(ctx, "lint", "project.xml") // Lint looks for a lint.xml file next to the project.xml file, give it one. - configXMLPath = android.PathForModuleOut(ctx, "lint", "lint.xml") - cacheDir = android.PathForModuleOut(ctx, "lint", "cache") - homeDir = android.PathForModuleOut(ctx, "lint", "home") + configXMLPath := android.PathForModuleOut(ctx, "lint", "lint.xml") + cacheDir := android.PathForModuleOut(ctx, "lint", "cache") + homeDir := android.PathForModuleOut(ctx, "lint", "home") 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, + // not the extracted files. + trackRSPDependency(l.srcJars, srcJarList) + + // TODO(ccross): some of the files in l.srcs are generated sources and should be passed to + // lint separately. + srcsList := android.PathForModuleOut(ctx, "lint", "srcs.list") + rule.Command().Text("cp").FlagWithRspFileInputList("", l.srcs).Output(srcsList) + trackRSPDependency(l.srcs, srcsList) cmd := rule.Command(). BuiltTool("lint-project-xml"). @@ -209,38 +251,39 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, cmd.Flag("--test") } if l.manifest != nil { - deps = append(deps, l.manifest) cmd.FlagWithArg("--manifest ", l.manifest.String()) + trackInputDependency(l.manifest) } if l.mergedManifest != nil { - deps = append(deps, l.mergedManifest) cmd.FlagWithArg("--merged_manifest ", l.mergedManifest.String()) + trackInputDependency(l.mergedManifest) } - // TODO(ccross): some of the files in l.srcs are generated sources and should be passed to - // lint separately. - cmd.FlagWithRspFileInputList("--srcs ", l.srcs) - deps = append(deps, l.srcs...) + cmd.FlagWithInput("--srcs ", srcsList) cmd.FlagWithInput("--generated_srcs ", srcJarList) - deps = append(deps, l.srcJars...) if resourcesList != nil { cmd.FlagWithInput("--resources ", resourcesList) } if l.classes != nil { - deps = append(deps, l.classes) cmd.FlagWithArg("--classes ", l.classes.String()) + trackInputDependency(l.classes) } cmd.FlagForEachArg("--classpath ", l.classpath.Strings()) - deps = append(deps, l.classpath...) + trackInputDependency(l.classpath...) cmd.FlagForEachArg("--extra_checks_jar ", l.extraLintCheckJars.Strings()) - deps = append(deps, l.extraLintCheckJars...) + trackInputDependency(l.extraLintCheckJars...) - cmd.FlagWithArg("--root_dir ", "$PWD") + if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_LINT") { + // TODO(b/181912787): remove these and use "." instead. + cmd.FlagWithArg("--root_dir ", "/b/f/w") + } else { + 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. @@ -254,7 +297,18 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, cmd.FlagForEachArg("--error_check ", l.properties.Lint.Error_checks) cmd.FlagForEachArg("--fatal_check ", l.properties.Lint.Fatal_checks) - return projectXMLPath, configXMLPath, cacheDir, homeDir, deps + return lintPaths{ + projectXML: projectXMLPath, + configXML: configXMLPath, + cacheDir: cacheDir, + homeDir: homeDir, + + deps: deps, + + remoteInputs: remoteInputs, + remoteRSPInputs: remoteRSPInputs, + } + } // generateManifest adds a command to the rule to write a simple manifest that contains the @@ -297,7 +351,7 @@ func (l *linter) lint(ctx android.ModuleContext) { l.manifest = manifest } - projectXML, lintXML, cacheDir, homeDir, deps := l.writeLintProjectXML(ctx, rule) + lintPaths := l.writeLintProjectXML(ctx, rule) html := android.PathForModuleOut(ctx, "lint-report.html") text := android.PathForModuleOut(ctx, "lint-report.txt") @@ -311,8 +365,8 @@ func (l *linter) lint(ctx android.ModuleContext) { } }) - rule.Command().Text("rm -rf").Flag(cacheDir.String()).Flag(homeDir.String()) - rule.Command().Text("mkdir -p").Flag(cacheDir.String()).Flag(homeDir.String()) + rule.Command().Text("rm -rf").Flag(lintPaths.cacheDir.String()).Flag(lintPaths.homeDir.String()) + rule.Command().Text("mkdir -p").Flag(lintPaths.cacheDir.String()).Flag(lintPaths.homeDir.String()) rule.Command().Text("rm -f").Output(html).Output(text).Output(xml) var annotationsZipPath, apiVersionsXMLPath android.Path @@ -324,16 +378,52 @@ func (l *linter) lint(ctx android.ModuleContext) { apiVersionsXMLPath = copiedAPIVersionsXmlPath(ctx) } - cmd := rule.Command(). - Text("("). - Flag("JAVA_OPTS=-Xmx3072m"). - FlagWithArg("ANDROID_SDK_HOME=", homeDir.String()). + cmd := rule.Command() + + cmd.Flag("JAVA_OPTS=-Xmx3072m"). + FlagWithArg("ANDROID_SDK_HOME=", lintPaths.homeDir.String()). FlagWithInput("SDK_ANNOTATIONS=", annotationsZipPath). - FlagWithInput("LINT_OPTS=-DLINT_API_DATABASE=", apiVersionsXMLPath). - BuiltTool("lint"). + 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 := ctx.Config().GetenvWithDefault("RBE_LINT_EXEC_STRATEGY", remoteexec.RemoteExecStrategy) + 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", + }, + Platform: map[string]string{remoteexec.PoolKey: pool}, + }).NoVarTemplate(ctx.Config())) + } + + cmd.BuiltTool("lint"). Flag("--quiet"). - FlagWithInput("--project ", projectXML). - FlagWithInput("--config ", lintXML). + FlagWithInput("--project ", lintPaths.projectXML). + FlagWithInput("--config ", lintPaths.configXML). FlagWithOutput("--html ", html). FlagWithOutput("--text ", text). FlagWithOutput("--xml ", xml). @@ -343,7 +433,9 @@ func (l *linter) lint(ctx android.ModuleContext) { FlagWithArg("--url ", fmt.Sprintf(".=.,%s=out", android.PathForOutput(ctx).String())). Flag("--exitcode"). Flags(l.properties.Lint.Flags). - Implicits(deps) + Implicit(annotationsZipPath). + Implicit(apiVersionsXMLPath). + Implicits(lintPaths.deps) if checkOnly := ctx.Config().Getenv("ANDROID_LINT_CHECK"); checkOnly != "" { cmd.FlagWithArg("--check ", checkOnly) @@ -362,9 +454,9 @@ func (l *linter) lint(ctx android.ModuleContext) { } } - cmd.Text("|| (").Text("if [ -e").Input(text).Text("]; then cat").Input(text).Text("; fi; exit 7)").Text(")") + cmd.Text("|| (").Text("if [ -e").Input(text).Text("]; then cat").Input(text).Text("; fi; exit 7)") - rule.Command().Text("rm -rf").Flag(cacheDir.String()).Flag(homeDir.String()) + rule.Command().Text("rm -rf").Flag(lintPaths.cacheDir.String()).Flag(lintPaths.homeDir.String()) rule.Build("lint", "lint") |