diff options
Diffstat (limited to 'java')
| -rw-r--r-- | java/Android.bp | 1 | ||||
| -rw-r--r-- | java/core-libraries/Android.bp | 57 | ||||
| -rw-r--r-- | java/prebuilt_apis.go | 21 | ||||
| -rw-r--r-- | java/prebuilt_apis_test.go | 52 | ||||
| -rw-r--r-- | java/robolectric.go | 12 | ||||
| -rw-r--r-- | java/sdk.go | 9 | ||||
| -rw-r--r-- | java/testing.go | 24 |
7 files changed, 131 insertions, 45 deletions
diff --git a/java/Android.bp b/java/Android.bp index 78d0cc1a9..8835b4456 100644 --- a/java/Android.bp +++ b/java/Android.bp @@ -93,6 +93,7 @@ bootstrap_go_package { "platform_bootclasspath_test.go", "platform_compat_config_test.go", "plugin_test.go", + "prebuilt_apis_test.go", "rro_test.go", "sdk_test.go", "sdk_library_test.go", diff --git a/java/core-libraries/Android.bp b/java/core-libraries/Android.bp index b198c2456..2eafe9dc6 100644 --- a/java/core-libraries/Android.bp +++ b/java/core-libraries/Android.bp @@ -28,6 +28,11 @@ package { default_applicable_licenses: ["Android-Apache-2.0"], } +dist_targets = [ + "sdk", + "win_sdk", +] + java_library { name: "core.current.stubs", visibility: ["//visibility:public"], @@ -40,15 +45,16 @@ java_library { system_modules: "none", dist: { - targets: [ - "sdk", - "win_sdk", - ], + targets: dist_targets, }, } // Distributed with the SDK for turning into system modules to compile apps // against. +// +// Also, produces dist files that are used by the +// prebuilts/sdk/update_prebuilts.py script to update the prebuilts/sdk +// directory. java_library { name: "core-current-stubs-for-system-modules", visibility: ["//development/sdk"], @@ -65,13 +71,17 @@ java_library { ], sdk_version: "none", system_modules: "none", - dist: { - dest: "core-for-system-modules.jar", - targets: [ - "sdk", - "win_sdk", - ], - }, + dists: [ + { + // Legacy dist location for the public file. + dest: "core-for-system-modules.jar", + targets: dist_targets, + }, + { + dest: "system-modules/public/core-for-system-modules.jar", + targets: dist_targets, + }, + ], } // Used when compiling higher-level code against core.current.stubs. @@ -103,10 +113,13 @@ java_library { visibility: ["//visibility:private"], } -// Used when compiling higher-level code with sdk_version "module_current" -java_system_modules { - name: "core-module-lib-stubs-system-modules", - libs: [ +// Produces a dist file that is used by the +// prebuilts/sdk/update_prebuilts.py script to update the prebuilts/sdk +// directory. +java_library { + name: "core-module-lib-stubs-for-system-modules", + visibility: ["//visibility:private"], + static_libs: [ "core.module_lib.stubs", // This one is not on device but it's needed when javac compiles code // containing lambdas. @@ -117,6 +130,20 @@ java_system_modules { // See http://b/123891440. "core-generated-annotation-stubs", ], + sdk_version: "none", + system_modules: "none", + dist: { + dest: "system-modules/module-lib/core-for-system-modules.jar", + targets: dist_targets, + }, +} + +// Used when compiling higher-level code with sdk_version "module_current" +java_system_modules { + name: "core-module-lib-stubs-system-modules", + libs: [ + "core-module-lib-stubs-for-system-modules", + ], visibility: ["//visibility:public"], } diff --git a/java/prebuilt_apis.go b/java/prebuilt_apis.go index c33e6c229..c67e2bd59 100644 --- a/java/prebuilt_apis.go +++ b/java/prebuilt_apis.go @@ -167,30 +167,24 @@ func prebuiltSdkStubs(mctx android.LoadHookContext, p *prebuiltApis) { localPath := strings.TrimPrefix(f, mydir) module, apiver, scope := parseJarPath(localPath) createImport(mctx, module, scope, apiver, localPath, sdkVersion, compileDex) + + if module == "core-for-system-modules" { + createSystemModules(mctx, apiver, scope) + } } } -func createSystemModules(mctx android.LoadHookContext, apiver string) { +func createSystemModules(mctx android.LoadHookContext, apiver string, scope string) { props := struct { Name *string Libs []string }{} - props.Name = proptools.StringPtr(prebuiltApiModuleName(mctx, "system_modules", "public", apiver)) - props.Libs = append(props.Libs, prebuiltApiModuleName(mctx, "core-for-system-modules", "public", apiver)) + props.Name = proptools.StringPtr(prebuiltApiModuleName(mctx, "system_modules", scope, apiver)) + props.Libs = append(props.Libs, prebuiltApiModuleName(mctx, "core-for-system-modules", scope, apiver)) mctx.CreateModule(systemModulesImportFactory, &props) } -func prebuiltSdkSystemModules(mctx android.LoadHookContext, p *prebuiltApis) { - for _, apiver := range p.properties.Api_dirs { - jar := android.ExistentPathForSource(mctx, - mctx.ModuleDir(), apiver, "public", "core-for-system-modules.jar") - if jar.Valid() { - createSystemModules(mctx, apiver) - } - } -} - func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) { mydir := mctx.ModuleDir() + "/" // <apiver>/<scope>/api/<module>.txt @@ -273,7 +267,6 @@ func createPrebuiltApiModules(mctx android.LoadHookContext) { if p, ok := mctx.Module().(*prebuiltApis); ok { prebuiltApiFiles(mctx, p) prebuiltSdkStubs(mctx, p) - prebuiltSdkSystemModules(mctx, p) } } diff --git a/java/prebuilt_apis_test.go b/java/prebuilt_apis_test.go new file mode 100644 index 000000000..7c2e52600 --- /dev/null +++ b/java/prebuilt_apis_test.go @@ -0,0 +1,52 @@ +// Copyright 2021 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package java + +import ( + "sort" + "strings" + "testing" + + "android/soong/android" + "github.com/google/blueprint" +) + +func TestPrebuiltApis_SystemModulesCreation(t *testing.T) { + result := android.GroupFixturePreparers( + prepareForJavaTest, + FixtureWithPrebuiltApis(map[string][]string{ + "31": {}, + "current": {}, + }), + ).RunTest(t) + + sdkSystemModules := []string{} + result.VisitAllModules(func(module blueprint.Module) { + name := android.RemoveOptionalPrebuiltPrefix(module.Name()) + if strings.HasPrefix(name, "sdk_") && strings.HasSuffix(name, "_system_modules") { + sdkSystemModules = append(sdkSystemModules, name) + } + }) + sort.Strings(sdkSystemModules) + expected := []string{ + // 31 only has public system modules. + "sdk_public_31_system_modules", + + // current only has public system modules. + "sdk_public_current_system_modules", + } + sort.Strings(expected) + android.AssertArrayString(t, "sdk system modules", expected, sdkSystemModules) +} diff --git a/java/robolectric.go b/java/robolectric.go index a3603adf8..16af546ba 100644 --- a/java/robolectric.go +++ b/java/robolectric.go @@ -212,13 +212,7 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) installDeps = append(installDeps, installedData) } - installed := ctx.InstallFile(installPath, ctx.ModuleName()+".jar", r.combinedJar, installDeps...) - - if r.ExportedToMake() { - // Soong handles installation here, but Make is usually what creates the phony rule that atest - // uses to build the module. Create it here for now. - ctx.Phony(ctx.ModuleName(), installed) - } + r.installFile = ctx.InstallFile(installPath, ctx.ModuleName()+".jar", r.combinedJar, installDeps...) } func generateRoboTestConfig(ctx android.ModuleContext, outputFile android.WritablePath, @@ -282,6 +276,10 @@ func (r *robolectricTest) generateRoboSrcJar(ctx android.ModuleContext, outputFi func (r *robolectricTest) AndroidMkEntries() []android.AndroidMkEntries { entriesList := r.Library.AndroidMkEntries() entries := &entriesList[0] + entries.ExtraEntries = append(entries.ExtraEntries, + func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { + entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) + }) entries.ExtraFooters = []android.AndroidMkExtraFootersFunc{ func(w io.Writer, name, prefix, moduleDir string) { diff --git a/java/sdk.go b/java/sdk.go index 3c6b23463..42ed14f74 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -60,6 +60,12 @@ func defaultJavaLanguageVersion(ctx android.EarlyModuleContext, s android.SdkSpe } } +// systemModuleKind returns the kind of system modules to use. +func systemModuleKind() android.SdkKind { + // Currently, every sdk version uses the system modules for the public API. + return android.SdkPublic +} + func decodeSdkDep(ctx android.EarlyModuleContext, sdkContext android.SdkContext) sdkDep { sdkVersion := sdkContext.SdkVersion(ctx) if !sdkVersion.Valid() { @@ -105,7 +111,8 @@ func decodeSdkDep(ctx android.EarlyModuleContext, sdkContext android.SdkContext) var systemModules string if defaultJavaLanguageVersion(ctx, sdkVersion).usesJavaModules() { - systemModules = "sdk_public_" + sdkVersion.ApiLevel.String() + "_system_modules" + systemModuleKind := systemModuleKind() + systemModules = fmt.Sprintf("sdk_%s_%s_system_modules", systemModuleKind, sdkVersion.ApiLevel) } return sdkDep{ diff --git a/java/testing.go b/java/testing.go index 0a6a4fabb..fafc8d760 100644 --- a/java/testing.go +++ b/java/testing.go @@ -159,8 +159,7 @@ func FixtureWithPrebuiltApis(release2Modules map[string][]string) android.Fixtur `, strings.Join(android.SortedStringKeys(release2Modules), `", "`)) for release, modules := range release2Modules { - libs := append([]string{"android", "core-for-system-modules"}, modules...) - mockFS.Merge(prebuiltApisFilesForLibs([]string{release}, libs)) + mockFS.Merge(prebuiltApisFilesForModules([]string{release}, modules)) } return android.GroupFixturePreparers( android.FixtureAddTextFile(path, bp), @@ -168,16 +167,25 @@ func FixtureWithPrebuiltApis(release2Modules map[string][]string) android.Fixtur ) } -func prebuiltApisFilesForLibs(apiLevels []string, sdkLibs []string) map[string][]byte { +func prebuiltApisFilesForModules(apiLevels []string, modules []string) map[string][]byte { + libs := append([]string{"android"}, modules...) + fs := make(map[string][]byte) for _, level := range apiLevels { - for _, lib := range sdkLibs { - for _, scope := range []string{"public", "system", "module-lib", "system-server", "test"} { - fs[fmt.Sprintf("prebuilts/sdk/%s/%s/%s.jar", level, scope, lib)] = nil + for _, sdkKind := range []android.SdkKind{android.SdkPublic, android.SdkSystem, android.SdkModule, android.SdkSystemServer, android.SdkTest} { + // A core-for-system-modules file must only be created for the sdk kind that supports it. + if sdkKind == systemModuleKind() { + fs[fmt.Sprintf("prebuilts/sdk/%s/%s/core-for-system-modules.jar", level, sdkKind)] = nil + } + + for _, lib := range libs { + // Create a jar file for every library. + fs[fmt.Sprintf("prebuilts/sdk/%s/%s/%s.jar", level, sdkKind, lib)] = nil + // No finalized API files for "current" if level != "current" { - fs[fmt.Sprintf("prebuilts/sdk/%s/%s/api/%s.txt", level, scope, lib)] = nil - fs[fmt.Sprintf("prebuilts/sdk/%s/%s/api/%s-removed.txt", level, scope, lib)] = nil + fs[fmt.Sprintf("prebuilts/sdk/%s/%s/api/%s.txt", level, sdkKind, lib)] = nil + fs[fmt.Sprintf("prebuilts/sdk/%s/%s/api/%s-removed.txt", level, sdkKind, lib)] = nil } } } |