Merge "Change stdlib linkage for C libraries."
diff --git a/android/override_module.go b/android/override_module.go
index 09959e4..f946587 100644
--- a/android/override_module.go
+++ b/android/override_module.go
@@ -70,6 +70,10 @@
return &o.moduleProperties
}
+func (o *OverrideModuleBase) GetOverriddenModuleName() string {
+ return proptools.String(o.moduleProperties.Base)
+}
+
func InitOverrideModule(m OverrideModule) {
m.setOverridingProperties(m.GetProperties())
@@ -147,7 +151,7 @@
for _, p := range b.overridableProperties {
for _, op := range o.getOverridingProperties() {
if proptools.TypeEqual(p, op) {
- err := proptools.AppendProperties(p, op, nil)
+ err := proptools.ExtendProperties(p, op, nil, proptools.OrderReplace)
if err != nil {
if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
diff --git a/apex/androidmk.go b/apex/androidmk.go
index 8ebf802..dd5da97 100644
--- a/apex/androidmk.go
+++ b/apex/androidmk.go
@@ -179,6 +179,7 @@
fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", a.installDir.ToMakePath().String())
fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", name+apexType.suffix())
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !a.installable())
+ fmt.Fprintln(w, "LOCAL_OVERRIDES_MODULES :=", strings.Join(a.properties.Overrides, " "))
if len(moduleNames) > 0 {
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(moduleNames, " "))
}
diff --git a/apex/apex.go b/apex/apex.go
index c021e1d..b831333 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -64,6 +64,7 @@
android.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
android.RegisterModuleType("apex_defaults", defaultsFactory)
android.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
+ android.RegisterModuleType("override_apex", overrideApexFactory)
android.PreDepsMutators(RegisterPreDepsMutators)
android.PostDepsMutators(RegisterPostDepsMutators)
@@ -127,7 +128,15 @@
if mctx.Device() && a.installable() {
addApexFileContextsInfos(mctx, a)
}
+ } else if o, ok := mctx.Module().(*OverrideApex); ok {
+ apexBundleName := o.GetOverriddenModuleName()
+ if apexBundleName == "" {
+ mctx.ModuleErrorf("base property is not set")
+ return
+ }
+ mctx.CreateVariations(apexBundleName)
}
+
}
var (
@@ -181,6 +190,8 @@
}
}
}
+ } else if _, ok := mctx.Module().(*OverrideApex); ok {
+ mctx.CreateVariations(imageApexType, flattenedApexType)
}
}
@@ -320,9 +331,6 @@
// A txt file containing list of files that are whitelisted to be included in this APEX.
Whitelisted_files *string
- // List of APKs to package inside APEX
- Apps []string
-
// package format of this apex variant; could be non-flattened, flattened, or zip.
// imageApex, zipApex or flattened
ApexType apexPackaging `blueprint:"mutated"`
@@ -332,6 +340,13 @@
// is implied. This value affects all modules included in this APEX. In other words, they are
// also built with the SDKs specified here.
Uses_sdks []string
+
+ // Names of modules to be overridden. Listed modules can only be other binaries
+ // (in Make or Soong).
+ // This does not completely prevent installation of the overridden binaries, but if both
+ // binaries would be installed by default (in PRODUCT_PACKAGES) the other binary will be removed
+ // from PRODUCT_PACKAGES.
+ Overrides []string
}
type apexTargetBundleProperties struct {
@@ -358,6 +373,11 @@
}
}
+type overridableProperties struct {
+ // List of APKs to package inside APEX
+ Apps []string
+}
+
type apexFileClass int
const (
@@ -441,11 +461,13 @@
type apexBundle struct {
android.ModuleBase
android.DefaultableModuleBase
+ android.OverridableModuleBase
android.SdkBase
- properties apexBundleProperties
- targetProperties apexTargetBundleProperties
- vndkProperties apexVndkProperties
+ properties apexBundleProperties
+ targetProperties apexTargetBundleProperties
+ vndkProperties apexVndkProperties
+ overridableProperties overridableProperties
bundleModuleFile android.WritablePath
outputFile android.WritablePath
@@ -633,9 +655,6 @@
ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
javaLibTag, a.properties.Java_libs...)
- ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
- androidAppTag, a.properties.Apps...)
-
if String(a.properties.Key) == "" {
ctx.ModuleErrorf("key is missing")
return
@@ -658,6 +677,11 @@
}
}
+func (a *apexBundle) OverridablePropertiesDepsMutator(ctx android.BottomUpMutatorContext) {
+ ctx.AddFarVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(),
+ androidAppTag, a.overridableProperties.Apps...)
+}
+
func (a *apexBundle) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
// direct deps of an APEX bundle are all part of the APEX bundle
return true
@@ -1156,12 +1180,14 @@
module := &apexBundle{}
module.AddProperties(&module.properties)
module.AddProperties(&module.targetProperties)
+ module.AddProperties(&module.overridableProperties)
module.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, class android.OsClass) bool {
return class == android.Device && ctx.Config().DevicePrefer32BitExecutables()
})
android.InitAndroidMultiTargetsArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
android.InitDefaultableModule(module)
android.InitSdkAwareModule(module)
+ android.InitOverridableModule(module, &module.properties.Overrides)
return module
}
@@ -1206,3 +1232,26 @@
android.InitDefaultsModule(module)
return module
}
+
+//
+// OverrideApex
+//
+type OverrideApex struct {
+ android.ModuleBase
+ android.OverrideModuleBase
+}
+
+func (o *OverrideApex) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ // All the overrides happen in the base module.
+}
+
+// override_apex is used to create an apex module based on another apex module
+// by overriding some of its properties.
+func overrideApexFactory() android.Module {
+ m := &OverrideApex{}
+ m.AddProperties(&overridableProperties{})
+
+ android.InitAndroidMultiTargetsArchModule(m, android.DeviceSupported, android.MultilibCommon)
+ android.InitOverrideModule(m)
+ return m
+}
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 1aac852..f4b8e35 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -107,6 +107,7 @@
ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(ApexKeyFactory))
ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory))
+ ctx.RegisterModuleType("override_apex", android.ModuleFactoryAdaptor(overrideApexFactory))
ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
@@ -132,6 +133,7 @@
ctx.RegisterModuleType("java_system_modules", android.ModuleFactoryAdaptor(java.SystemModulesFactory))
ctx.RegisterModuleType("android_app", android.ModuleFactoryAdaptor(java.AndroidAppFactory))
ctx.RegisterModuleType("android_app_import", android.ModuleFactoryAdaptor(java.AndroidAppImportFactory))
+ ctx.RegisterModuleType("override_android_app", android.ModuleFactoryAdaptor(java.OverrideAndroidAppModuleFactory))
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
@@ -146,6 +148,7 @@
ctx.BottomUp("begin", cc.BeginMutator).Parallel()
})
ctx.PreDepsMutators(RegisterPreDepsMutators)
+ ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
ctx.PostDepsMutators(RegisterPostDepsMutators)
ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
@@ -2815,6 +2818,49 @@
ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_core_static")
}
+func TestOverrideApex(t *testing.T) {
+ ctx, _ := testApex(t, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ apps: ["app"],
+ }
+
+ override_apex {
+ name: "override_myapex",
+ base: "myapex",
+ apps: ["override_app"],
+ }
+
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+
+ android_app {
+ name: "app",
+ srcs: ["foo/bar/MyClass.java"],
+ package_name: "foo",
+ sdk_version: "none",
+ system_modules: "none",
+ }
+
+ override_android_app {
+ name: "override_app",
+ base: "app",
+ package_name: "bar",
+ }
+ `)
+
+ module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
+ apexRule := module.Rule("apexRule")
+ copyCmds := apexRule.Args["copy_commands"]
+
+ ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
+ ensureContains(t, copyCmds, "image.apex/app/app/override_app.apk")
+}
+
func TestMain(m *testing.M) {
run := func() int {
setUp()
diff --git a/cc/cc.go b/cc/cc.go
index 06617ad..aa656da 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -562,6 +562,10 @@
return false
}
+func (c *Module) NonCcVariants() bool {
+ return false
+}
+
func (c *Module) SetBuildStubs() {
if c.linker != nil {
if library, ok := c.linker.(*libraryDecorator); ok {
@@ -890,7 +894,7 @@
func isBionic(name string) bool {
switch name {
- case "libc", "libm", "libdl", "linker":
+ case "libc", "libm", "libdl", "libdl_android", "linker":
return true
}
return false
diff --git a/cc/library.go b/cc/library.go
index dde067c..b8c4b51 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -1262,13 +1262,15 @@
shared.linker.(prebuiltLibraryInterface).disablePrebuilt()
}
} else if library, ok := mctx.Module().(LinkableInterface); ok && library.CcLibraryInterface() {
- if library.BuildStaticVariant() && library.BuildSharedVariant() {
- variations := []string{"static", "shared"}
- // Non-cc.Modules need an empty variant for their mutators.
- if _, ok := mctx.Module().(*Module); !ok {
- variations = append(variations, "")
- }
+ // Non-cc.Modules may need an empty variant for their mutators.
+ variations := []string{}
+ if library.NonCcVariants() {
+ variations = append(variations, "")
+ }
+
+ if library.BuildStaticVariant() && library.BuildSharedVariant() {
+ variations := append([]string{"static", "shared"}, variations...)
modules := mctx.CreateLocalVariations(variations...)
static := modules[0].(LinkableInterface)
@@ -1281,16 +1283,18 @@
reuseStaticLibrary(mctx, static.(*Module), shared.(*Module))
}
} else if library.BuildStaticVariant() {
- modules := mctx.CreateLocalVariations("static")
+ variations := append([]string{"static"}, variations...)
+
+ modules := mctx.CreateLocalVariations(variations...)
modules[0].(LinkableInterface).SetStatic()
} else if library.BuildSharedVariant() {
- modules := mctx.CreateLocalVariations("shared")
- modules[0].(LinkableInterface).SetShared()
- } else if _, ok := mctx.Module().(*Module); !ok {
- // Non-cc.Modules need an empty variant for their mutators.
- mctx.CreateLocalVariations("")
- }
+ variations := append([]string{"shared"}, variations...)
+ modules := mctx.CreateLocalVariations(variations...)
+ modules[0].(LinkableInterface).SetShared()
+ } else if len(variations) > 0 {
+ mctx.CreateLocalVariations(variations...)
+ }
}
}
diff --git a/cc/linkable.go b/cc/linkable.go
index 2efefea..815d405 100644
--- a/cc/linkable.go
+++ b/cc/linkable.go
@@ -20,6 +20,8 @@
HasStaticVariant() bool
GetStaticVariant() LinkableInterface
+ NonCcVariants() bool
+
StubsVersions() []string
BuildStubs() bool
SetBuildStubs()
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index b75c4c8..c47cbf0 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -269,6 +269,10 @@
// (avoids the need to link an unwinder into a fake library).
"-fno-unwind-tables",
)
+ // All symbols in the stubs library should be visible.
+ if inList("-fvisibility=hidden", flags.Local.CFlags) {
+ flags.Local.CFlags = append(flags.Local.CFlags, "-fvisibility=default")
+ }
return flags
}
diff --git a/java/app.go b/java/app.go
index e1128c9..c635703 100644
--- a/java/app.go
+++ b/java/app.go
@@ -448,7 +448,7 @@
} else if a.Privileged() {
a.installDir = android.PathForModuleInstall(ctx, "priv-app", a.installApkName)
} else if ctx.InstallInTestcases() {
- a.installDir = android.PathForModuleInstall(ctx, a.installApkName)
+ a.installDir = android.PathForModuleInstall(ctx, a.installApkName, ctx.DeviceConfig().DeviceArch())
} else {
a.installDir = android.PathForModuleInstall(ctx, "app", a.installApkName)
}
@@ -697,6 +697,10 @@
appTestHelperAppProperties appTestHelperAppProperties
}
+func (a *AndroidTestHelperApp) InstallInTestcases() bool {
+ return true
+}
+
// android_test_helper_app compiles sources and Android resources into an Android application package `.apk` file that
// will be used by tests, but does not produce an `AndroidTest.xml` file so the module will not be run directly as a
// test.
diff --git a/java/app_test.go b/java/app_test.go
index 2a4c4ec..7e461bc 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -1159,7 +1159,7 @@
}{
{
variantName: "android_common",
- apkPath: "/target/product/test_device/testcases/foo_test/foo_test.apk",
+ apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
overrides: nil,
targetVariant: "android_common",
packageFlag: "",
@@ -1167,7 +1167,7 @@
},
{
variantName: "android_common_bar_test",
- apkPath: "/target/product/test_device/testcases/bar_test/bar_test.apk",
+ apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
overrides: []string{"foo_test"},
targetVariant: "android_common_bar",
packageFlag: "com.android.bar.test",
diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go
index 8379f53..c0ef444 100644
--- a/java/hiddenapi_singleton.go
+++ b/java/hiddenapi_singleton.go
@@ -241,6 +241,8 @@
android.PathForSource(ctx, "frameworks/base/config/hiddenapi-greylist.txt")).
FlagWithInput("--greylist-ignore-conflicts ",
greylistIgnoreConflicts).
+ FlagWithInput("--greylist-max-q ",
+ android.PathForSource(ctx, "frameworks/base/config/hiddenapi-greylist-max-q.txt")).
FlagWithInput("--greylist-max-p ",
android.PathForSource(ctx, "frameworks/base/config/hiddenapi-greylist-max-p.txt")).
FlagWithInput("--greylist-max-o-ignore-conflicts ",
diff --git a/rust/builder.go b/rust/builder.go
index 9109651..27eeec2 100644
--- a/rust/builder.go
+++ b/rust/builder.go
@@ -44,6 +44,8 @@
func TransformSrcToBinary(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
outputFile android.WritablePath, includeDirs []string) {
+ flags.RustFlags = append(flags.RustFlags, "-C lto")
+
transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "bin", includeDirs)
}
@@ -59,11 +61,13 @@
func TransformSrctoStatic(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
outputFile android.WritablePath, includeDirs []string) {
+ flags.RustFlags = append(flags.RustFlags, "-C lto")
transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "staticlib", includeDirs)
}
func TransformSrctoShared(ctx android.ModuleContext, mainSrc android.Path, deps PathDeps, flags Flags,
outputFile android.WritablePath, includeDirs []string) {
+ flags.RustFlags = append(flags.RustFlags, "-C lto")
transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, "cdylib", includeDirs)
}
diff --git a/rust/config/global.go b/rust/config/global.go
index 7846d21..4d87780 100644
--- a/rust/config/global.go
+++ b/rust/config/global.go
@@ -37,6 +37,9 @@
GlobalRustFlags = []string{
"--remap-path-prefix $$(pwd)=",
+ "-C codegen-units=1",
+ "-C opt-level=3",
+ "-C relocation-model=pic",
}
deviceGlobalRustFlags = []string{}
diff --git a/rust/rust.go b/rust/rust.go
index 8782f8e..096f7b6 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -89,6 +89,19 @@
return ""
}
+func (mod *Module) NonCcVariants() bool {
+ if mod.compiler != nil {
+ if library, ok := mod.compiler.(libraryInterface); ok {
+ if library.buildRlib() || library.buildDylib() {
+ return true
+ } else {
+ return false
+ }
+ }
+ }
+ panic(fmt.Errorf("NonCcVariants called on non-library module: %q", mod.BaseModuleName()))
+}
+
func (mod *Module) ApiLevel() string {
panic(fmt.Errorf("Called ApiLevel on Rust module %q; stubs libraries are not yet supported.", mod.BaseModuleName()))
}