Enable non-"everything" stubs generation in java_api_library

This change adds support to generate non-"everything" (i.e. "runtime"
and "exportable") stubs in java_api_library, which generates the stubs
from the api signature files.

Unlike droidstubs module that generates "everything", "exportable" and
"runtime" stubs in a single module, java_api_library generates a single
set of stubs per module, which is set by the default-"everything"
property `stubs_type`. This is because java_api_library is responsible
for both generation and the compilation of the stubs srcjar, and
compilation of the stubs srcjar are done in separate java_library
modules for from-source stubs.

Utilization of this feature will be done in a follow up change that
generates the "exportable" java_api_library modules in java_sdk_library.

Test: m nothing --no-skip-soong-tests
Bug: 318009570
Change-Id: I1051544ac3bcdb3ba1f78bfec28eba4e9fad9c2d
This commit is contained in:
Jihoon Kang
2024-02-15 21:53:49 +00:00
parent 60bdd05b21
commit 5d701272e4
7 changed files with 148 additions and 6 deletions

View File

@@ -24,6 +24,7 @@ import (
"sort"
"strings"
"android/soong/aconfig"
"android/soong/remoteexec"
"android/soong/testing"
@@ -1863,6 +1864,10 @@ type ApiLibrary struct {
dexJarFile OptionalDexJarPath
validationPaths android.Paths
stubsType StubsType
aconfigProtoFiles android.Paths
}
type JavaApiLibraryProperties struct {
@@ -1904,6 +1909,20 @@ type JavaApiLibraryProperties struct {
// in sync with the source Java files. However, the environment variable
// DISABLE_STUB_VALIDATION has precedence over this property.
Enable_validation *bool
// Type of stubs the module should generate. Must be one of "everything", "runtime" or
// "exportable". Defaults to "everything".
// - "everything" stubs include all non-flagged apis and flagged apis, regardless of the state
// of the flag.
// - "runtime" stubs include all non-flagged apis and flagged apis that are ENABLED or
// READ_WRITE, and all other flagged apis are stripped.
// - "exportable" stubs include all non-flagged apis and flagged apis that are ENABLED and
// READ_ONLY, and all other flagged apis are stripped.
Stubs_type *string
// List of aconfig_declarations module names that the stubs generated in this module
// depend on.
Aconfig_declarations []string
}
func ApiLibraryFactory() android.Module {
@@ -2067,6 +2086,9 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
if al.properties.System_modules != nil {
ctx.AddVariationDependencies(nil, systemModulesTag, String(al.properties.System_modules))
}
for _, aconfigDeclarationsName := range al.properties.Aconfig_declarations {
ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfigDeclarationsName)
}
}
// Map where key is the api scope name and value is the int value
@@ -2087,7 +2109,23 @@ func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFiles
return srcFilesInfo
}
var validstubsType = []StubsType{Everything, Runtime, Exportable}
func (al *ApiLibrary) validateProperties(ctx android.ModuleContext) {
if al.properties.Stubs_type == nil {
ctx.ModuleErrorf("java_api_library module type must specify stubs_type property.")
} else {
al.stubsType = StringToStubsType(proptools.String(al.properties.Stubs_type))
}
if !android.InList(al.stubsType, validstubsType) {
ctx.PropertyErrorf("stubs_type", "%s is not a valid stubs_type property value. "+
"Must be one of %s.", proptools.String(al.properties.Stubs_type), validstubsType)
}
}
func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
al.validateProperties(ctx)
rule := android.NewRuleBuilder(pctx, ctx)
@@ -2131,6 +2169,18 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if currentApiTimestampProvider, ok := dep.(currentApiTimestampProvider); ok {
al.validationPaths = append(al.validationPaths, currentApiTimestampProvider.CurrentApiTimestamp())
}
case aconfigDeclarationTag:
if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok {
al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPath)
} else if provider, ok := android.OtherModuleProvider(ctx, dep, aconfig.CodegenInfoProvider); ok {
al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPaths...)
} else {
ctx.ModuleErrorf("Only aconfig_declarations and aconfig_declarations_group "+
"module type is allowed for flags_packages property, but %s is neither "+
"of these supported module types",
dep.Name(),
)
}
}
})
@@ -2156,6 +2206,8 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
al.addValidation(ctx, cmd, al.validationPaths)
generateRevertAnnotationArgs(ctx, cmd, al.stubsType, al.aconfigProtoFiles)
al.stubsSrcJar = android.PathForModuleOut(ctx, "metalava", ctx.ModuleName()+"-"+"stubs.srcjar")
al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, "metalava", "stubs.jar")
al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName()))