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

Commit 534e2e50 authored by Jihoon Kang's avatar Jihoon Kang Committed by Gerrit Code Review
Browse files

Merge changes from topics "remove_api_files", "remove_naming_convention" into main

* changes:
  Remove naming conventioned based file sorting in java_api_library
  Remove api_files property from java_api_library
parents b95a8b33 a96a7b1e
Loading
Loading
Loading
Loading
+16 −40
Original line number Diff line number Diff line
@@ -1667,11 +1667,6 @@ type JavaApiLibraryProperties struct {
	// This is a list of Soong modules
	Api_contributions []string

	// list of api.txt files relative to this directory that contribute to the
	// API surface.
	// This is a list of relative paths
	Api_files []string `android:"path"`

	// List of flags to be passed to the javac compiler to generate jar file
	Javacflags []string

@@ -1819,37 +1814,22 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
	}
}

// API signature file names sorted from
// the narrowest api scope to the widest api scope
var scopeOrderedSourceFileNames = allApiScopes.Strings(
	func(s *apiScope) string { return s.apiFilePrefix + "current.txt" })

func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFilesInfo []JavaApiImportInfo, apiFiles android.Paths) android.Paths {
	var sortedSrcFiles android.Paths

	for i, apiScope := range allApiScopes {
		for _, srcFileInfo := range srcFilesInfo {
			if srcFileInfo.ApiFile.Base() == scopeOrderedSourceFileNames[i] || srcFileInfo.ApiSurface == apiScope.name {
				sortedSrcFiles = append(sortedSrcFiles, android.PathForSource(ctx, srcFileInfo.ApiFile.String()))
			}
		}
		// TODO: b/300964421 - Remove when api_files property is removed
		for _, apiFileName := range apiFiles {
			if apiFileName.Base() == scopeOrderedSourceFileNames[i] {
				sortedSrcFiles = append(sortedSrcFiles, apiFileName)
			}
		}
	}
// Map where key is the api scope name and value is the int value
// representing the order of the api scope, narrowest to the widest
var scopeOrderMap = allApiScopes.MapToIndex(
	func(s *apiScope) string { return s.name })

	if len(srcFilesInfo)+len(apiFiles) != len(sortedSrcFiles) {
		var srcFiles android.Paths
func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFilesInfo []JavaApiImportInfo) []JavaApiImportInfo {
	for _, srcFileInfo := range srcFilesInfo {
			srcFiles = append(srcFiles, srcFileInfo.ApiFile)
		if srcFileInfo.ApiSurface == "" {
			ctx.ModuleErrorf("Api surface not defined for the associated api file %s", srcFileInfo.ApiFile)
		}
		ctx.ModuleErrorf("Unrecognizable source file found within %s", append(srcFiles, apiFiles...))
	}
	sort.Slice(srcFilesInfo, func(i, j int) bool {
		return scopeOrderMap[srcFilesInfo[i].ApiSurface] < scopeOrderMap[srcFilesInfo[j].ApiSurface]
	})

	return sortedSrcFiles
	return srcFilesInfo
}

func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
@@ -1892,16 +1872,12 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
		}
	})

	// Add the api_files inputs
	// These are api files in the module subdirectory, which are not provided by
	// java_api_contribution but provided directly as module property.
	var apiFiles android.Paths
	for _, api := range al.properties.Api_files {
		apiFiles = append(apiFiles, android.PathForModuleSrc(ctx, api))
	srcFilesInfo = al.sortApiFilesByApiScope(ctx, srcFilesInfo)
	var srcFiles android.Paths
	for _, srcFileInfo := range srcFilesInfo {
		srcFiles = append(srcFiles, android.PathForSource(ctx, srcFileInfo.ApiFile.String()))
	}

	srcFiles := al.sortApiFilesByApiScope(ctx, srcFilesInfo, apiFiles)

	if srcFiles == nil && !ctx.Config().AllowMissingDependencies() {
		ctx.ModuleErrorf("Error: %s has an empty api file.", ctx.ModuleName())
	}
+29 −27
Original line number Diff line number Diff line
@@ -1885,7 +1885,6 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) {
			name: "bar2",
			api_surface: "system",
			api_contributions: ["foo1", "foo2"],
			api_files: ["api1/current.txt", "api2/current.txt"]
		}
		`,
		map[string][]byte{
@@ -1903,7 +1902,7 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) {
		},
		{
			moduleName:         "bar2",
			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "api1/current.txt", "api2/current.txt"},
			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
		},
	}
	for _, c := range testcases {
@@ -1975,7 +1974,6 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
			api_surface: "system",
			defaults:["baz1", "baz2"],
			api_contributions: ["foo4"],
			api_files: ["api1/current.txt", "api2/current.txt"]
		}
		`,
		map[string][]byte{
@@ -2000,7 +1998,7 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
		{
			moduleName: "bar3",
			// API text files need to be sorted from the narrower api scope to the wider api scope
			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "api1/current.txt", "api2/current.txt", "c/system-current.txt", "d/system-current.txt"},
			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "c/system-current.txt", "d/system-current.txt"},
		},
	}
	for _, c := range testcases {
@@ -2265,29 +2263,6 @@ func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) {
	android.AssertStringDoesContain(t, "Command expected to contain full_api_surface_stub output jar", manifestCommand, "lib1.jar")
}

func TestJavaApiLibraryFilegroupInput(t *testing.T) {
	ctx, _ := testJavaWithFS(t, `
	    filegroup {
			name: "default_current.txt",
			srcs: ["current.txt"],
		}

		java_api_library {
			name: "foo",
			api_files: [":default_current.txt"],
		}
		`,
		map[string][]byte{
			"current.txt": nil,
		})

	m := ctx.ModuleForTests("foo", "android_common")
	outputs := fmt.Sprint(m.AllOutputs())
	if !strings.Contains(outputs, "foo/foo.jar") {
		t.Errorf("Module output does not contain expected jar %s", "foo/foo.jar")
	}
}

func TestTradefedOptions(t *testing.T) {
	result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
java_test_host {
@@ -2423,3 +2398,30 @@ func TestJavaApiContributionImport(t *testing.T) {
	sourceFilesFlag := "--source-files current.txt"
	android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
}

func TestJavaApiLibraryApiFilesSorting(t *testing.T) {
	ctx, _ := testJava(t, `
		java_api_library {
			name: "foo",
			api_contributions: [
				"system-server-api-stubs-docs-non-updatable.api.contribution",
				"test-api-stubs-docs-non-updatable.api.contribution",
				"system-api-stubs-docs-non-updatable.api.contribution",
				"module-lib-api-stubs-docs-non-updatable.api.contribution",
				"api-stubs-docs-non-updatable.api.contribution",
			],
		}
	`)
	m := ctx.ModuleForTests("foo", "android_common")
	manifest := m.Output("metalava.sbox.textproto")
	sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
	manifestCommand := sboxProto.Commands[0].GetCommand()

	// Api files are sorted from the narrowest api scope to the widest api scope.
	// test api and module lib api surface do not have subset/superset relationship,
	// but they will never be passed as inputs at the same time.
	sourceFilesFlag := "--source-files default/java/api/current.txt " +
		"default/java/api/system-current.txt default/java/api/test-current.txt " +
		"default/java/api/module-lib-current.txt default/java/api/system-server-current.txt"
	android.AssertStringDoesContain(t, "source text files not in api scope order", manifestCommand, sourceFilesFlag)
}
+11 −0
Original line number Diff line number Diff line
@@ -286,6 +286,17 @@ func (scopes apiScopes) Strings(accessor func(*apiScope) string) []string {
	return list
}

// Method that maps the apiScopes properties to the index of each apiScopes elements.
// apiScopes property to be used as the key can be specified with the input accessor.
// Only a string property of apiScope can be used as the key of the map.
func (scopes apiScopes) MapToIndex(accessor func(*apiScope) string) map[string]int {
	ret := make(map[string]int)
	for i, scope := range scopes {
		ret[accessor(scope)] = i
	}
	return ret
}

var (
	scopeByName    = make(map[string]*apiScope)
	allScopeNames  []string
+68 −18
Original line number Diff line number Diff line
@@ -424,30 +424,80 @@ func gatherRequiredDepsForTest() string {
		`, extra)
	}

	extraApiLibraryModules := map[string]string{
		"android_stubs_current.from-text":                  "api/current.txt",
		"android_system_stubs_current.from-text":           "api/system-current.txt",
		"android_test_stubs_current.from-text":             "api/test-current.txt",
		"android_module_lib_stubs_current.from-text":       "api/module-lib-current.txt",
		"android_module_lib_stubs_current_full.from-text":  "api/module-lib-current.txt",
		"android_system_server_stubs_current.from-text":    "api/system-server-current.txt",
		"core.current.stubs.from-text":                     "api/current.txt",
		"legacy.core.platform.api.stubs.from-text":         "api/current.txt",
		"stable.core.platform.api.stubs.from-text":         "api/current.txt",
		"core-lambda-stubs.from-text":                      "api/current.txt",
		"android-non-updatable.stubs.from-text":            "api/current.txt",
		"android-non-updatable.stubs.system.from-text":     "api/system-current.txt",
		"android-non-updatable.stubs.test.from-text":       "api/test-current.txt",
		"android-non-updatable.stubs.module_lib.from-text": "api/module-lib-current.txt",
	}

	for libName, apiFile := range extraApiLibraryModules {
	type apiContributionStruct struct {
		name       string
		apiSurface string
		apiFile    string
	}

	var publicApiContribution = apiContributionStruct{
		name:       "api-stubs-docs-non-updatable.api.contribution",
		apiSurface: "public",
		apiFile:    "api/current.txt",
	}
	var systemApiContribution = apiContributionStruct{
		name:       "system-api-stubs-docs-non-updatable.api.contribution",
		apiSurface: "system",
		apiFile:    "api/system-current.txt",
	}
	var testApiContribution = apiContributionStruct{
		name:       "test-api-stubs-docs-non-updatable.api.contribution",
		apiSurface: "test",
		apiFile:    "api/test-current.txt",
	}
	var moduleLibApiContribution = apiContributionStruct{
		name:       "module-lib-api-stubs-docs-non-updatable.api.contribution",
		apiSurface: "module-lib",
		apiFile:    "api/module-lib-current.txt",
	}
	var systemServerApiContribution = apiContributionStruct{
		// This module does not exist but is named this way for consistency
		name:       "system-server-api-stubs-docs-non-updatable.api.contribution",
		apiSurface: "system-server",
		apiFile:    "api/system-server-current.txt",
	}
	var apiContributionStructs = []apiContributionStruct{
		publicApiContribution,
		systemApiContribution,
		testApiContribution,
		moduleLibApiContribution,
		systemServerApiContribution,
	}

	extraApiLibraryModules := map[string]apiContributionStruct{
		"android_stubs_current.from-text":                  publicApiContribution,
		"android_system_stubs_current.from-text":           systemApiContribution,
		"android_test_stubs_current.from-text":             testApiContribution,
		"android_module_lib_stubs_current.from-text":       moduleLibApiContribution,
		"android_module_lib_stubs_current_full.from-text":  moduleLibApiContribution,
		"android_system_server_stubs_current.from-text":    systemServerApiContribution,
		"core.current.stubs.from-text":                     publicApiContribution,
		"legacy.core.platform.api.stubs.from-text":         publicApiContribution,
		"stable.core.platform.api.stubs.from-text":         publicApiContribution,
		"core-lambda-stubs.from-text":                      publicApiContribution,
		"android-non-updatable.stubs.from-text":            publicApiContribution,
		"android-non-updatable.stubs.system.from-text":     systemApiContribution,
		"android-non-updatable.stubs.test.from-text":       testApiContribution,
		"android-non-updatable.stubs.module_lib.from-text": moduleLibApiContribution,
	}

	for _, apiContribution := range apiContributionStructs {
		bp += fmt.Sprintf(`
			java_api_contribution {
				name: "%s",
				api_surface: "%s",
				api_file: "%s",
			}
		`, apiContribution.name, apiContribution.apiSurface, apiContribution.apiFile)
	}

	for libName, apiContribution := range extraApiLibraryModules {
		bp += fmt.Sprintf(`
            java_api_library {
                name: "%s",
                api_files: ["%s"],
                api_contributions: ["%s"],
            }
        `, libName, apiFile)
        `, libName, apiContribution.name)
	}

	bp += `