diff --git a/java/droiddoc.go b/java/droiddoc.go index df40d016c..6a66f45ec 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -222,8 +222,6 @@ type Javadoc struct { stubsSrcJar android.WritablePath exportableStubsSrcJar android.WritablePath - - runtimeStubsSrcJar android.WritablePath } func (j *Javadoc) OutputFiles(tag string) (android.Paths, error) { diff --git a/java/droidstubs.go b/java/droidstubs.go index f4bcaca15..76c8d8890 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -227,7 +227,6 @@ type currentApiTimestampProvider interface { type annotationFlagsParams struct { migratingNullability bool validatingNullability bool - extractAnnotations bool nullabilityWarningsFile android.WritablePath annotationsZip android.WritablePath } @@ -243,19 +242,16 @@ type stubsCommandParams struct { stubConfig stubsCommandConfigParams } type stubsCommandConfigParams struct { - stubsType StubsType - javaVersion javaVersion - deps deps - checkApi bool - generateStubs bool - doApiLint bool - doCheckReleased bool - writeSdkValues bool - migratingNullability bool - validatingNullability bool - annotationsEnabled bool - apiLevelsAnnotationsEnabled bool - extractAnnotations bool + stubsType StubsType + javaVersion javaVersion + deps deps + checkApi bool + generateStubs bool + doApiLint bool + doCheckReleased bool + writeSdkValues bool + migratingNullability bool + validatingNullability bool } // droidstubs passes sources files through Metalava to generate stub .java files that only contain the API to be @@ -525,30 +521,30 @@ func (d *Droidstubs) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuil } func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, params annotationFlagsParams) { - cmd.Flag(config.MetalavaAnnotationsFlags) + if Bool(d.properties.Annotations_enabled) { + cmd.Flag(config.MetalavaAnnotationsFlags) - if params.migratingNullability { - previousApi := android.PathForModuleSrc(ctx, String(d.properties.Previous_api)) - cmd.FlagWithInput("--migrate-nullness ", previousApi) - } + if params.migratingNullability { + previousApi := android.PathForModuleSrc(ctx, String(d.properties.Previous_api)) + cmd.FlagWithInput("--migrate-nullness ", previousApi) + } - if s := String(d.properties.Validate_nullability_from_list); s != "" { - cmd.FlagWithInput("--validate-nullability-from-list ", android.PathForModuleSrc(ctx, s)) - } + if s := String(d.properties.Validate_nullability_from_list); s != "" { + cmd.FlagWithInput("--validate-nullability-from-list ", android.PathForModuleSrc(ctx, s)) + } - if params.validatingNullability { - cmd.FlagWithOutput("--nullability-warnings-txt ", params.nullabilityWarningsFile) - } + if params.validatingNullability { + cmd.FlagWithOutput("--nullability-warnings-txt ", params.nullabilityWarningsFile) + } - if params.extractAnnotations { cmd.FlagWithOutput("--extract-annotations ", params.annotationsZip) - } - if len(d.properties.Merge_annotations_dirs) != 0 { - d.mergeAnnoDirFlags(ctx, cmd) - } + if len(d.properties.Merge_annotations_dirs) != 0 { + d.mergeAnnoDirFlags(ctx, cmd) + } - cmd.Flag(config.MetalavaAnnotationsWarningsFlags) + cmd.Flag(config.MetalavaAnnotationsWarningsFlags) + } } func (d *Droidstubs) mergeAnnoDirFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) { @@ -573,11 +569,9 @@ func (d *Droidstubs) inclusionAnnotationsFlags(ctx android.ModuleContext, cmd *a }) } -func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, params stubsCommandParams) { +func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsType StubsType, apiVersionsXml android.WritablePath) { var apiVersions android.Path - stubsType := params.stubConfig.stubsType - apiVersionsXml := params.apiVersionsXml - if params.stubConfig.apiLevelsAnnotationsEnabled { + if proptools.Bool(d.properties.Api_levels_annotations_enabled) { d.apiLevelsGenerationFlags(ctx, cmd, stubsType, apiVersionsXml) apiVersions = apiVersionsXml } else { @@ -588,9 +582,7 @@ func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *a } else if stubsType == Exportable { apiVersions = s.exportableArtifacts.apiVersionsXml } else { - // if the stubs type does not generate api-versions.xml file, default to using the - // everything artifacts - apiVersions = s.everythingArtifacts.apiVersionsXml + ctx.ModuleErrorf("%s stubs type does not generate api-versions.xml file", stubsType.String()) } } else { ctx.PropertyErrorf("api_levels_module", @@ -824,16 +816,13 @@ func (d *Droidstubs) commonMetalavaStubCmd(ctx android.ModuleContext, rule *andr annotationParams := annotationFlagsParams{ migratingNullability: params.stubConfig.migratingNullability, validatingNullability: params.stubConfig.validatingNullability, - extractAnnotations: params.stubConfig.extractAnnotations, nullabilityWarningsFile: params.nullabilityWarningsFile, annotationsZip: params.annotationsZip, } - if params.stubConfig.annotationsEnabled { - d.annotationsFlags(ctx, cmd, annotationParams) - } + d.annotationsFlags(ctx, cmd, annotationParams) d.inclusionAnnotationsFlags(ctx, cmd) - d.apiLevelsAnnotationsFlags(ctx, cmd, params) + d.apiLevelsAnnotationsFlags(ctx, cmd, params.stubConfig.stubsType, params.apiVersionsXml) d.expandArgs(ctx, cmd) @@ -863,13 +852,13 @@ func (d *Droidstubs) everythingStubCmd(ctx android.ModuleContext, params stubsCo d.everythingArtifacts.metadataZip = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"-metadata.zip") } - if params.annotationsEnabled { + if Bool(d.properties.Annotations_enabled) { if params.validatingNullability { d.everythingArtifacts.nullabilityWarningsFile = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"_nullability_warnings.txt") } d.everythingArtifacts.annotationsZip = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"_annotations.zip") } - if params.apiLevelsAnnotationsEnabled { + if Bool(d.properties.Api_levels_annotations_enabled) { d.everythingArtifacts.apiVersionsXml = android.PathForModuleOut(ctx, Everything.String(), "api-versions.xml") } @@ -1047,7 +1036,7 @@ func (d *Droidstubs) exportableStubCmd(ctx android.ModuleContext, params stubsCo optionalCmdParams.metadataDir = d.exportableArtifacts.metadataDir } - if params.annotationsEnabled { + if Bool(d.properties.Annotations_enabled) { if params.validatingNullability { d.exportableArtifacts.nullabilityWarningsFile = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"_nullability_warnings.txt") optionalCmdParams.nullabilityWarningsFile = d.exportableArtifacts.nullabilityWarningsFile @@ -1055,7 +1044,7 @@ func (d *Droidstubs) exportableStubCmd(ctx android.ModuleContext, params stubsCo d.exportableArtifacts.annotationsZip = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"_annotations.zip") optionalCmdParams.annotationsZip = d.exportableArtifacts.annotationsZip } - if params.apiLevelsAnnotationsEnabled { + if Bool(d.properties.Api_levels_annotations_enabled) { d.exportableArtifacts.apiVersionsXml = android.PathForModuleOut(ctx, params.stubsType.String(), "api-versions.xml") optionalCmdParams.apiVersionsXml = d.exportableArtifacts.apiVersionsXml } @@ -1073,38 +1062,6 @@ func (d *Droidstubs) exportableStubCmd(ctx android.ModuleContext, params stubsCo d.optionalStubCmd(ctx, optionalCmdParams) } -// Sandbox rule for generating runtime stubs -func (d *Droidstubs) runtimeStubCmd(ctx android.ModuleContext, params stubsCommandConfigParams) { - - // We are only interested in generating the stubs srcjar, - // not other artifacts for the runtime stubs - params.checkApi = false - params.writeSdkValues = false - params.validatingNullability = false - params.extractAnnotations = false - params.apiLevelsAnnotationsEnabled = false - - optionalCmdParams := stubsCommandParams{ - stubConfig: params, - } - - d.Javadoc.runtimeStubsSrcJar = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"-"+"stubs.srcjar") - optionalCmdParams.stubsSrcJar = d.Javadoc.runtimeStubsSrcJar - - // If aconfig_declarations property is not defined, all flagged apis symbols are stripped - // as no aconfig flags are enabled. In such case, the runtime stubs are identical to the - // exportable stubs, thus no additional metalava invocation is needed. - if len(d.properties.Aconfig_declarations) == 0 { - rule := android.NewRuleBuilder(pctx, ctx) - rule.Command(). - Text("cp").Flag("-f"). - Input(d.exportableStubsSrcJar).Output(d.runtimeStubsSrcJar) - rule.Build(fmt.Sprintf("metalava_%s", params.stubsType.String()), "metalava merged") - } else { - d.optionalStubCmd(ctx, optionalCmdParams) - } -} - func (d *Droidstubs) optionalStubCmd(ctx android.ModuleContext, params stubsCommandParams) { params.srcJarDir = android.PathForModuleOut(ctx, params.stubConfig.stubsType.String(), "srcjars") @@ -1176,8 +1133,6 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { annotationsEnabled := Bool(d.properties.Annotations_enabled) - extractAnnotations := annotationsEnabled - migratingNullability := annotationsEnabled && String(d.properties.Previous_api) != "" validatingNullability := annotationsEnabled && (strings.Contains(String(d.Javadoc.properties.Args), "--validate-nullability-from-merged-stubs") || String(d.properties.Validate_nullability_from_list) != "") @@ -1185,40 +1140,27 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { checkApi := apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") || apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") - apiLevelsAnnotationsEnabled := proptools.Bool(d.properties.Api_levels_annotations_enabled) - stubCmdParams := stubsCommandConfigParams{ - javaVersion: javaVersion, - deps: deps, - checkApi: checkApi, - generateStubs: generateStubs, - doApiLint: doApiLint, - doCheckReleased: doCheckReleased, - writeSdkValues: writeSdkValues, - migratingNullability: migratingNullability, - validatingNullability: validatingNullability, - annotationsEnabled: annotationsEnabled, - apiLevelsAnnotationsEnabled: apiLevelsAnnotationsEnabled, - extractAnnotations: extractAnnotations, + javaVersion: javaVersion, + deps: deps, + checkApi: checkApi, + generateStubs: generateStubs, + doApiLint: doApiLint, + doCheckReleased: doCheckReleased, + writeSdkValues: writeSdkValues, + migratingNullability: migratingNullability, + validatingNullability: validatingNullability, } stubCmdParams.stubsType = Everything // Create default (i.e. "everything" stubs) rule for metalava d.everythingStubCmd(ctx, stubCmdParams) - // The module generates "exportable" stubs regardless of whether + // The module generates "exportable" (and "runtime" eventually) stubs regardless of whether // aconfig_declarations property is defined or not. If the property is not defined, the module simply // strips all flagged apis to generate the "exportable" stubs stubCmdParams.stubsType = Exportable d.exportableStubCmd(ctx, stubCmdParams) - // "runtime" stubs do not generate any other artifacts than the stubs. - // Therefore, metalava does not have to run for "runtime" configuration - // when the module does not generate stubs. - if stubCmdParams.generateStubs { - stubCmdParams.stubsType = Runtime - d.runtimeStubCmd(ctx, stubCmdParams) - } - if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") { if len(d.Javadoc.properties.Out) > 0 { diff --git a/java/droidstubs_test.go b/java/droidstubs_test.go index c86e8bf0f..8da695f08 100644 --- a/java/droidstubs_test.go +++ b/java/droidstubs_test.go @@ -397,47 +397,23 @@ func TestAconfigDeclarations(t *testing.T) { "bar", ], } - droidstubs { - name: "baz", - srcs: ["a/A.java"], - api_surface: "public", - check_api: { - current: { - api_file: "a/current.txt", - removed_api_file: "a/removed.txt", - } - }, - } `) // Check that droidstubs depend on aconfig_declarations android.AssertBoolEquals(t, "foo expected to depend on bar", CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"), true) - fooModule := result.ModuleForTests("foo", "android_common") + m := result.ModuleForTests("foo", "android_common") android.AssertStringDoesContain(t, "foo generates revert annotations file", - strings.Join(fooModule.AllOutputs(), ""), "revert-annotations-exportable.txt") + strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt") // revert-annotations.txt passed to exportable stubs generation metalava command - exportableManifest := fooModule.Output("metalava_exportable.sbox.textproto") - exportableCmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, exportableManifest).Commands[0].Command) - android.AssertStringDoesContain(t, "flagged api hide command not included", exportableCmdline, "revert-annotations-exportable.txt") + manifest := m.Output("metalava_exportable.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") android.AssertStringDoesContain(t, "foo generates exportable stubs jar", - strings.Join(fooModule.AllOutputs(), ""), "exportable/foo-stubs.srcjar") - - // revert-annotations.txt passed to runtime stubs generation metalava command - runtimeManifest := fooModule.Output("metalava_runtime.sbox.textproto") - runtimeCmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, runtimeManifest).Commands[0].Command) - android.AssertStringDoesContain(t, "flagged api hide command not included", runtimeCmdline, "revert-annotations-runtime.txt") - - android.AssertStringDoesContain(t, "foo generates runtime stubs jar", - strings.Join(fooModule.AllOutputs(), ""), "runtime/foo-stubs.srcjar") - - // If aconfig_declarations property is not defined, the runtime stubs is a copy of the exportable stubs - bazModule := result.ModuleForTests("baz", "android_common") - bazRuntimeCmdline := bazModule.Rule("metalava_runtime").RuleParams.Command - android.AssertStringDoesContain(t, "copy command should include the input stub", bazRuntimeCmdline, "exportable/baz-stubs.srcjar") + strings.Join(m.AllOutputs(), ""), "exportable/foo-stubs.srcjar") } func TestReleaseExportRuntimeApis(t *testing.T) {