From 50061511d4fec57a59059b4745e2cc7247aa10fe Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Tue, 21 Jan 2020 16:31:05 +0000 Subject: [PATCH] java_sdk_library - Use prebuilt/prefer for unbundled app builds Previously, the java_sdk_library had special support for disabling the stubs library when the build was configured to use prebuilts for sdks, e.g. in an unbundled app build. That caused the prebuilt version of the stubs library to be used instead. The disabling was done irrespective of whether a prebuilt was available which prevents java_sdk_library from being used in situations when prebuilts are not available, e.g. when they have not been created yet. This change moves the logic into tha java_sdk_library_import and leverages the existing prebuilt/prefer mechanism to ensure that the prebuilt version is used when required. * Adds a ForcePrefer() method to Prebuilt to allow a module to forcibly set the value of the prefer property. * Sets prefer true on the java_sdk_library_import and the stubs modules it creates when the prebuilt version should be used. * Refactors PrebuiltJars for use by both java_sdk_library and java_sdk_library_import as they both need to provide access to prebuilts for previously released versions of the library. * Removes disabling logic from java_sdk_library. This will probably require some additional java_sdk_library_import modules to be added to prebuilts/sdk/current/Android.bp. Bug: 148080325 Test: m droid && TARGET_BUILD_APPS=Camera2 m Change-Id: I0b5f751e82a2179a967ae64ca03dc9b9e7665c16 --- android/prebuilt.go | 4 ++++ java/sdk_library.go | 41 ++++++++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/android/prebuilt.go b/android/prebuilt.go index c780cb24f..2d16f65d7 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -62,6 +62,10 @@ func (p *Prebuilt) Name(name string) string { return "prebuilt_" + name } +func (p *Prebuilt) ForcePrefer() { + p.properties.Prefer = proptools.BoolPtr(true) +} + // The below source-related functions and the srcs, src fields are based on an assumption that // prebuilt modules have a static source property at the moment. Currently there is only one // exception, android_app_import, which chooses a source file depending on the product's DPI diff --git a/java/sdk_library.go b/java/sdk_library.go index fb8ae95de..94c2d13a9 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -265,13 +265,11 @@ func (module *SdkLibrary) getActiveApiScopes() apiScopes { } func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { - useBuiltStubs := !ctx.Config().UnbundledBuildUsePrebuiltSdks() for _, apiScope := range module.getActiveApiScopes() { // Add dependencies to the stubs library - if useBuiltStubs { - ctx.AddVariationDependencies(nil, apiScope.stubsTag, module.stubsName(apiScope)) - } + ctx.AddVariationDependencies(nil, apiScope.stubsTag, module.stubsName(apiScope)) + // And the api file ctx.AddVariationDependencies(nil, apiScope.apiFileTag, module.docsName(apiScope)) } @@ -466,9 +464,6 @@ func (module *SdkLibrary) createStubsLibrary(mctx android.LoadHookContext, apiSc Compile_dex *bool Java_version *string Product_variables struct { - Unbundled_build struct { - Enabled *bool - } Pdk struct { Enabled *bool } @@ -487,10 +482,6 @@ func (module *SdkLibrary) createStubsLibrary(mctx android.LoadHookContext, apiSc props.System_modules = module.Library.Module.deviceProperties.System_modules props.Installable = proptools.BoolPtr(false) props.Libs = module.sdkLibraryProperties.Stub_only_libs - // Unbundled apps will use the prebult one from /prebuilts/sdk - if mctx.Config().UnbundledBuildUsePrebuiltSdks() { - props.Product_variables.Unbundled_build.Enabled = proptools.BoolPtr(false) - } props.Product_variables.Pdk.Enabled = proptools.BoolPtr(false) props.Openjdk9.Srcs = module.Library.Module.properties.Openjdk9.Srcs props.Openjdk9.Javacflags = module.Library.Module.properties.Openjdk9.Javacflags @@ -651,7 +642,7 @@ func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) { mctx.CreateModule(android.PrebuiltEtcFactory, &etcProps) } -func (module *SdkLibrary) PrebuiltJars(ctx android.BaseModuleContext, s sdkSpec) android.Paths { +func PrebuiltJars(ctx android.BaseModuleContext, baseName string, s sdkSpec) android.Paths { var ver sdkVersion var kind sdkKind if s.usePrebuilt(ctx) { @@ -665,7 +656,7 @@ func (module *SdkLibrary) PrebuiltJars(ctx android.BaseModuleContext, s sdkSpec) } dir := filepath.Join("prebuilts", "sdk", ver.String(), kind.String()) - jar := filepath.Join(dir, module.BaseModuleName()+".jar") + jar := filepath.Join(dir, baseName+".jar") jarPath := android.ExistentPathForSource(ctx, jar) if !jarPath.Valid() { if ctx.Config().AllowMissingDependencies() { @@ -683,10 +674,9 @@ func (module *SdkLibrary) sdkJars( sdkVersion sdkSpec, headerJars bool) android.Paths { - // If a specific numeric version has been requested or the build is explicitly configured - // for it then use prebuilt versions of the sdk. - if sdkVersion.version.isNumbered() || ctx.Config().UnbundledBuildUsePrebuiltSdks() { - return module.PrebuiltJars(ctx, sdkVersion) + // If a specific numeric version has been requested then use prebuilt versions of the sdk. + if sdkVersion.version.isNumbered() { + return PrebuiltJars(ctx, module.BaseModuleName(), sdkVersion) } else { if !sdkVersion.specified() { if headerJars { @@ -899,6 +889,11 @@ func (module *sdkLibraryImport) Name() string { func (module *sdkLibraryImport) createInternalModules(mctx android.LoadHookContext) { + // If the build is configured to use prebuilts then force this to be preferred. + if mctx.Config().UnbundledBuildUsePrebuiltSdks() { + module.prebuilt.ForcePrefer() + } + for apiScope, scopeProperties := range module.scopeProperties() { if len(scopeProperties.Jars) == 0 { continue @@ -914,6 +909,7 @@ func (module *sdkLibraryImport) createInternalModules(mctx android.LoadHookConte Sdk_version *string Libs []string Jars []string + Prefer *bool }{} props.Name = proptools.StringPtr(apiScope.stubsModuleName(module.BaseModuleName())) @@ -933,6 +929,12 @@ func (module *sdkLibraryImport) createInternalModules(mctx android.LoadHookConte props.System_ext_specific = proptools.BoolPtr(true) } + // If the build should use prebuilt sdks then set prefer to true on the stubs library. + // That will cause the prebuilt version of the stubs to override the source version. + if mctx.Config().UnbundledBuildUsePrebuiltSdks() { + props.Prefer = proptools.BoolPtr(true) + } + mctx.CreateModule(ImportFactory, &props) } @@ -980,6 +982,11 @@ func (module *sdkLibraryImport) sdkJars( ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths { + // If a specific numeric version has been requested then use prebuilt versions of the sdk. + if sdkVersion.version.isNumbered() { + return PrebuiltJars(ctx, module.BaseModuleName(), sdkVersion) + } + var apiScope *apiScope switch sdkVersion.kind { case sdkSystem: