Merge changes Ieeca3c39,Iddeea2d0,I8d66a5d3
* changes:
Add jni_libs to host java binaries
Make java_binary common variant a dependency
Replace jniDependencyTag with a value
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index d4f6e4c..b7cea4b 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -188,8 +188,8 @@
bazelCmd.Dir = context.workspaceDir
bazelCmd.Env = append(os.Environ(), "HOME="+context.homeDir, pwdPrefix())
- var stderr bytes.Buffer
- bazelCmd.Stderr = &stderr
+ stderr := &bytes.Buffer{}
+ bazelCmd.Stderr = stderr
if output, err := bazelCmd.Output(); err != nil {
return "", fmt.Errorf("bazel command failed. command: [%s], error [%s]", bazelCmd, stderr)
diff --git a/android/config.go b/android/config.go
index 345f26e..cf6d596 100644
--- a/android/config.go
+++ b/android/config.go
@@ -91,10 +91,11 @@
ConfigFileName string
ProductVariablesFileName string
- Targets map[OsType][]Target
- BuildOSTarget Target // the Target for tools run on the build machine
- BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
- AndroidCommonTarget Target // the Target for common modules for the Android device
+ Targets map[OsType][]Target
+ BuildOSTarget Target // the Target for tools run on the build machine
+ BuildOSCommonTarget Target // the Target for common (java) tools run on the build machine
+ AndroidCommonTarget Target // the Target for common modules for the Android device
+ AndroidFirstDeviceTarget Target // the first Target for modules for the Android device
// multilibConflicts for an ArchType is true if there is earlier configured device architecture with the same
// multilib value.
@@ -320,6 +321,7 @@
config.BuildOSTarget = config.Targets[BuildOs][0]
config.BuildOSCommonTarget = getCommonTargets(config.Targets[BuildOs])[0]
config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
+ config.AndroidFirstDeviceTarget = firstTarget(config.Targets[Android], "lib64", "lib32")[0]
config.TestProductVariables.DeviceArch = proptools.StringPtr("arm64")
config.TestProductVariables.DeviceArchVariant = proptools.StringPtr("armv8-a")
config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm")
@@ -429,6 +431,7 @@
config.BuildOSCommonTarget = getCommonTargets(config.Targets[BuildOs])[0]
if len(config.Targets[Android]) > 0 {
config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
+ config.AndroidFirstDeviceTarget = firstTarget(config.Targets[Android], "lib64", "lib32")[0]
}
if err := config.fromEnv(); err != nil {
@@ -938,6 +941,10 @@
return false
}
+func (c *config) EnforceRROExemptedForModule(name string) bool {
+ return InList(name, c.productVariables.EnforceRROExemptedTargets)
+}
+
func (c *config) EnforceRROExcludedOverlay(path string) bool {
excluded := c.productVariables.EnforceRROExcludedOverlays
if len(excluded) > 0 {
@@ -1138,12 +1145,12 @@
return c.config.productVariables.BoardOdmSepolicyDirs
}
-func (c *deviceConfig) PlatPublicSepolicyDirs() []string {
- return c.config.productVariables.BoardPlatPublicSepolicyDirs
+func (c *deviceConfig) SystemExtPublicSepolicyDirs() []string {
+ return c.config.productVariables.SystemExtPublicSepolicyDirs
}
-func (c *deviceConfig) PlatPrivateSepolicyDirs() []string {
- return c.config.productVariables.BoardPlatPrivateSepolicyDirs
+func (c *deviceConfig) SystemExtPrivateSepolicyDirs() []string {
+ return c.config.productVariables.SystemExtPrivateSepolicyDirs
}
func (c *deviceConfig) SepolicyM4Defs() []string {
diff --git a/android/defaults.go b/android/defaults.go
index 0892adf..eb013d7 100644
--- a/android/defaults.go
+++ b/android/defaults.go
@@ -95,6 +95,8 @@
module.setProperties(module.(Module).GetProperties(), module.(Module).base().variableProperties)
module.AddProperties(module.defaults())
+
+ module.base().customizableProperties = module.GetProperties()
}
// A restricted subset of context methods, similar to LoadHookContext.
diff --git a/android/paths_test.go b/android/paths_test.go
index d099f65..108bd6c 100644
--- a/android/paths_test.go
+++ b/android/paths_test.go
@@ -1260,7 +1260,7 @@
// boot.art boot.oat
}
-func ExampleOutputPath_FileInSameDir() {
+func ExampleOutputPath_InSameDir() {
ctx := &configErrorWrapper{
config: TestConfig("out", nil, "", nil),
}
diff --git a/android/soong_config_modules_test.go b/android/soong_config_modules_test.go
index f905b1a..9677f34 100644
--- a/android/soong_config_modules_test.go
+++ b/android/soong_config_modules_test.go
@@ -19,8 +19,24 @@
"testing"
)
+type soongConfigTestDefaultsModuleProperties struct {
+}
+
+type soongConfigTestDefaultsModule struct {
+ ModuleBase
+ DefaultsModuleBase
+}
+
+func soongConfigTestDefaultsModuleFactory() Module {
+ m := &soongConfigTestDefaultsModule{}
+ m.AddProperties(&soongConfigTestModuleProperties{})
+ InitDefaultsModule(m)
+ return m
+}
+
type soongConfigTestModule struct {
ModuleBase
+ DefaultableModuleBase
props soongConfigTestModuleProperties
}
@@ -32,6 +48,7 @@
m := &soongConfigTestModule{}
m.AddProperties(&m.props)
InitAndroidModule(m)
+ InitDefaultableModule(m)
return m
}
@@ -40,13 +57,13 @@
func TestSoongConfigModule(t *testing.T) {
configBp := `
soong_config_module_type {
- name: "acme_test_defaults",
- module_type: "test_defaults",
+ name: "acme_test",
+ module_type: "test",
config_namespace: "acme",
variables: ["board", "feature1", "FEATURE3"],
bool_variables: ["feature2"],
value_variables: ["size"],
- properties: ["cflags", "srcs"],
+ properties: ["cflags", "srcs", "defaults"],
}
soong_config_string_variable {
@@ -66,14 +83,20 @@
importBp := `
soong_config_module_type_import {
from: "SoongConfig.bp",
- module_types: ["acme_test_defaults"],
+ module_types: ["acme_test"],
}
`
bp := `
- acme_test_defaults {
+ test_defaults {
+ name: "foo_defaults",
+ cflags: ["DEFAULT"],
+ }
+
+ acme_test {
name: "foo",
cflags: ["-DGENERIC"],
+ defaults: ["foo_defaults"],
soong_config_variables: {
board: {
soc_a: {
@@ -97,6 +120,46 @@
},
},
}
+
+ test_defaults {
+ name: "foo_defaults_a",
+ cflags: ["DEFAULT_A"],
+ }
+
+ test_defaults {
+ name: "foo_defaults_b",
+ cflags: ["DEFAULT_B"],
+ }
+
+ acme_test {
+ name: "foo_with_defaults",
+ cflags: ["-DGENERIC"],
+ defaults: ["foo_defaults"],
+ soong_config_variables: {
+ board: {
+ soc_a: {
+ cflags: ["-DSOC_A"],
+ defaults: ["foo_defaults_a"],
+ },
+ soc_b: {
+ cflags: ["-DSOC_B"],
+ defaults: ["foo_defaults_b"],
+ },
+ },
+ size: {
+ cflags: ["-DSIZE=%s"],
+ },
+ feature1: {
+ cflags: ["-DFEATURE1"],
+ },
+ feature2: {
+ cflags: ["-DFEATURE2"],
+ },
+ FEATURE3: {
+ cflags: ["-DFEATURE3"],
+ },
+ },
+ }
`
run := func(t *testing.T, bp string, fs map[string][]byte) {
@@ -117,7 +180,9 @@
ctx.RegisterModuleType("soong_config_module_type", soongConfigModuleTypeFactory)
ctx.RegisterModuleType("soong_config_string_variable", soongConfigStringVariableDummyFactory)
ctx.RegisterModuleType("soong_config_bool_variable", soongConfigBoolVariableDummyFactory)
- ctx.RegisterModuleType("test_defaults", soongConfigTestModuleFactory)
+ ctx.RegisterModuleType("test_defaults", soongConfigTestDefaultsModuleFactory)
+ ctx.RegisterModuleType("test", soongConfigTestModuleFactory)
+ ctx.PreArchMutators(RegisterDefaultsPreArchMutators)
ctx.Register(config)
_, errs := ctx.ParseBlueprintsFiles("Android.bp")
@@ -125,10 +190,18 @@
_, errs = ctx.PrepareBuildActions(config)
FailIfErrored(t, errs)
+ basicCFlags := []string{"DEFAULT", "-DGENERIC", "-DSIZE=42", "-DSOC_A", "-DFEATURE1"}
+
foo := ctx.ModuleForTests("foo", "").Module().(*soongConfigTestModule)
- if g, w := foo.props.Cflags, []string{"-DGENERIC", "-DSIZE=42", "-DSOC_A", "-DFEATURE1"}; !reflect.DeepEqual(g, w) {
+ if g, w := foo.props.Cflags, basicCFlags; !reflect.DeepEqual(g, w) {
t.Errorf("wanted foo cflags %q, got %q", w, g)
}
+
+ fooDefaults := ctx.ModuleForTests("foo_with_defaults", "").Module().(*soongConfigTestModule)
+ if g, w := fooDefaults.props.Cflags, append([]string{"DEFAULT_A"}, basicCFlags...); !reflect.DeepEqual(g, w) {
+ t.Errorf("wanted foo_with_defaults cflags %q, got %q", w, g)
+ }
+
}
t.Run("single file", func(t *testing.T) {
diff --git a/android/variable.go b/android/variable.go
index ce523ed..d752aec 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -304,8 +304,8 @@
BoardVendorSepolicyDirs []string `json:",omitempty"`
BoardOdmSepolicyDirs []string `json:",omitempty"`
- BoardPlatPublicSepolicyDirs []string `json:",omitempty"`
- BoardPlatPrivateSepolicyDirs []string `json:",omitempty"`
+ SystemExtPublicSepolicyDirs []string `json:",omitempty"`
+ SystemExtPrivateSepolicyDirs []string `json:",omitempty"`
BoardSepolicyM4Defs []string `json:",omitempty"`
VendorVars map[string]map[string]string `json:",omitempty"`
diff --git a/apex/allowed_deps.txt b/apex/allowed_deps.txt
index 87e96ea..cd4b056 100644
--- a/apex/allowed_deps.txt
+++ b/apex/allowed_deps.txt
@@ -124,6 +124,7 @@
apache-commons-compress(minSdkVersion:current)
art.module.public.api.stubs(minSdkVersion:(no version))
bcm_object(minSdkVersion:29)
+bionic_libc_platform_headers(minSdkVersion:29)
boringssl_self_test(minSdkVersion:29)
bouncycastle_ike_digests(minSdkVersion:current)
brotli-java(minSdkVersion:current)
@@ -138,12 +139,19 @@
conscrypt.module.public.api.stubs(minSdkVersion:(no version))
core-lambda-stubs(minSdkVersion:(no version))
core.current.stubs(minSdkVersion:(no version))
+crtbegin_dynamic(minSdkVersion:16)
crtbegin_dynamic(minSdkVersion:apex_inherit)
+crtbegin_dynamic1(minSdkVersion:16)
crtbegin_dynamic1(minSdkVersion:apex_inherit)
+crtbegin_so(minSdkVersion:16)
crtbegin_so(minSdkVersion:apex_inherit)
+crtbegin_so1(minSdkVersion:16)
crtbegin_so1(minSdkVersion:apex_inherit)
+crtbrand(minSdkVersion:16)
crtbrand(minSdkVersion:apex_inherit)
+crtend_android(minSdkVersion:16)
crtend_android(minSdkVersion:apex_inherit)
+crtend_so(minSdkVersion:16)
crtend_so(minSdkVersion:apex_inherit)
datastallprotosnano(minSdkVersion:29)
derive_sdk(minSdkVersion:current)
@@ -186,6 +194,7 @@
libadb_pairing_connection(minSdkVersion:(no version))
libadb_pairing_server(minSdkVersion:(no version))
libadb_protos(minSdkVersion:(no version))
+libadb_sysdeps(minSdkVersion:apex_inherit)
libadb_tls_connection(minSdkVersion:(no version))
libadbconnection_client(minSdkVersion:(no version))
libadbconnection_server(minSdkVersion:(no version))
@@ -273,6 +282,7 @@
libFLAC-headers(minSdkVersion:29)
libflacextractor(minSdkVersion:29)
libfmq(minSdkVersion:29)
+libfmq-base(minSdkVersion:29)
libFraunhoferAAC(minSdkVersion:29)
libgav1(minSdkVersion:29)
libgcc_stripped(minSdkVersion:(no version))
@@ -289,6 +299,7 @@
libhidlbase(minSdkVersion:29)
libhidlmemory(minSdkVersion:29)
libhwbinder-impl-internal(minSdkVersion:29)
+libhwbinder_headers(minSdkVersion:29)
libion(minSdkVersion:29)
libjavacrypto(minSdkVersion:29)
libjsoncpp(minSdkVersion:29)
diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go
index 69e4f69..5c06251 100644
--- a/cmd/soong_ui/main.go
+++ b/cmd/soong_ui/main.go
@@ -173,6 +173,7 @@
rbeMetricsFile := filepath.Join(logsDir, c.logsPrefix+"rbe_metrics.pb")
soongMetricsFile := filepath.Join(logsDir, c.logsPrefix+"soong_metrics")
defer build.UploadMetrics(buildCtx, config, c.simpleOutput, buildStarted, buildErrorFile, rbeMetricsFile, soongMetricsFile)
+ build.PrintOutDirWarning(buildCtx, config)
os.MkdirAll(logsDir, 0777)
log.SetOutput(filepath.Join(logsDir, c.logsPrefix+"soong.log"))
diff --git a/java/aar.go b/java/aar.go
index 8d2a74a..f1f6848 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -34,10 +34,16 @@
ExportedStaticPackages() android.Paths
ExportedManifests() android.Paths
ExportedAssets() android.OptionalPath
+ SetRROEnforcedForDependent(enforce bool)
+ IsRROEnforced(ctx android.BaseModuleContext) bool
}
func init() {
RegisterAARBuildComponents(android.InitRegistrationContext)
+
+ android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
+ ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
+ })
}
func RegisterAARBuildComponents(ctx android.RegistrationContext) {
@@ -82,6 +88,9 @@
// do not include AndroidManifest from dependent libraries
Dont_merge_manifests *bool
+
+ // true if RRO is enforced for any of the dependent modules
+ RROEnforcedForDependent bool `blueprint:"mutated"`
}
type aapt struct {
@@ -117,6 +126,18 @@
path android.Path
}
+// Propagate RRO enforcement flag to static lib dependencies transitively.
+func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) {
+ m := ctx.Module()
+ if d, ok := m.(AndroidLibraryDependency); ok && d.IsRROEnforced(ctx) {
+ ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
+ if a, ok := d.(AndroidLibraryDependency); ok {
+ a.SetRROEnforcedForDependent(true)
+ }
+ })
+ }
+}
+
func (a *aapt) ExportPackage() android.Path {
return a.exportPackage
}
@@ -133,6 +154,17 @@
return a.assetPackage
}
+func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
+ a.aaptProperties.RROEnforcedForDependent = enforce
+}
+
+func (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool {
+ // True if RRO is enforced for this module or...
+ return ctx.Config().EnforceRROForModule(ctx.ModuleName()) ||
+ // if RRO is enforced for any of its dependents, and this module is not exempted.
+ (a.aaptProperties.RROEnforcedForDependent && !ctx.Config().EnforceRROExemptedForModule(ctx.ModuleName()))
+}
+
func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext,
manifestPath android.Path) (compileFlags, linkFlags []string, linkDeps android.Paths,
resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) {
@@ -156,7 +188,7 @@
dir: dir,
files: androidResourceGlob(ctx, dir),
})
- resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, dir)
+ resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, a, dir)
overlayDirs = append(overlayDirs, resOverlayDirs...)
rroDirs = append(rroDirs, resRRODirs...)
}
@@ -412,14 +444,16 @@
assets = append(assets, aarDep.ExportedAssets().Path())
}
- outer:
- for _, d := range aarDep.ExportedRRODirs() {
- for _, e := range staticRRODirs {
- if d.path == e.path {
- continue outer
+ if !ctx.Config().EnforceRROExemptedForModule(ctx.ModuleName()) {
+ outer:
+ for _, d := range aarDep.ExportedRRODirs() {
+ for _, e := range staticRRODirs {
+ if d.path == e.path {
+ continue outer
+ }
}
+ staticRRODirs = append(staticRRODirs, d)
}
- staticRRODirs = append(staticRRODirs, d)
}
}
}
@@ -573,6 +607,22 @@
exportedStaticPackages android.Paths
hideApexVariantFromMake bool
+
+ aarPath android.Path
+}
+
+var _ android.OutputFileProducer = (*AARImport)(nil)
+
+// For OutputFileProducer interface
+func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
+ switch tag {
+ case ".aar":
+ return []android.Path{a.aarPath}, nil
+ case "":
+ return []android.Path{a.classpathFile}, nil
+ default:
+ return nil, fmt.Errorf("unsupported module reference tag %q", tag)
+ }
}
func (a *AARImport) sdkVersion() sdkSpec {
@@ -625,6 +675,17 @@
return android.OptionalPath{}
}
+// RRO enforcement is not available on aar_import since its RRO dirs are not
+// exported.
+func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
+}
+
+// RRO enforcement is not available on aar_import since its RRO dirs are not
+// exported.
+func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
+ return false
+}
+
func (a *AARImport) Prebuilt() *android.Prebuilt {
return &a.prebuilt
}
@@ -669,12 +730,12 @@
a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
aarName := ctx.ModuleName() + ".aar"
- var aar android.Path
- aar = android.PathForModuleSrc(ctx, a.properties.Aars[0])
+ a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
+
if Bool(a.properties.Jetifier) {
- inputFile := aar
- aar = android.PathForModuleOut(ctx, "jetifier", aarName)
- TransformJetifier(ctx, aar.(android.WritablePath), inputFile)
+ inputFile := a.aarPath
+ a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
+ TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
}
extractedAARDir := android.PathForModuleOut(ctx, "aar")
@@ -684,7 +745,7 @@
ctx.Build(pctx, android.BuildParams{
Rule: unzipAAR,
- Input: aar,
+ Input: a.aarPath,
Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest},
Description: "unzip AAR",
Args: map[string]string{
@@ -698,7 +759,7 @@
compileFlags := []string{"--pseudo-localize"}
compiledResDir := android.PathForModuleOut(ctx, "flat-res")
flata := compiledResDir.Join(ctx, "gen_res.flata")
- aapt2CompileZip(ctx, flata, aar, "res", compileFlags)
+ aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
// the subdir "android" is required to be filtered by package names
diff --git a/java/android_resources.go b/java/android_resources.go
index c2bc746..97f7679 100644
--- a/java/android_resources.go
+++ b/java/android_resources.go
@@ -66,13 +66,13 @@
files android.Paths
}
-func overlayResourceGlob(ctx android.ModuleContext, dir android.Path) (res []globbedResourceDir,
+func overlayResourceGlob(ctx android.ModuleContext, a *aapt, dir android.Path) (res []globbedResourceDir,
rroDirs []rroDir) {
overlayData := ctx.Config().Get(overlayDataKey).([]overlayGlobResult)
// Runtime resource overlays (RRO) may be turned on by the product config for some modules
- rroEnabled := ctx.Config().EnforceRROForModule(ctx.ModuleName())
+ rroEnabled := a.IsRROEnforced(ctx)
for _, data := range overlayData {
files := data.paths.PathsInDirectory(filepath.Join(data.dir, dir.String()))
diff --git a/java/app.go b/java/app.go
index 76b3598..46ca969 100755
--- a/java/app.go
+++ b/java/app.go
@@ -642,7 +642,7 @@
// Work with the team to come up with a new format that handles multilib modules properly
// and change this.
if len(ctx.Config().Targets[android.Android]) == 1 ||
- ctx.Config().Targets[android.Android][0].Arch.ArchType == jni.target.Arch.ArchType {
+ ctx.Config().AndroidFirstDeviceTarget.Arch.ArchType == jni.target.Arch.ArchType {
a.jniCoverageOutputs = append(a.jniCoverageOutputs, jni.coverageFile.Path())
}
}
@@ -1401,7 +1401,7 @@
}
archProps := reflect.ValueOf(a.archVariants).Elem().FieldByName("Arch")
- archType := ctx.Config().Targets[android.Android][0].Arch.ArchType
+ archType := ctx.Config().AndroidFirstDeviceTarget.Arch.ArchType
MergePropertiesFromVariant(ctx, &a.properties, archProps, archType.Name)
}
diff --git a/java/app_test.go b/java/app_test.go
index 31b422c..49ed3aa 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -848,19 +848,17 @@
"lib": {
buildDir + "/.intermediates/lib2/android_common/package-res.apk",
"lib/res/res/values/strings.xml",
- "device/vendor/blah/overlay/lib/res/values/strings.xml",
},
},
rroDirs: map[string][]string{
"foo": {
"device:device/vendor/blah/overlay/foo/res",
- // Enforce RRO on "foo" could imply RRO on static dependencies, but for now it doesn't.
- // "device/vendor/blah/overlay/lib/res",
"product:product/vendor/blah/overlay/foo/res",
+ "device:device/vendor/blah/overlay/lib/res",
},
"bar": nil,
- "lib": nil,
+ "lib": {"device:device/vendor/blah/overlay/lib/res"},
},
},
{
@@ -3382,3 +3380,114 @@
checkAapt2LinkFlag(t, aapt2Flags, "rename-overlay-target-package", expected.targetPackageFlag)
}
}
+
+func TestEnforceRRO_propagatesToDependencies(t *testing.T) {
+ testCases := []struct {
+ name string
+ enforceRROTargets []string
+ enforceRROExemptTargets []string
+ rroDirs map[string][]string
+ }{
+ {
+ name: "no RRO",
+ enforceRROTargets: nil,
+ enforceRROExemptTargets: nil,
+ rroDirs: map[string][]string{
+ "foo": nil,
+ "bar": nil,
+ },
+ },
+ {
+ name: "enforce RRO on all",
+ enforceRROTargets: []string{"*"},
+ enforceRROExemptTargets: nil,
+ rroDirs: map[string][]string{
+ "foo": {"product/vendor/blah/overlay/lib2/res"},
+ "bar": {"product/vendor/blah/overlay/lib2/res"},
+ },
+ },
+ {
+ name: "enforce RRO on foo",
+ enforceRROTargets: []string{"foo"},
+ enforceRROExemptTargets: nil,
+ rroDirs: map[string][]string{
+ "foo": {"product/vendor/blah/overlay/lib2/res"},
+ "bar": {"product/vendor/blah/overlay/lib2/res"},
+ },
+ },
+ {
+ name: "enforce RRO on foo, bar exempted",
+ enforceRROTargets: []string{"foo"},
+ enforceRROExemptTargets: []string{"bar"},
+ rroDirs: map[string][]string{
+ "foo": {"product/vendor/blah/overlay/lib2/res"},
+ "bar": nil,
+ },
+ },
+ }
+
+ productResourceOverlays := []string{
+ "product/vendor/blah/overlay",
+ }
+
+ fs := map[string][]byte{
+ "lib2/res/values/strings.xml": nil,
+ "product/vendor/blah/overlay/lib2/res/values/strings.xml": nil,
+ }
+
+ bp := `
+ android_app {
+ name: "foo",
+ sdk_version: "current",
+ resource_dirs: [],
+ static_libs: ["lib"],
+ }
+
+ android_app {
+ name: "bar",
+ sdk_version: "current",
+ resource_dirs: [],
+ static_libs: ["lib"],
+ }
+
+ android_library {
+ name: "lib",
+ sdk_version: "current",
+ resource_dirs: [],
+ static_libs: ["lib2"],
+ }
+
+ android_library {
+ name: "lib2",
+ sdk_version: "current",
+ resource_dirs: ["lib2/res"],
+ }
+ `
+
+ for _, testCase := range testCases {
+ t.Run(testCase.name, func(t *testing.T) {
+ config := testAppConfig(nil, bp, fs)
+ config.TestProductVariables.ProductResourceOverlays = productResourceOverlays
+ if testCase.enforceRROTargets != nil {
+ config.TestProductVariables.EnforceRROTargets = testCase.enforceRROTargets
+ }
+ if testCase.enforceRROExemptTargets != nil {
+ config.TestProductVariables.EnforceRROExemptedTargets = testCase.enforceRROExemptTargets
+ }
+
+ ctx := testContext()
+ run(t, ctx, config)
+
+ modules := []string{"foo", "bar"}
+ for _, moduleName := range modules {
+ module := ctx.ModuleForTests(moduleName, "android_common")
+ mkEntries := android.AndroidMkEntriesForTest(t, config, "", module.Module())[0]
+ actualRRODirs := mkEntries.EntryMap["LOCAL_SOONG_PRODUCT_RRO_DIRS"]
+ if !reflect.DeepEqual(actualRRODirs, testCase.rroDirs[moduleName]) {
+ t.Errorf("exected %s LOCAL_SOONG_PRODUCT_RRO_DIRS entry: %v\ngot:%q",
+ moduleName, testCase.rroDirs[moduleName], actualRRODirs)
+ }
+ }
+ })
+ }
+}
diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go
index b140b89..9d07e41 100644
--- a/java/hiddenapi_singleton.go
+++ b/java/hiddenapi_singleton.go
@@ -18,6 +18,7 @@
"fmt"
"android/soong/android"
+ "android/soong/genrule"
)
func init() {
@@ -223,30 +224,26 @@
// the unsupported API.
func flagsRule(ctx android.SingletonContext) android.Path {
var flagsCSV android.Paths
- var greylistRemovedApis android.Paths
+ var combinedRemovedApis android.Path
ctx.VisitAllModules(func(module android.Module) {
if h, ok := module.(hiddenAPIIntf); ok {
if csv := h.flagsCSV(); csv != nil {
flagsCSV = append(flagsCSV, csv)
}
- } else if ds, ok := module.(*Droidstubs); ok {
- // Track @removed public and system APIs via corresponding droidstubs targets.
- // These APIs are not present in the stubs, however, we have to keep allowing access
- // to them at runtime.
- if moduleForGreyListRemovedApis(ctx, module) {
- greylistRemovedApis = append(greylistRemovedApis, ds.removedDexApiFile)
+ } else if g, ok := module.(*genrule.Module); ok {
+ if ctx.ModuleName(module) == "combined-removed-dex" {
+ if len(g.GeneratedSourceFiles()) != 1 || combinedRemovedApis != nil {
+ ctx.Errorf("Expected 1 combined-removed-dex module that generates 1 output file.")
+ }
+ combinedRemovedApis = g.GeneratedSourceFiles()[0]
}
}
})
- combinedRemovedApis := android.PathForOutput(ctx, "hiddenapi", "combined-removed-dex.txt")
- ctx.Build(pctx, android.BuildParams{
- Rule: android.Cat,
- Inputs: greylistRemovedApis,
- Output: combinedRemovedApis,
- Description: "Combine removed apis for " + combinedRemovedApis.String(),
- })
+ if combinedRemovedApis == nil {
+ ctx.Errorf("Failed to find combined-removed-dex.")
+ }
rule := android.NewRuleBuilder()
diff --git a/java/java_test.go b/java/java_test.go
index 2fd4121..c751ea4 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -102,6 +102,10 @@
dexpreopt.RegisterToolModulesForTest(ctx)
+ ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
+ ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
+ })
+
return ctx
}
@@ -1595,6 +1599,39 @@
}
}
+func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
+ ctx, _ := testJava(t, `
+ java_sdk_library {
+ name: "sdk_lib",
+ srcs: ["a.java"],
+ impl_only_libs: ["foo"],
+ stub_only_libs: ["bar"],
+ }
+ java_library {
+ name: "foo",
+ srcs: ["a.java"],
+ sdk_version: "current",
+ }
+ java_library {
+ name: "bar",
+ srcs: ["a.java"],
+ sdk_version: "current",
+ }
+ `)
+
+ for _, implName := range []string{"sdk_lib", "sdk_lib.impl"} {
+ implJavacCp := ctx.ModuleForTests(implName, "android_common").Rule("javac").Args["classpath"]
+ if !strings.Contains(implJavacCp, "/foo.jar") || strings.Contains(implJavacCp, "/bar.jar") {
+ t.Errorf("%v javac classpath %v does not contain foo and not bar", implName, implJavacCp)
+ }
+ }
+ stubName := apiScopePublic.stubsLibraryModuleName("sdk_lib")
+ stubsJavacCp := ctx.ModuleForTests(stubName, "android_common").Rule("javac").Args["classpath"]
+ if strings.Contains(stubsJavacCp, "/foo.jar") || !strings.Contains(stubsJavacCp, "/bar.jar") {
+ t.Errorf("stubs javac classpath %v does not contain bar and not foo", stubsJavacCp)
+ }
+}
+
func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
ctx, _ := testJava(t, `
java_sdk_library {
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 119eb65..859dc8d 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -388,6 +388,9 @@
// visibility property.
Stubs_source_visibility []string
+ // List of Java libraries that will be in the classpath when building the implementation lib
+ Impl_only_libs []string `android:"arch_variant"`
+
// List of Java libraries that will be in the classpath when building stubs
Stub_only_libs []string `android:"arch_variant"`
@@ -1137,12 +1140,16 @@
Name *string
Visibility []string
Instrument bool
+ Libs []string
ConfigurationName *string
}{
Name: proptools.StringPtr(module.implLibraryModuleName()),
Visibility: visibility,
// Set the instrument property to ensure it is instrumented when instrumentation is required.
Instrument: true,
+ // Set the impl_only libs. Note that the module's "Libs" get appended as well, via the
+ // addition of &module.properties below.
+ Libs: module.sdkLibraryProperties.Impl_only_libs,
// Make the created library behave as if it had the same name as this module.
ConfigurationName: moduleNamePtr,
@@ -1565,6 +1572,9 @@
defer javaSdkLibrariesLock.Unlock()
*javaSdkLibraries = append(*javaSdkLibraries, module.BaseModuleName())
}
+
+ // Add the impl_only_libs *after* we're done using the Libs prop in submodules.
+ module.properties.Libs = append(module.properties.Libs, module.sdkLibraryProperties.Impl_only_libs...)
}
func (module *SdkLibrary) InitSdkLibraryProperties() {
diff --git a/rust/project_json.go b/rust/project_json.go
index 8d161b2..5697408 100644
--- a/rust/project_json.go
+++ b/rust/project_json.go
@@ -93,7 +93,7 @@
return "", false
}
default:
- if rModule.Target().String() != ctx.Config().Targets[android.Android][0].String() {
+ if rModule.Target().String() != ctx.Config().AndroidFirstDeviceTarget.String() {
return "", false
}
}
diff --git a/sh/sh_binary.go b/sh/sh_binary.go
index 7c3cdbd..e807877 100644
--- a/sh/sh_binary.go
+++ b/sh/sh_binary.go
@@ -261,7 +261,7 @@
ctx.AddFarVariationDependencies(append(ctx.Target().Variations(), sharedLibVariations...),
shTestDataLibsTag, s.testProperties.Data_libs...)
if ctx.Target().Os.Class == android.Host && len(ctx.Config().Targets[android.Android]) > 0 {
- deviceVariations := ctx.Config().Targets[android.Android][0].Variations()
+ deviceVariations := ctx.Config().AndroidFirstDeviceTarget.Variations()
ctx.AddFarVariationDependencies(deviceVariations, shTestDataDeviceBinsTag, s.testProperties.Data_device_bins...)
ctx.AddFarVariationDependencies(append(deviceVariations, sharedLibVariations...),
shTestDataDeviceLibsTag, s.testProperties.Data_device_libs...)
diff --git a/ui/build/cleanbuild.go b/ui/build/cleanbuild.go
index e1123e0..fc0329f 100644
--- a/ui/build/cleanbuild.go
+++ b/ui/build/cleanbuild.go
@@ -80,6 +80,10 @@
return filepath.Join(hostOutPath, path)
}
+ hostCommonOut := func(path string) string {
+ return filepath.Join(config.hostOutRoot(), "common", path)
+ }
+
productOutPath := config.ProductOut()
productOut := func(path string) string {
return filepath.Join(productOutPath, path)
@@ -101,6 +105,7 @@
hostOut("vts"),
hostOut("vts10"),
hostOut("vts-core"),
+ hostCommonOut("obj/PACKAGING"),
productOut("*.img"),
productOut("*.zip"),
productOut("android-info.txt"),
diff --git a/ui/build/rbe.go b/ui/build/rbe.go
index 182c544..64f3d4c 100644
--- a/ui/build/rbe.go
+++ b/ui/build/rbe.go
@@ -34,6 +34,8 @@
// RBE metrics proto buffer file
rbeMetricsPBFilename = "rbe_metrics.pb"
+
+ defaultOutDir = "out"
)
func rbeCommand(ctx Context, config Config, rbeCmd string) string {
@@ -151,3 +153,16 @@
ctx.Fatalf("failed to copy %q to %q: %v\n", metricsFile, filename, err)
}
}
+
+// PrintOutDirWarning prints a warning to indicate to the user that
+// setting output directory to a path other than "out" in an RBE enabled
+// build can cause slow builds.
+func PrintOutDirWarning(ctx Context, config Config) {
+ if config.UseRBE() && config.OutDir() != defaultOutDir {
+ fmt.Fprintln(ctx.Writer, "")
+ fmt.Fprintln(ctx.Writer, "\033[33mWARNING:\033[0m")
+ fmt.Fprintln(ctx.Writer, fmt.Sprintf("Setting OUT_DIR to a path other than %v may result in slow RBE builds.", defaultOutDir))
+ fmt.Fprintln(ctx.Writer, "See http://go/android_rbe_out_dir for a workaround.")
+ fmt.Fprintln(ctx.Writer, "")
+ }
+}