Merge "Change mixed soong/bazel builds to use USE_BAZEL_ANALYSIS"
diff --git a/android/config.go b/android/config.go
index 1f70fea..dbae7f7 100644
--- a/android/config.go
+++ b/android/config.go
@@ -1361,14 +1361,31 @@
return IndexList(jar, l.jars)
}
+func copyAndAppend(list []string, item string) []string {
+ // Create the result list to be 1 longer than the input.
+ result := make([]string, len(list)+1)
+
+ // Copy the whole input list into the result.
+ count := copy(result, list)
+
+ // Insert the extra item at the end.
+ result[count] = item
+
+ return result
+}
+
// Append an (apex, jar) pair to the list.
-func (l *ConfiguredJarList) Append(apex string, jar string) {
- l.apexes = append(l.apexes, apex)
- l.jars = append(l.jars, jar)
+func (l *ConfiguredJarList) Append(apex string, jar string) ConfiguredJarList {
+ // Create a copy of the backing arrays before appending to avoid sharing backing
+ // arrays that are mutated across instances.
+ apexes := copyAndAppend(l.apexes, apex)
+ jars := copyAndAppend(l.jars, jar)
+
+ return ConfiguredJarList{apexes, jars}
}
// Filter out sublist.
-func (l *ConfiguredJarList) RemoveList(list ConfiguredJarList) {
+func (l *ConfiguredJarList) RemoveList(list ConfiguredJarList) ConfiguredJarList {
apexes := make([]string, 0, l.Len())
jars := make([]string, 0, l.Len())
@@ -1380,13 +1397,7 @@
}
}
- l.apexes = apexes
- l.jars = jars
-}
-
-// A copy of itself.
-func (l *ConfiguredJarList) CopyOf() ConfiguredJarList {
- return ConfiguredJarList{CopyOf(l.apexes), CopyOf(l.jars)}
+ return ConfiguredJarList{apexes, jars}
}
// A copy of the list of strings containing jar components.
@@ -1469,6 +1480,14 @@
return paths
}
+func (l *ConfiguredJarList) String() string {
+ var pairs []string
+ for i := 0; i < l.Len(); i++ {
+ pairs = append(pairs, l.apexes[i]+":"+l.jars[i])
+ }
+ return strings.Join(pairs, ",")
+}
+
func splitListOfPairsIntoPairOfLists(list []string) ([]string, []string, error) {
// Now we need to populate this list by splitting each item in the slice of
// pairs and appending them to the appropriate list of apexes or jars.
diff --git a/android/config_test.go b/android/config_test.go
index 274d59f..68f68a0 100644
--- a/android/config_test.go
+++ b/android/config_test.go
@@ -91,3 +91,49 @@
t.Errorf("Expected false")
}
}
+
+func assertStringEquals(t *testing.T, expected, actual string) {
+ if actual != expected {
+ t.Errorf("expected %q found %q", expected, actual)
+ }
+}
+
+func TestConfiguredJarList(t *testing.T) {
+ list1 := CreateTestConfiguredJarList([]string{"apex1:jarA"})
+
+ t.Run("create", func(t *testing.T) {
+ assertStringEquals(t, "apex1:jarA", list1.String())
+ })
+
+ list2 := list1.Append("apex2", "jarB")
+ t.Run("append", func(t *testing.T) {
+ assertStringEquals(t, "apex1:jarA,apex2:jarB", list2.String())
+ })
+
+ t.Run("append does not modify", func(t *testing.T) {
+ assertStringEquals(t, "apex1:jarA", list1.String())
+ })
+
+ // Make sure that two lists created by appending to the same list do not share storage.
+ list3 := list1.Append("apex3", "jarC")
+ t.Run("append does not share", func(t *testing.T) {
+ assertStringEquals(t, "apex1:jarA,apex2:jarB", list2.String())
+ assertStringEquals(t, "apex1:jarA,apex3:jarC", list3.String())
+ })
+
+ list4 := list3.RemoveList(list1)
+ t.Run("remove", func(t *testing.T) {
+ assertStringEquals(t, "apex3:jarC", list4.String())
+ })
+
+ t.Run("remove does not modify", func(t *testing.T) {
+ assertStringEquals(t, "apex1:jarA,apex3:jarC", list3.String())
+ })
+
+ // Make sure that two lists created by removing from the same list do not share storage.
+ list5 := list3.RemoveList(CreateTestConfiguredJarList([]string{"apex3:jarC"}))
+ t.Run("remove", func(t *testing.T) {
+ assertStringEquals(t, "apex3:jarC", list4.String())
+ assertStringEquals(t, "apex1:jarA", list5.String())
+ })
+}
diff --git a/apex/allowed_deps.txt b/apex/allowed_deps.txt
index c7223c4..b3cf8d5 100644
--- a/apex/allowed_deps.txt
+++ b/apex/allowed_deps.txt
@@ -419,7 +419,9 @@
ndk_crtend_so.21(minSdkVersion:(no version))
ndk_crtend_so.27(minSdkVersion:(no version))
ndk_libc++_static(minSdkVersion:(no version))
+ndk_libc++_static(minSdkVersion:16)
ndk_libc++abi(minSdkVersion:(no version))
+ndk_libc++abi(minSdkVersion:16)
net-utils-framework-common(minSdkVersion:current)
netd_aidl_interface-unstable-java(minSdkVersion:29)
netd_event_listener_interface-ndk_platform(minSdkVersion:29)
diff --git a/build_test.bash b/build_test.bash
index ee979e7..a53a585 100755
--- a/build_test.bash
+++ b/build_test.bash
@@ -43,5 +43,16 @@
;;
esac
+function bazel_cleanup {
+ "${TOP}/tools/bazel" shutdown
+}
+trap bazel_cleanup EXIT
+
+echo
+echo "Running Bazel smoke test..."
+"${TOP}/tools/bazel" info
+
+echo
+echo "Running Soong test..."
soong_build_go multiproduct_kati android/soong/cmd/multiproduct_kati
exec "$(getoutdir)/multiproduct_kati" "$@"
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 91eb886..38269cb 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -487,9 +487,21 @@
entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) {
c.libraryDecorator.androidMkWriteExportedFlags(entries)
+ // Specifying stem is to pass check_elf_files when vendor modules link against vndk prebuilt.
+ // We can't use install path because VNDKs are not installed. Instead, Srcs is directly used.
+ _, file := filepath.Split(c.properties.Srcs[0])
+ stem, suffix, ext := android.SplitFileExt(file)
+ entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext)
+ entries.SetString("LOCAL_MODULE_SUFFIX", suffix)
+ entries.SetString("LOCAL_MODULE_STEM", stem)
+
if c.tocFile.Valid() {
entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String())
}
+
+ // VNDK libraries available to vendor are not installed because
+ // they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go)
+ entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
})
}
diff --git a/cc/linker.go b/cc/linker.go
index 12c8b2c..7cbb9d6 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -259,12 +259,12 @@
}
if ctx.inRamdisk() {
- deps.SharedLibs = removeListFromList(deps.SharedLibs, linker.Properties.Target.Recovery.Exclude_shared_libs)
- deps.ReexportSharedLibHeaders = removeListFromList(deps.ReexportSharedLibHeaders, linker.Properties.Target.Recovery.Exclude_shared_libs)
- deps.StaticLibs = append(deps.StaticLibs, linker.Properties.Target.Recovery.Static_libs...)
- deps.StaticLibs = removeListFromList(deps.StaticLibs, linker.Properties.Target.Recovery.Exclude_static_libs)
- deps.ReexportStaticLibHeaders = removeListFromList(deps.ReexportStaticLibHeaders, linker.Properties.Target.Recovery.Exclude_static_libs)
- deps.WholeStaticLibs = removeListFromList(deps.WholeStaticLibs, linker.Properties.Target.Recovery.Exclude_static_libs)
+ deps.SharedLibs = removeListFromList(deps.SharedLibs, linker.Properties.Target.Ramdisk.Exclude_shared_libs)
+ deps.ReexportSharedLibHeaders = removeListFromList(deps.ReexportSharedLibHeaders, linker.Properties.Target.Ramdisk.Exclude_shared_libs)
+ deps.StaticLibs = append(deps.StaticLibs, linker.Properties.Target.Ramdisk.Static_libs...)
+ deps.StaticLibs = removeListFromList(deps.StaticLibs, linker.Properties.Target.Ramdisk.Exclude_static_libs)
+ deps.ReexportStaticLibHeaders = removeListFromList(deps.ReexportStaticLibHeaders, linker.Properties.Target.Ramdisk.Exclude_static_libs)
+ deps.WholeStaticLibs = removeListFromList(deps.WholeStaticLibs, linker.Properties.Target.Ramdisk.Exclude_static_libs)
}
if !ctx.useSdk() {
diff --git a/cc/vndk_prebuilt.go b/cc/vndk_prebuilt.go
index 82a7732..dddd5ac 100644
--- a/cc/vndk_prebuilt.go
+++ b/cc/vndk_prebuilt.go
@@ -232,6 +232,14 @@
&prebuilt.properties,
)
+ android.AddLoadHook(module, func(ctx android.LoadHookContext) {
+ // empty BOARD_VNDK_VERSION implies that the device won't support
+ // system only OTA. In this case, VNDK snapshots aren't needed.
+ if ctx.DeviceConfig().VndkVersion() == "" {
+ ctx.Module().Disable()
+ }
+ })
+
return module
}
diff --git a/dexpreopt/config.go b/dexpreopt/config.go
index 7d8fbbc..2052847 100644
--- a/dexpreopt/config.go
+++ b/dexpreopt/config.go
@@ -100,20 +100,30 @@
ConstructContext android.Path
}
-// These libs are added as optional dependencies (<uses-library> with android:required set to false).
-// This is because they haven't existed prior to certain SDK version, but classes in them were in
-// bootclasspath jars, etc. So making them hard dependencies (android:required=true) would prevent
-// apps from being installed to such legacy devices.
-var OptionalCompatUsesLibs = []string{
- "org.apache.http.legacy",
- "android.test.base",
- "android.test.mock",
-}
+// These libs are added as <uses-library> dependencies for apps if the targetSdkVersion in the
+// app manifest is less than the specified version. This is needed because these libraries haven't
+// existed prior to certain SDK version, but classes in them were in bootclasspath jars, etc.
+// Some of the compatibility libraries are optional (their <uses-library> tag has "required=false"),
+// so that if this library is missing this in not a build or run-time error.
+var OrgApacheHttpLegacy = "org.apache.http.legacy"
+var AndroidTestBase = "android.test.base"
+var AndroidTestMock = "android.test.mock"
+var AndroidHidlBase = "android.hidl.base-V1.0-java"
+var AndroidHidlManager = "android.hidl.manager-V1.0-java"
-var CompatUsesLibs = []string{
- "android.hidl.base-V1.0-java",
- "android.hidl.manager-V1.0-java",
+var OptionalCompatUsesLibs28 = []string{
+ OrgApacheHttpLegacy,
}
+var OptionalCompatUsesLibs30 = []string{
+ AndroidTestBase,
+ AndroidTestMock,
+}
+var CompatUsesLibs29 = []string{
+ AndroidHidlBase,
+ AndroidHidlManager,
+}
+var OptionalCompatUsesLibs = append(android.CopyOf(OptionalCompatUsesLibs28), OptionalCompatUsesLibs30...)
+var CompatUsesLibs = android.CopyOf(CompatUsesLibs29)
const UnknownInstallLibraryPath = "error"
diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go
index 814b75d..903677f 100644
--- a/dexpreopt/dexpreopt.go
+++ b/dexpreopt/dexpreopt.go
@@ -195,6 +195,9 @@
}
type classLoaderContext struct {
+ // Library names
+ Names []string
+
// The class loader context using paths in the build.
Host android.Paths
@@ -209,7 +212,7 @@
// targetSdkVersion in the manifest or APK is less than that API version.
type classLoaderContextMap map[int]*classLoaderContext
-const anySdkVersion int = 9999 // should go last in class loader context
+const AnySdkVersion int = 9999 // should go last in class loader context
func (m classLoaderContextMap) getValue(sdkVer int) *classLoaderContext {
if _, ok := m[sdkVer]; !ok {
@@ -218,14 +221,19 @@
return m[sdkVer]
}
+func (clc *classLoaderContext) addLib(lib string, hostPath android.Path, targetPath string) {
+ clc.Names = append(clc.Names, lib)
+ clc.Host = append(clc.Host, hostPath)
+ clc.Target = append(clc.Target, targetPath)
+}
+
func (m classLoaderContextMap) addLibs(ctx android.PathContext, sdkVer int, module *ModuleConfig, libs ...string) bool {
clc := m.getValue(sdkVer)
for _, lib := range libs {
if p, ok := module.LibraryPaths[lib]; ok && p.Host != nil && p.Device != UnknownInstallLibraryPath {
- clc.Host = append(clc.Host, p.Host)
- clc.Target = append(clc.Target, p.Device)
+ clc.addLib(lib, p.Host, p.Device)
} else {
- if sdkVer == anySdkVersion {
+ if sdkVer == AnySdkVersion {
// Fail the build if dexpreopt doesn't know paths to one of the <uses-library>
// dependencies. In the future we may need to relax this and just disable dexpreopt.
android.ReportPathErrorf(ctx, "dexpreopt cannot find path for <uses-library> '%s'", lib)
@@ -239,11 +247,17 @@
return true
}
+func (m classLoaderContextMap) usesLibs() []string {
+ if clc, ok := m[AnySdkVersion]; ok {
+ return clc.Names
+ }
+ return nil
+}
+
func (m classLoaderContextMap) addSystemServerLibs(sdkVer int, ctx android.PathContext, module *ModuleConfig, libs ...string) {
clc := m.getValue(sdkVer)
for _, lib := range libs {
- clc.Host = append(clc.Host, SystemServerDexJarHostPath(ctx, lib))
- clc.Target = append(clc.Target, filepath.Join("/system/framework", lib+".jar"))
+ clc.addLib(lib, SystemServerDexJarHostPath(ctx, lib), filepath.Join("/system/framework", lib+".jar"))
}
}
@@ -261,7 +275,7 @@
// as the runtime classpath won't match and the dexpreopted code will be discarded. Therefore in
// such cases the function returns nil, which disables dexpreopt.
//
-// 2. All other library jars or APKs for which the exact <uses-library> list is unknown. They use
+// 3. All other library jars or APKs for which the exact <uses-library> list is unknown. They use
// the unsafe &-classpath workaround that means empty class loader context and absence of runtime
// check that the class loader context provided by the PackageManager agrees with the stored
// class loader context recorded in the .odex file.
@@ -273,21 +287,19 @@
if jarIndex := android.IndexList(module.Name, systemServerJars); jarIndex >= 0 {
// System server jars should be dexpreopted together: class loader context of each jar
// should include all preceding jars on the system server classpath.
- classLoaderContexts.addSystemServerLibs(anySdkVersion, ctx, module, systemServerJars[:jarIndex]...)
+ classLoaderContexts.addSystemServerLibs(AnySdkVersion, ctx, module, systemServerJars[:jarIndex]...)
} else if module.EnforceUsesLibraries {
// Unconditional class loader context.
usesLibs := append(copyOf(module.UsesLibraries), module.OptionalUsesLibraries...)
- if !classLoaderContexts.addLibs(ctx, anySdkVersion, module, usesLibs...) {
+ if !classLoaderContexts.addLibs(ctx, AnySdkVersion, module, usesLibs...) {
return nil
}
// Conditional class loader context for API version < 28.
const httpLegacy = "org.apache.http.legacy"
- if !contains(usesLibs, httpLegacy) {
- if !classLoaderContexts.addLibs(ctx, 28, module, httpLegacy) {
- return nil
- }
+ if !classLoaderContexts.addLibs(ctx, 28, module, httpLegacy) {
+ return nil
}
// Conditional class loader context for API version < 29.
@@ -301,10 +313,8 @@
// Conditional class loader context for API version < 30.
const testBase = "android.test.base"
- if !contains(usesLibs, testBase) {
- if !classLoaderContexts.addLibs(ctx, 30, module, testBase) {
- return nil
- }
+ if !classLoaderContexts.addLibs(ctx, 30, module, testBase) {
+ return nil
}
} else {
@@ -314,9 +324,32 @@
// to the &.
}
+ fixConditionalClassLoaderContext(classLoaderContexts)
+
return &classLoaderContexts
}
+// Now that the full unconditional context is known, reconstruct conditional context.
+// Apply filters for individual libraries, mirroring what the PackageManager does when it
+// constructs class loader context on device.
+func fixConditionalClassLoaderContext(clcMap classLoaderContextMap) {
+ usesLibs := clcMap.usesLibs()
+
+ for sdkVer, clc := range clcMap {
+ if sdkVer == AnySdkVersion {
+ continue
+ }
+ clcMap[sdkVer] = &classLoaderContext{}
+ for i, lib := range clc.Names {
+ if android.InList(lib, usesLibs) {
+ // skip compatibility libraries that are already included in unconditional context
+ } else {
+ clcMap[sdkVer].addLib(lib, clc.Host[i], clc.Target[i])
+ }
+ }
+ }
+}
+
func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, global *GlobalConfig,
module *ModuleConfig, rule *android.RuleBuilder, archIdx int, classLoaderContexts classLoaderContextMap,
profile android.WritablePath, appImage bool, generateDM bool) {
@@ -363,7 +396,7 @@
checkSystemServerOrder(ctx, jarIndex)
- clc := classLoaderContexts[anySdkVersion]
+ clc := classLoaderContexts[AnySdkVersion]
rule.Command().
Text("class_loader_context_arg=--class-loader-context=PCL[" + strings.Join(clc.Host.Strings(), ":") + "]").
Implicits(clc.Host).
@@ -391,14 +424,15 @@
Text(`eval "$(`).Tool(globalSoong.ConstructContext).
Text(` --target-sdk-version ${target_sdk_version}`)
for _, ver := range android.SortedIntKeys(classLoaderContexts) {
- clc := classLoaderContexts.getValue(ver)
- verString := fmt.Sprintf("%d", ver)
- if ver == anySdkVersion {
- verString = "any" // a special keyword that means any SDK version
+ if clc := classLoaderContexts.getValue(ver); len(clc.Host) > 0 {
+ verString := fmt.Sprintf("%d", ver)
+ if ver == AnySdkVersion {
+ verString = "any" // a special keyword that means any SDK version
+ }
+ cmd.Textf(`--host-classpath-for-sdk %s %s`, verString, strings.Join(clc.Host.Strings(), ":")).
+ Implicits(clc.Host).
+ Textf(`--target-classpath-for-sdk %s %s`, verString, strings.Join(clc.Target, ":"))
}
- cmd.Textf(`--host-classpath-for-sdk %s %s`, verString, strings.Join(clc.Host.Strings(), ":")).
- Implicits(clc.Host).
- Textf(`--target-classpath-for-sdk %s %s`, verString, strings.Join(clc.Target, ":"))
}
cmd.Text(`)"`)
} else {
diff --git a/java/app_test.go b/java/app_test.go
index cec8a62..98945da 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -2766,7 +2766,7 @@
name: "prebuilt",
apk: "prebuilts/apk/app.apk",
certificate: "platform",
- uses_libs: ["foo"],
+ uses_libs: ["foo", "android.test.runner"],
optional_uses_libs: [
"bar",
"baz",
@@ -2804,7 +2804,7 @@
cmd = prebuilt.Rule("verify_uses_libraries").RuleParams.Command
- if w := `uses_library_names="foo"`; !strings.Contains(cmd, w) {
+ if w := `uses_library_names="foo android.test.runner"`; !strings.Contains(cmd, w) {
t.Errorf("wanted %q in %q", w, cmd)
}
@@ -2812,20 +2812,48 @@
t.Errorf("wanted %q in %q", w, cmd)
}
- // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
+ // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs.
cmd = app.Rule("dexpreopt").RuleParams.Command
w := `--target-classpath-for-sdk any` +
` /system/framework/foo.jar` +
`:/system/framework/quuz.jar` +
`:/system/framework/qux.jar` +
`:/system/framework/runtime-library.jar` +
- `:/system/framework/bar.jar`
+ `:/system/framework/bar.jar `
if !strings.Contains(cmd, w) {
t.Errorf("wanted %q in %q", w, cmd)
}
+ // Test conditional context for target SDK version 28.
+ if w := `--target-classpath-for-sdk 28` +
+ ` /system/framework/org.apache.http.legacy.jar `; !strings.Contains(cmd, w) {
+ t.Errorf("wanted %q in %q", w, cmd)
+ }
+
+ // Test conditional context for target SDK version 29.
+ if w := `--target-classpath-for-sdk 29` +
+ ` /system/framework/android.hidl.base-V1.0-java.jar` +
+ `:/system/framework/android.hidl.manager-V1.0-java.jar `; !strings.Contains(cmd, w) {
+ t.Errorf("wanted %q in %q", w, cmd)
+ }
+
+ // Test conditional context for target SDK version 30.
+ if w := `--target-classpath-for-sdk 30` +
+ ` /system/framework/android.test.base.jar `; !strings.Contains(cmd, w) {
+ t.Errorf("wanted %q in %q", w, cmd)
+ }
+
cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
- if w := `--target-classpath-for-sdk any /system/framework/foo.jar:/system/framework/bar.jar`; !strings.Contains(cmd, w) {
+ if w := `--target-classpath-for-sdk any` +
+ ` /system/framework/foo.jar` +
+ `:/system/framework/android.test.runner.jar` +
+ `:/system/framework/bar.jar `; !strings.Contains(cmd, w) {
+ t.Errorf("wanted %q in %q", w, cmd)
+ }
+
+ // Test conditional context for target SDK version 30.
+ if w := `--target-classpath-for-sdk 30` +
+ ` /system/framework/android.test.base.jar `; !strings.Contains(cmd, w) {
t.Errorf("wanted %q in %q", w, cmd)
}
}
diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go
index 0f8888a..c315124 100644
--- a/java/dexpreopt_config.go
+++ b/java/dexpreopt_config.go
@@ -81,13 +81,12 @@
targets := dexpreoptTargets(ctx)
deviceDir := android.PathForOutput(ctx, ctx.Config().DeviceName())
- artModules := global.ArtApexJars.CopyOf()
+ artModules := global.ArtApexJars
// With EMMA_INSTRUMENT_FRAMEWORK=true the Core libraries depend on jacoco.
if ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") {
- artModules.Append("com.android.art", "jacocoagent")
+ artModules = artModules.Append("com.android.art", "jacocoagent")
}
- frameworkModules := global.BootJars.CopyOf()
- frameworkModules.RemoveList(artModules)
+ frameworkModules := global.BootJars.RemoveList(artModules)
artSubdir := "apex/art_boot_images/javalib"
frameworkSubdir := "system/framework"
diff --git a/java/testing.go b/java/testing.go
index 461fd3f..ab13121 100644
--- a/java/testing.go
+++ b/java/testing.go
@@ -22,6 +22,7 @@
"android/soong/android"
"android/soong/cc"
+ "android/soong/dexpreopt"
"android/soong/python"
"github.com/google/blueprint"
@@ -152,6 +153,24 @@
`, extra)
}
+ // For class loader context and <uses-library> tests.
+ dexpreoptModules := []string{"android.test.runner"}
+ dexpreoptModules = append(dexpreoptModules, dexpreopt.CompatUsesLibs...)
+ dexpreoptModules = append(dexpreoptModules, dexpreopt.OptionalCompatUsesLibs...)
+
+ for _, extra := range dexpreoptModules {
+ bp += fmt.Sprintf(`
+ java_library {
+ name: "%s",
+ srcs: ["a.java"],
+ sdk_version: "none",
+ system_modules: "stable-core-platform-api-stubs-system-modules",
+ compile_dex: true,
+ installable: true,
+ }
+ `, extra)
+ }
+
bp += `
java_library {
name: "framework",
@@ -166,48 +185,7 @@
android_app {
name: "framework-res",
sdk_version: "core_platform",
- }
-
- java_library {
- name: "android.hidl.base-V1.0-java",
- srcs: ["a.java"],
- sdk_version: "none",
- system_modules: "stable-core-platform-api-stubs-system-modules",
- installable: true,
- }
-
- java_library {
- name: "android.hidl.manager-V1.0-java",
- srcs: ["a.java"],
- sdk_version: "none",
- system_modules: "stable-core-platform-api-stubs-system-modules",
- installable: true,
- }
-
- java_library {
- name: "org.apache.http.legacy",
- srcs: ["a.java"],
- sdk_version: "none",
- system_modules: "stable-core-platform-api-stubs-system-modules",
- installable: true,
- }
-
- java_library {
- name: "android.test.base",
- srcs: ["a.java"],
- sdk_version: "none",
- system_modules: "stable-core-platform-api-stubs-system-modules",
- installable: true,
- }
-
- java_library {
- name: "android.test.mock",
- srcs: ["a.java"],
- sdk_version: "none",
- system_modules: "stable-core-platform-api-stubs-system-modules",
- installable: true,
- }
- `
+ }`
systemModules := []string{
"core-current-stubs-system-modules",