Sort api files by api scope in java_api_library

Recent changes in metalava (aosp/2704325) enforces api files passed as
inputs to generate stubs from txt to be sorted in the order from the
narrower api scope to the wider api scope. In order to comply with this
change, all api files passed as inputs to metalava invocations need to
be sorted in the respective order.

Test: m out/soong/.intermediates/packages/modules/IPsec/tests/cts/CtsIkeTestCases/android_common/e10894d3da5db41239526c9048962355/javac/CtsIkeTestCases.jar --build-from-text-stub --skip-soong-tests (Failing module from incorrect class hierarchy when building from text stub)
Bug: 295429988
Change-Id: I1eb1f4bf8fa34fd7dc8a0e4c04aa056258a975c5
This commit is contained in:
Jihoon Kang
2023-08-11 22:36:33 +00:00
parent 34a1c57b05
commit 84473f55d7
2 changed files with 43 additions and 19 deletions

View File

@@ -1812,6 +1812,28 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
}
}
func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFiles android.Paths) android.Paths {
sortedSrcFiles := android.Paths{}
// API signature file name sorted from
// the narrowest api scope to the widest api scope
scopeOrderedSourceFileNames := allApiScopes.Strings(
func(s *apiScope) string { return s.apiFilePrefix + "current.txt" })
for _, scopeSourceFileName := range scopeOrderedSourceFileNames {
for _, sourceFileName := range srcFiles {
if sourceFileName.Base() == scopeSourceFileName {
sortedSrcFiles = append(sortedSrcFiles, sourceFileName)
}
}
}
if len(srcFiles) != len(sortedSrcFiles) {
ctx.ModuleErrorf("Unrecognizable source file found within %s", srcFiles)
}
return sortedSrcFiles
}
func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
rule := android.NewRuleBuilder(pctx, ctx)
@@ -1862,6 +1884,8 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
ctx.ModuleErrorf("Error: %s has an empty api file.", ctx.ModuleName())
}
srcFiles = al.sortApiFilesByApiScope(ctx, srcFiles)
cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir)
al.stubsFlags(ctx, cmd, stubsDir)

View File

@@ -1864,12 +1864,12 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
api_file: "foo1.txt",
api_file: "current.txt",
}
`
provider_bp_b := `java_api_contribution {
name: "foo2",
api_file: "foo2.txt",
api_file: "current.txt",
}
`
ctx, _ := testJavaWithFS(t, `
@@ -1897,11 +1897,11 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) {
}{
{
moduleName: "bar1",
sourceTextFileDirs: []string{"a/foo1.txt"},
sourceTextFileDirs: []string{"a/current.txt"},
},
{
moduleName: "bar2",
sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt", "api1/current.txt", "api2/current.txt"},
sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "api1/current.txt", "api2/current.txt"},
},
}
for _, c := range testcases {
@@ -1918,25 +1918,25 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
api_file: "foo1.txt",
api_file: "current.txt",
}
`
provider_bp_b := `
java_api_contribution {
name: "foo2",
api_file: "foo2.txt",
api_file: "current.txt",
}
`
provider_bp_c := `
java_api_contribution {
name: "foo3",
api_file: "foo3.txt",
api_file: "current.txt",
}
`
provider_bp_d := `
java_api_contribution {
name: "foo4",
api_file: "foo4.txt",
api_file: "current.txt",
}
`
ctx, _ := testJavaWithFS(t, `
@@ -1985,15 +1985,15 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
}{
{
moduleName: "bar1",
sourceTextFileDirs: []string{"a/foo1.txt"},
sourceTextFileDirs: []string{"a/current.txt"},
},
{
moduleName: "bar2",
sourceTextFileDirs: []string{"a/foo1.txt", "b/foo2.txt"},
sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
},
{
moduleName: "bar3",
sourceTextFileDirs: []string{"c/foo3.txt", "a/foo1.txt", "b/foo2.txt", "d/foo4.txt", "api1/current.txt", "api2/current.txt"},
sourceTextFileDirs: []string{"c/current.txt", "a/current.txt", "b/current.txt", "d/current.txt", "api1/current.txt", "api2/current.txt"},
},
}
for _, c := range testcases {
@@ -2010,13 +2010,13 @@ func TestJavaApiLibraryJarGeneration(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
api_file: "foo1.txt",
api_file: "current.txt",
}
`
provider_bp_b := `
java_api_contribution {
name: "foo2",
api_file: "foo2.txt",
api_file: "current.txt",
}
`
ctx, _ := testJavaWithFS(t, `
@@ -2063,13 +2063,13 @@ func TestJavaApiLibraryLibsLink(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
api_file: "foo1.txt",
api_file: "current.txt",
}
`
provider_bp_b := `
java_api_contribution {
name: "foo2",
api_file: "foo2.txt",
api_file: "current.txt",
}
`
lib_bp_a := `
@@ -2138,13 +2138,13 @@ func TestJavaApiLibraryStaticLibsLink(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
api_file: "foo1.txt",
api_file: "current.txt",
}
`
provider_bp_b := `
java_api_contribution {
name: "foo2",
api_file: "foo2.txt",
api_file: "current.txt",
}
`
lib_bp_a := `
@@ -2212,13 +2212,13 @@ func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
api_file: "foo1.txt",
api_file: "current.txt",
}
`
provider_bp_b := `
java_api_contribution {
name: "foo2",
api_file: "foo2.txt",
api_file: "current.txt",
}
`
lib_bp_a := `