Enable from-text stub generation in non-sdk java_sdk_library

This change allows from-text stubs to be generated for all
java_sdk_library modules, unlike how it is currently limited to the
modules that contribute to the api surfaces (i.e. the SDK).

This change accomplish this by modifying the dependency of the
from-text stubs generation, so that the sdk_library generated from-text
stubs generating java_api_library modules no longer depend on the full
api surface stubs, but generate the stubs in the module level, and
combined later to generate the full api surface stubs.

This change also removes the java_api_library modules defined in
core-libraries/Android.bp, which are passed to generate the system
modules. Given that the from-text vs from-source toggle is done within
the java_sdk_library stubs level, these modules no longer need to exist.

Implementation details:
- Allow sdk_version to be specified in java_api_library modules. For
  java_sdk_library-generated java_api_library modules, they inherit that
  of the sdk_library module. Some java_sdk_library modules that do not
  contribute to the api surface are allowed to set sdk_version to
  something other than "none" or "core".
- Implement java_api_library to implement `SdkContext`. This allows
  java_api_library to collect required deps from sdk_version (classpath,
  bootclasspath, system modules), and pass the collected jars when
  generating the stubs srcjar in metalava and compiling the stubs srcjar
  in javac.
- Remove hardcoded list of sdk_library modules that are allowed to
  genereate stubs from the api signature files, and allow from-text
  stubs generation by default. Modules that are not able to generate
  stubs from the api signature files are specified by setting the newly
  introduced `Build_from_text_stubs` property to `false`.

Test: ENABLE_HIDDENAPI_FLAGS=true m
Bug: 327507877
Change-Id: Ia35d2f3cf9fae48fc8c4bd99a84ae18d7c0e7bee
This commit is contained in:
Jihoon Kang
2024-02-29 21:51:12 +00:00
parent 48e2ac926b
commit 062eb663c5
8 changed files with 131 additions and 444 deletions

View File

@@ -427,22 +427,10 @@ var (
apiScopeModuleLib,
apiScopeSystemServer,
}
apiLibraryAdditionalProperties = map[string]struct {
FullApiSurfaceStubLib string
AdditionalApiContribution string
}{
"legacy.i18n.module.platform.api": {
FullApiSurfaceStubLib: "legacy.core.platform.api.stubs",
AdditionalApiContribution: "i18n.module.public.api.stubs.source.api.contribution",
},
"stable.i18n.module.platform.api": {
FullApiSurfaceStubLib: "stable.core.platform.api.stubs",
AdditionalApiContribution: "i18n.module.public.api.stubs.source.api.contribution",
},
"conscrypt.module.platform.api": {
FullApiSurfaceStubLib: "stable.core.platform.api.stubs",
AdditionalApiContribution: "conscrypt.module.public.api.stubs.source.api.contribution",
},
apiLibraryAdditionalProperties = map[string]string{
"legacy.i18n.module.platform.api": "i18n.module.public.api.stubs.source.api.contribution",
"stable.i18n.module.platform.api": "i18n.module.public.api.stubs.source.api.contribution",
"conscrypt.module.platform.api": "conscrypt.module.public.api.stubs.source.api.contribution",
}
)
@@ -650,13 +638,6 @@ type sdkLibraryProperties struct {
Legacy_errors_allowed *bool
}
// Determines if the module contributes to any api surfaces.
// This property should be set to true only if the module is listed under
// frameworks-base-api.bootclasspath in frameworks/base/api/Android.bp.
// Otherwise, this property should be set to false.
// Defaults to false.
Contribute_to_android_api *bool
// a list of aconfig_declarations module names that the stubs generated in this module
// depend on.
Aconfig_declarations []string
@@ -1751,30 +1732,13 @@ func (module *SdkLibrary) latestIncompatibilitiesModuleName(apiScope *apiScope)
return latestPrebuiltApiModuleName(module.distStem()+"-incompatibilities", apiScope)
}
func (module *SdkLibrary) contributesToApiSurface(c android.Config) bool {
_, exists := c.GetApiLibraries()[module.Name()]
return exists
}
// The listed modules are the special java_sdk_libraries where apiScope.kind do not match the
// api surface that the module contribute to. For example, the public droidstubs and java_library
// do not contribute to the public api surface, but contributes to the core platform api surface.
// This method returns the full api surface stub lib that
// the generated java_api_library should depend on.
func (module *SdkLibrary) alternativeFullApiSurfaceStubLib() string {
if val, ok := apiLibraryAdditionalProperties[module.Name()]; ok {
return val.FullApiSurfaceStubLib
}
return ""
}
// The listed modules' stubs contents do not match the corresponding txt files,
// but require additional api contributions to generate the full stubs.
// This method returns the name of the additional api contribution module
// for corresponding sdk_library modules.
func (module *SdkLibrary) apiLibraryAdditionalApiContribution() string {
if val, ok := apiLibraryAdditionalProperties[module.Name()]; ok {
return val.AdditionalApiContribution
return val
}
return ""
}
@@ -2069,17 +2033,18 @@ func (module *SdkLibrary) createStubsSourcesAndApi(mctx android.DefaultableHookC
mctx.CreateModule(DroidstubsFactory, &props, module.sdkComponentPropertiesForChildLibrary()).(*Droidstubs).CallHookIfAvailable(mctx)
}
func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, apiScope *apiScope, alternativeFullApiSurfaceStub string) {
func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) {
props := struct {
Name *string
Visibility []string
Api_contributions []string
Libs []string
Static_libs []string
Full_api_surface_stub *string
System_modules *string
Enable_validation *bool
Stubs_type *string
Name *string
Visibility []string
Api_contributions []string
Libs []string
Static_libs []string
System_modules *string
Enable_validation *bool
Stubs_type *string
Sdk_version *string
Previous_api *string
}{}
props.Name = proptools.StringPtr(module.apiLibraryModuleName(apiScope))
@@ -2103,34 +2068,29 @@ func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext,
}
props.Api_contributions = apiContributions
props.Libs = module.properties.Libs
// Ensure that stub-annotations is added to the classpath before any other libs
props.Libs = []string{"stub-annotations"}
props.Libs = append(props.Libs, module.properties.Libs...)
props.Libs = append(props.Libs, module.properties.Static_libs...)
props.Libs = append(props.Libs, module.sdkLibraryProperties.Stub_only_libs...)
props.Libs = append(props.Libs, module.scopeToProperties[apiScope].Libs...)
props.Libs = append(props.Libs, "stub-annotations")
props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs
props.Full_api_surface_stub = proptools.StringPtr(apiScope.kind.DefaultJavaLibraryName())
if alternativeFullApiSurfaceStub != "" {
props.Full_api_surface_stub = proptools.StringPtr(alternativeFullApiSurfaceStub)
}
// android_module_lib_stubs_current.from-text only comprises api contributions from art, conscrypt and i18n.
// Thus, replace with android_module_lib_stubs_current_full.from-text, which comprises every api domains.
if apiScope.kind == android.SdkModule {
props.Full_api_surface_stub = proptools.StringPtr(apiScope.kind.DefaultJavaLibraryName() + "_full.from-text")
}
// java_sdk_library modules that set sdk_version as none does not depend on other api
// domains. Therefore, java_api_library created from such modules should not depend on
// full_api_surface_stubs but create and compile stubs by the java_api_library module
// itself.
if module.SdkVersion(mctx).Kind == android.SdkNone {
props.Full_api_surface_stub = nil
}
props.System_modules = module.deviceProperties.System_modules
props.Enable_validation = proptools.BoolPtr(true)
props.Stubs_type = proptools.StringPtr("everything")
if module.deviceProperties.Sdk_version != nil {
props.Sdk_version = module.deviceProperties.Sdk_version
}
if module.compareAgainstLatestApi(apiScope) {
// check against the latest released API
latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope))
props.Previous_api = latestApiFilegroupName
}
mctx.CreateModule(ApiLibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary())
}
@@ -2161,7 +2121,7 @@ func (module *SdkLibrary) topLevelStubsLibraryProps(mctx android.DefaultableHook
}
func (module *SdkLibrary) createTopLevelStubsLibrary(
mctx android.DefaultableHookContext, apiScope *apiScope, contributesToApiSurface bool) {
mctx android.DefaultableHookContext, apiScope *apiScope) {
// Dist the "everything" stubs when the RELEASE_HIDDEN_API_EXPORTABLE_STUBS build flag is false
doDist := !mctx.Config().ReleaseHiddenApiExportableStubs()
@@ -2170,7 +2130,7 @@ func (module *SdkLibrary) createTopLevelStubsLibrary(
// Add the stub compiling java_library/java_api_library as static lib based on build config
staticLib := module.sourceStubsLibraryModuleName(apiScope)
if mctx.Config().BuildFromTextStub() && contributesToApiSurface {
if mctx.Config().BuildFromTextStub() && module.ModuleBuildFromTextStubs() {
staticLib = module.apiLibraryModuleName(apiScope)
}
props.Static_libs = append(props.Static_libs, staticLib)
@@ -2213,8 +2173,8 @@ func (module *SdkLibrary) UniqueApexVariations() bool {
return module.uniqueApexVariations()
}
func (module *SdkLibrary) ContributeToApi() bool {
return proptools.BoolDefault(module.sdkLibraryProperties.Contribute_to_android_api, false)
func (module *SdkLibrary) ModuleBuildFromTextStubs() bool {
return proptools.BoolDefault(module.sdkLibraryProperties.Build_from_text_stub, true)
}
// Creates the xml file that publicizes the runtime library
@@ -2390,16 +2350,10 @@ func (module *SdkLibrary) CreateInternalModules(mctx android.DefaultableHookCont
module.createStubsLibrary(mctx, scope)
module.createExportableStubsLibrary(mctx, scope)
alternativeFullApiSurfaceStubLib := ""
if scope == apiScopePublic {
alternativeFullApiSurfaceStubLib = module.alternativeFullApiSurfaceStubLib()
if mctx.Config().BuildFromTextStub() && module.ModuleBuildFromTextStubs() {
module.createApiLibrary(mctx, scope)
}
contributesToApiSurface := module.contributesToApiSurface(mctx.Config()) || alternativeFullApiSurfaceStubLib != ""
if contributesToApiSurface {
module.createApiLibrary(mctx, scope, alternativeFullApiSurfaceStubLib)
}
module.createTopLevelStubsLibrary(mctx, scope, contributesToApiSurface)
module.createTopLevelStubsLibrary(mctx, scope)
module.createTopLevelExportableStubsLibrary(mctx, scope)
}