summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/aar.go30
-rw-r--r--java/android_resources.go2
-rw-r--r--java/app.go4
-rw-r--r--java/app_test.go148
-rw-r--r--java/dexpreopt.go64
-rw-r--r--java/hiddenapi.go18
-rw-r--r--java/sdk.go2
-rw-r--r--java/sdk_library.go4
8 files changed, 138 insertions, 134 deletions
diff --git a/java/aar.go b/java/aar.go
index d08e48761..b96f1272b 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -26,6 +26,7 @@ type AndroidLibraryDependency interface {
Dependency
ExportPackage() android.Path
ExportedProguardFlagFiles() android.Paths
+ ExportedRRODirs() android.Paths
ExportedStaticPackages() android.Paths
ExportedManifest() android.Path
}
@@ -80,6 +81,14 @@ func (a *aapt) ExportPackage() android.Path {
return a.exportPackage
}
+func (a *aapt) ExportedRRODirs() android.Paths {
+ return a.rroDirs
+}
+
+func (a *aapt) ExportedManifest() android.Path {
+ return a.manifestPath
+}
+
func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext, manifestPath android.Path) (flags []string,
deps android.Paths, resDirs, overlayDirs []globbedResourceDir, rroDirs android.Paths) {
@@ -164,7 +173,7 @@ func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkContext sdkContext) {
}
func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, extraLinkFlags ...string) {
- transitiveStaticLibs, staticLibManifests, libDeps, libFlags := aaptLibs(ctx, sdkContext)
+ transitiveStaticLibs, staticLibManifests, staticRRODirs, libDeps, libFlags := aaptLibs(ctx, sdkContext)
// App manifest file
manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
@@ -174,6 +183,8 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex
linkFlags, linkDeps, resDirs, overlayDirs, rroDirs := a.aapt2Flags(ctx, sdkContext, manifestPath)
+ rroDirs = append(rroDirs, staticRRODirs...)
+
linkFlags = append(linkFlags, libFlags...)
linkDeps = append(linkDeps, libDeps...)
linkFlags = append(linkFlags, extraLinkFlags...)
@@ -235,7 +246,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex
// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStaticLibs, staticLibManifests,
- deps android.Paths, flags []string) {
+ staticRRODirs, deps android.Paths, flags []string) {
var sharedLibs android.Paths
@@ -263,6 +274,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati
transitiveStaticLibs = append(transitiveStaticLibs, exportPackage)
transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...)
staticLibManifests = append(staticLibManifests, aarDep.ExportedManifest())
+ staticRRODirs = append(staticRRODirs, aarDep.ExportedRRODirs()...)
}
}
})
@@ -279,8 +291,9 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati
}
transitiveStaticLibs = android.FirstUniquePaths(transitiveStaticLibs)
+ staticRRODirs = android.FirstUniquePaths(staticRRODirs)
- return transitiveStaticLibs, staticLibManifests, deps, flags
+ return transitiveStaticLibs, staticLibManifests, staticRRODirs, deps, flags
}
type AndroidLibrary struct {
@@ -303,10 +316,6 @@ func (a *AndroidLibrary) ExportedStaticPackages() android.Paths {
return a.exportedStaticPackages
}
-func (a *AndroidLibrary) ExportedManifest() android.Path {
- return a.manifestPath
-}
-
var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
@@ -426,6 +435,10 @@ func (a *AARImport) ExportedProguardFlagFiles() android.Paths {
return android.Paths{a.proguardFlags}
}
+func (a *AARImport) ExportedRRODirs() android.Paths {
+ return nil
+}
+
func (a *AARImport) ExportedStaticPackages() android.Paths {
return a.exportedStaticPackages
}
@@ -518,9 +531,10 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
linkDeps = append(linkDeps, a.manifest)
- transitiveStaticLibs, staticLibManifests, libDeps, libFlags := aaptLibs(ctx, sdkContext(a))
+ transitiveStaticLibs, staticLibManifests, staticRRODirs, libDeps, libFlags := aaptLibs(ctx, sdkContext(a))
_ = staticLibManifests
+ _ = staticRRODirs
linkDeps = append(linkDeps, libDeps...)
linkFlags = append(linkFlags, libFlags...)
diff --git a/java/android_resources.go b/java/android_resources.go
index efd3e3dd0..44cb709e4 100644
--- a/java/android_resources.go
+++ b/java/android_resources.go
@@ -46,7 +46,7 @@ type overlayGlobResult struct {
paths android.DirectorySortedPaths
}
-const overlayDataKey = "overlayDataKey"
+var overlayDataKey = android.NewOnceKey("overlayDataKey")
type globbedResourceDir struct {
dir android.Path
diff --git a/java/app.go b/java/app.go
index e9c12e0a7..08714f2c9 100644
--- a/java/app.go
+++ b/java/app.go
@@ -95,10 +95,6 @@ func (a *AndroidApp) ExportedStaticPackages() android.Paths {
return nil
}
-func (a *AndroidApp) ExportedManifest() android.Path {
- return a.manifestPath
-}
-
var _ AndroidLibraryDependency = (*AndroidApp)(nil)
type Certificate struct {
diff --git a/java/app_test.go b/java/app_test.go
index 2455145fa..93d20d09a 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -106,68 +106,86 @@ func TestApp(t *testing.T) {
}
}
-var testEnforceRROTests = []struct {
- name string
- enforceRROTargets []string
- enforceRROExcludedOverlays []string
- overlayFiles map[string][]string
- rroDirs map[string][]string
-}{
- {
- name: "no RRO",
- enforceRROTargets: nil,
- enforceRROExcludedOverlays: nil,
- overlayFiles: map[string][]string{
- "foo": []string{
- "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
- "device/vendor/blah/overlay/foo/res/values/strings.xml",
+func TestEnforceRRO(t *testing.T) {
+ testCases := []struct {
+ name string
+ enforceRROTargets []string
+ enforceRROExcludedOverlays []string
+ overlayFiles map[string][]string
+ rroDirs map[string][]string
+ }{
+ {
+ name: "no RRO",
+ enforceRROTargets: nil,
+ enforceRROExcludedOverlays: nil,
+ overlayFiles: map[string][]string{
+ "foo": []string{
+ buildDir + "/.intermediates/lib/android_common/package-res.apk",
+ "foo/res/res/values/strings.xml",
+ "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
+ "device/vendor/blah/overlay/foo/res/values/strings.xml",
+ },
+ "bar": []string{
+ "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
+ "device/vendor/blah/overlay/bar/res/values/strings.xml",
+ },
},
- "bar": []string{
- "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
- "device/vendor/blah/overlay/bar/res/values/strings.xml",
+ rroDirs: map[string][]string{
+ "foo": nil,
+ "bar": nil,
},
},
- rroDirs: map[string][]string{
- "foo": nil,
- "bar": nil,
- },
- },
- {
- name: "enforce RRO on foo",
- enforceRROTargets: []string{"foo"},
- enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
- overlayFiles: map[string][]string{
- "foo": []string{"device/vendor/blah/static_overlay/foo/res/values/strings.xml"},
- "bar": []string{
- "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
- "device/vendor/blah/overlay/bar/res/values/strings.xml",
+ {
+ name: "enforce RRO on foo",
+ enforceRROTargets: []string{"foo"},
+ enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
+ overlayFiles: map[string][]string{
+ "foo": []string{
+ buildDir + "/.intermediates/lib/android_common/package-res.apk",
+ "foo/res/res/values/strings.xml",
+ "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
+ },
+ "bar": []string{
+ "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
+ "device/vendor/blah/overlay/bar/res/values/strings.xml",
+ },
+ },
+
+ rroDirs: map[string][]string{
+ "foo": []string{
+ "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",
+ },
+ "bar": nil,
},
},
- rroDirs: map[string][]string{
- "foo": []string{"device/vendor/blah/overlay/foo/res"},
- "bar": nil,
- },
- },
- {
- name: "enforce RRO on all",
- enforceRROTargets: []string{"*"},
- enforceRROExcludedOverlays: []string{
- // Excluding specific apps/res directories also allowed.
- "device/vendor/blah/static_overlay/foo",
- "device/vendor/blah/static_overlay/bar/res",
- },
- overlayFiles: map[string][]string{
- "foo": []string{"device/vendor/blah/static_overlay/foo/res/values/strings.xml"},
- "bar": []string{"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
- },
- rroDirs: map[string][]string{
- "foo": []string{"device/vendor/blah/overlay/foo/res"},
- "bar": []string{"device/vendor/blah/overlay/bar/res"},
+ {
+ name: "enforce RRO on all",
+ enforceRROTargets: []string{"*"},
+ enforceRROExcludedOverlays: []string{
+ // Excluding specific apps/res directories also allowed.
+ "device/vendor/blah/static_overlay/foo",
+ "device/vendor/blah/static_overlay/bar/res",
+ },
+ overlayFiles: map[string][]string{
+ "foo": []string{
+ buildDir + "/.intermediates/lib/android_common/package-res.apk",
+ "foo/res/res/values/strings.xml",
+ "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
+ },
+ "bar": []string{"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
+ },
+ rroDirs: map[string][]string{
+ "foo": []string{
+ "device/vendor/blah/overlay/foo/res",
+ "device/vendor/blah/overlay/lib/res",
+ },
+ "bar": []string{"device/vendor/blah/overlay/bar/res"},
+ },
},
- },
-}
+ }
-func TestEnforceRRO(t *testing.T) {
resourceOverlays := []string{
"device/vendor/blah/overlay",
"device/vendor/blah/overlay2",
@@ -177,8 +195,10 @@ func TestEnforceRRO(t *testing.T) {
fs := map[string][]byte{
"foo/res/res/values/strings.xml": nil,
"bar/res/res/values/strings.xml": nil,
+ "lib/res/res/values/strings.xml": nil,
"device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
"device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
+ "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
"device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
"device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
"device/vendor/blah/overlay2/res/values/strings.xml": nil,
@@ -188,15 +208,21 @@ func TestEnforceRRO(t *testing.T) {
android_app {
name: "foo",
resource_dirs: ["foo/res"],
+ static_libs: ["lib"],
}
android_app {
name: "bar",
resource_dirs: ["bar/res"],
}
+
+ android_library {
+ name: "lib",
+ resource_dirs: ["lib/res"],
+ }
`
- for _, testCase := range testEnforceRROTests {
+ for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
config := testConfig(nil)
config.TestProductVariables.ResourceOverlays = resourceOverlays
@@ -216,7 +242,15 @@ func TestEnforceRRO(t *testing.T) {
var overlayFiles []string
if overlayFile.Rule != nil {
for _, o := range overlayFile.Inputs.Strings() {
- overlayFiles = append(overlayFiles, module.Output(o).Inputs.Strings()...)
+ overlayOutput := module.MaybeOutput(o)
+ if overlayOutput.Rule != nil {
+ // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
+ // verify the inputs to the .arsc.flat rule.
+ overlayFiles = append(overlayFiles, overlayOutput.Inputs.Strings()...)
+ } else {
+ // Otherwise, verify the full path to the output of the other module
+ overlayFiles = append(overlayFiles, o)
+ }
}
}
diff --git a/java/dexpreopt.go b/java/dexpreopt.go
index 6e46bc91a..33c46f4fe 100644
--- a/java/dexpreopt.go
+++ b/java/dexpreopt.go
@@ -15,12 +15,6 @@
package java
import (
- "path/filepath"
- "strings"
-
- "github.com/google/blueprint"
- "github.com/google/blueprint/proptools"
-
"android/soong/android"
"android/soong/dexpreopt"
)
@@ -87,12 +81,14 @@ func (d *dexpreopter) dexpreoptDisabled(ctx android.ModuleContext) bool {
return false
}
+var dexpreoptGlobalConfigKey = android.NewOnceKey("DexpreoptGlobalConfig")
+
func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.ModuleOutPath) android.ModuleOutPath {
if d.dexpreoptDisabled(ctx) {
return dexJarFile
}
- globalConfig := ctx.Config().Once("DexpreoptGlobalConfig", func() interface{} {
+ globalConfig := ctx.Config().Once(dexpreoptGlobalConfigKey, func() interface{} {
if f := ctx.Config().DexpreoptGlobalConfig(); f != "" {
ctx.AddNinjaFileDeps(f)
globalConfig, err := dexpreopt.LoadGlobalConfig(f)
@@ -185,69 +181,19 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo
return dexJarFile
}
- var inputs android.Paths
- for _, input := range dexpreoptRule.Inputs() {
- if input == "" {
- // Tests sometimes have empty configuration values that lead to empty inputs
- continue
- }
- rel, isRel := android.MaybeRel(ctx, android.PathForModuleOut(ctx).String(), input)
- if isRel {
- inputs = append(inputs, android.PathForModuleOut(ctx, rel))
- } else {
- // TODO: use PathForOutput once boot image is moved to where PathForOutput can find it.
- inputs = append(inputs, &bootImagePath{input})
- }
- }
-
- var outputs android.WritablePaths
- for _, output := range dexpreoptRule.Outputs() {
- rel := android.Rel(ctx, android.PathForModuleOut(ctx).String(), output)
- outputs = append(outputs, android.PathForModuleOut(ctx, rel))
- }
+ dexpreoptRule.Build(pctx, ctx, "dexpreopt", "dexpreopt")
for _, install := range dexpreoptRule.Installs() {
d.builtInstalled = append(d.builtInstalled, install.From+":"+install.To)
}
- if len(dexpreoptRule.Commands()) > 0 {
- ctx.Build(pctx, android.BuildParams{
- Rule: ctx.Rule(pctx, "dexpreopt", blueprint.RuleParams{
- Command: strings.Join(proptools.NinjaEscape(dexpreoptRule.Commands()), " && "),
- CommandDeps: dexpreoptRule.Tools(),
- }),
- Implicits: inputs,
- Outputs: outputs,
- Description: "dexpreopt",
- })
- }
-
stripRule, err := dexpreopt.GenerateStripRule(globalConfig, dexpreoptConfig)
if err != nil {
ctx.ModuleErrorf("error generating dexpreopt strip rule: %s", err.Error())
return dexJarFile
}
- ctx.Build(pctx, android.BuildParams{
- Rule: ctx.Rule(pctx, "dexpreopt_strip", blueprint.RuleParams{
- Command: strings.Join(proptools.NinjaEscape(stripRule.Commands()), " && "),
- CommandDeps: stripRule.Tools(),
- }),
- Input: dexJarFile,
- Output: strippedDexJarFile,
- Description: "dexpreopt strip",
- })
+ stripRule.Build(pctx, ctx, "dexpreopt_strip", "dexpreopt strip")
return strippedDexJarFile
}
-
-type bootImagePath struct {
- path string
-}
-
-var _ android.Path = (*bootImagePath)(nil)
-
-func (p *bootImagePath) String() string { return p.path }
-func (p *bootImagePath) Ext() string { return filepath.Ext(p.path) }
-func (p *bootImagePath) Base() string { return filepath.Base(p.path) }
-func (p *bootImagePath) Rel() string { return p.path }
diff --git a/java/hiddenapi.go b/java/hiddenapi.go
index 67df57552..c7eac733f 100644
--- a/java/hiddenapi.go
+++ b/java/hiddenapi.go
@@ -15,6 +15,7 @@
package java
import (
+ "path/filepath"
"sort"
"strings"
"sync"
@@ -32,7 +33,7 @@ var hiddenAPIGenerateCSVRule = pctx.AndroidStaticRule("hiddenAPIGenerateCSV", bl
func hiddenAPIGenerateCSV(ctx android.ModuleContext, classesJar android.Path) {
flagsCSV := android.PathForModuleOut(ctx, "hiddenapi", "flags.csv")
metadataCSV := android.PathForModuleOut(ctx, "hiddenapi", "metadata.csv")
- stubFlagsCSV := &bootImagePath{ctx.Config().HiddenAPIStubFlags()}
+ stubFlagsCSV := &hiddenAPIPath{ctx.Config().HiddenAPIStubFlags()}
ctx.Build(pctx, android.BuildParams{
Rule: hiddenAPIGenerateCSVRule,
@@ -80,7 +81,7 @@ var hiddenAPIEncodeDexRule = pctx.AndroidStaticRule("hiddenAPIEncodeDex", bluepr
func hiddenAPIEncodeDex(ctx android.ModuleContext, output android.WritablePath, dexInput android.WritablePath,
uncompressDex bool) {
- flagsCsv := &bootImagePath{ctx.Config().HiddenAPIFlags()}
+ flagsCsv := &hiddenAPIPath{ctx.Config().HiddenAPIFlags()}
// The encode dex rule requires unzipping and rezipping the classes.dex files, ensure that if it was uncompressed
// in the input it stays uncompressed in the output.
@@ -120,7 +121,7 @@ func hiddenAPIEncodeDex(ctx android.ModuleContext, output android.WritablePath,
hiddenAPISaveDexInputs(ctx, dexInput)
}
-const hiddenAPIOutputsKey = "hiddenAPIOutputsKey"
+var hiddenAPIOutputsKey = android.NewOnceKey("hiddenAPIOutputsKey")
var hiddenAPIOutputsLock sync.Mutex
@@ -168,3 +169,14 @@ func hiddenAPIMakeVars(ctx android.MakeVarsContext) {
export("SOONG_HIDDENAPI_GREYLIST_METADATA", metadataCSVList)
export("SOONG_HIDDENAPI_DEX_INPUTS", dexInputList)
}
+
+type hiddenAPIPath struct {
+ path string
+}
+
+var _ android.Path = (*hiddenAPIPath)(nil)
+
+func (p *hiddenAPIPath) String() string { return p.path }
+func (p *hiddenAPIPath) Ext() string { return filepath.Ext(p.path) }
+func (p *hiddenAPIPath) Base() string { return filepath.Base(p.path) }
+func (p *hiddenAPIPath) Rel() string { return p.path }
diff --git a/java/sdk.go b/java/sdk.go
index 988610f5b..0959be7de 100644
--- a/java/sdk.go
+++ b/java/sdk.go
@@ -28,7 +28,7 @@ func init() {
android.RegisterPreSingletonType("sdk", sdkSingletonFactory)
}
-const sdkSingletonKey = "sdkSingletonKey"
+var sdkSingletonKey = android.NewOnceKey("sdkSingletonKey")
type sdkContext interface {
// sdkVersion eturns the sdk_version property of the current module, or an empty string if it is not set.
diff --git a/java/sdk_library.go b/java/sdk_library.go
index ca3131c2f..1b0fe75e0 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -627,8 +627,10 @@ func (module *sdkLibrary) ImplementationJars(ctx android.BaseContext, sdkVersion
}
}
+var javaSdkLibrariesKey = android.NewOnceKey("javaSdkLibraries")
+
func javaSdkLibraries(config android.Config) *[]string {
- return config.Once("javaSdkLibraries", func() interface{} {
+ return config.Once(javaSdkLibrariesKey, func() interface{} {
return &[]string{}
}).(*[]string)
}