From 84473f55d71b06e5b676e08eb8c7d0ee0561351f Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Fri, 11 Aug 2023 22:36:33 +0000 Subject: [PATCH] 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 --- java/java.go | 24 ++++++++++++++++++++++++ java/java_test.go | 38 +++++++++++++++++++------------------- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/java/java.go b/java/java.go index 0d39a6a78..988a07492 100644 --- a/java/java.go +++ b/java/java.go @@ -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) diff --git a/java/java_test.go b/java/java_test.go index dd9867704..6110e21cb 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -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 := `