Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08dc441c authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/26459294',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/26459294', 'googleplex-android-review.googlesource.com/26457742', 'googleplex-android-review.googlesource.com/26620899'] into 24Q2-release.

Change-Id: I5f559c1e1d797a855ae09c60043b5c5edcad3654
parents 93ae9eb2 58d100f8
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -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) {
+66 −117
Original line number Diff line number Diff line
@@ -227,7 +227,6 @@ type currentApiTimestampProvider interface {
type annotationFlagsParams struct {
	migratingNullability    bool
	validatingNullability   bool
	extractAnnotations      bool
	nullabilityWarningsFile android.WritablePath
	annotationsZip          android.WritablePath
}
@@ -253,9 +252,6 @@ type stubsCommandConfigParams struct {
	writeSdkValues        bool
	migratingNullability  bool
	validatingNullability bool
	annotationsEnabled          bool
	apiLevelsAnnotationsEnabled bool
	extractAnnotations          bool
}

// droidstubs passes sources files through Metalava to generate stub .java files that only contain the API to be
@@ -372,7 +368,7 @@ func (d *Droidstubs) ApiFilePath(stubsType StubsType) (ret android.Path, err err
		ret, err = nil, fmt.Errorf("api file path not supported for the stub type %s", stubsType.String())
	}
	if ret == nil && err == nil {
		err = fmt.Errorf("stubs srcjar is null for the stub type %s", stubsType.String())
		err = fmt.Errorf("api file is null for the stub type %s", stubsType.String())
	}
	return ret, err
}
@@ -482,34 +478,41 @@ func (d *Droidstubs) sdkValuesFlags(ctx android.ModuleContext, cmd *android.Rule
}

func (d *Droidstubs) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.OptionalPath, stubsType StubsType, checkApi bool) {
	if checkApi || String(d.properties.Api_filename) != "" {
		filename := proptools.StringDefault(d.properties.Api_filename, ctx.ModuleName()+"_api.txt")
		uncheckedApiFile := android.PathForModuleOut(ctx, stubsType.String(), filename)
		cmd.FlagWithOutput("--api ", uncheckedApiFile)

	apiFileName := proptools.StringDefault(d.properties.Api_filename, ctx.ModuleName()+"_api.txt")
	uncheckedApiFile := android.PathForModuleOut(ctx, stubsType.String(), apiFileName)
	cmd.FlagWithOutput("--api ", uncheckedApiFile)
	if checkApi || String(d.properties.Api_filename) != "" {
		if stubsType == Everything {
			d.apiFile = uncheckedApiFile
		} else if stubsType == Exportable {
			d.exportableApiFile = uncheckedApiFile
		}
	} else if sourceApiFile := proptools.String(d.properties.Check_api.Current.Api_file); sourceApiFile != "" {
		if stubsType == Everything {
			// If check api is disabled then make the source file available for export.
			d.apiFile = android.PathForModuleSrc(ctx, sourceApiFile)
		} else if stubsType == Exportable {
			d.exportableApiFile = uncheckedApiFile
		}
	}

	if checkApi || String(d.properties.Removed_api_filename) != "" {
		filename := proptools.StringDefault(d.properties.Removed_api_filename, ctx.ModuleName()+"_removed.txt")
		uncheckedRemovedFile := android.PathForModuleOut(ctx, stubsType.String(), filename)
	removedApiFileName := proptools.StringDefault(d.properties.Removed_api_filename, ctx.ModuleName()+"_removed.txt")
	uncheckedRemovedFile := android.PathForModuleOut(ctx, stubsType.String(), removedApiFileName)
	cmd.FlagWithOutput("--removed-api ", uncheckedRemovedFile)

	if checkApi || String(d.properties.Removed_api_filename) != "" {
		if stubsType == Everything {
			d.removedApiFile = uncheckedRemovedFile
		} else if stubsType == Exportable {
			d.exportableRemovedApiFile = uncheckedRemovedFile
		}
	} else if sourceRemovedApiFile := proptools.String(d.properties.Check_api.Current.Removed_api_file); sourceRemovedApiFile != "" {
		if stubsType == Everything {
			// If check api is disabled then make the source removed api file available for export.
			d.removedApiFile = android.PathForModuleSrc(ctx, sourceRemovedApiFile)
		} else if stubsType == Exportable {
			d.exportableRemovedApiFile = uncheckedRemovedFile
		}
	}

	if stubsDir.Valid() {
@@ -525,6 +528,7 @@ func (d *Droidstubs) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuil
}

func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, params annotationFlagsParams) {
	if Bool(d.properties.Annotations_enabled) {
		cmd.Flag(config.MetalavaAnnotationsFlags)

		if params.migratingNullability {
@@ -540,9 +544,7 @@ func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.Ru
			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)
@@ -550,6 +552,7 @@ func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.Ru

		cmd.Flag(config.MetalavaAnnotationsWarningsFlags)
	}
}

func (d *Droidstubs) mergeAnnoDirFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
	ctx.VisitDirectDepsWithTag(metalavaMergeAnnotationsDirTag, func(m android.Module) {
@@ -573,11 +576,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 +589,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 +823,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.inclusionAnnotationsFlags(ctx, cmd)
	d.apiLevelsAnnotationsFlags(ctx, cmd, params)
	d.apiLevelsAnnotationsFlags(ctx, cmd, params.stubConfig.stubsType, params.apiVersionsXml)

	d.expandArgs(ctx, cmd)

@@ -863,13 +859,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 +1043,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 +1051,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 +1069,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 +1140,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,8 +1147,6 @@ 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,
@@ -1197,28 +1157,17 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
		writeSdkValues:        writeSdkValues,
		migratingNullability:  migratingNullability,
		validatingNullability: validatingNullability,
		annotationsEnabled:          annotationsEnabled,
		apiLevelsAnnotationsEnabled: apiLevelsAnnotationsEnabled,
		extractAnnotations:          extractAnnotations,
	}
	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 {
+6 −30
Original line number Diff line number Diff line
@@ -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) {