summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/androidmk.go59
-rw-r--r--android/apex.go3
-rw-r--r--android/apex_test.go19
-rw-r--r--android/compliance_metadata.go58
-rw-r--r--android/filegroup.go4
-rw-r--r--android/makevars.go18
-rw-r--r--android/module_info_json.go8
-rw-r--r--apex/apex.go14
-rw-r--r--apex/apex_test.go415
-rw-r--r--apex/bootclasspath_fragment_test.go25
-rw-r--r--apex/classpath_element_test.go4
-rw-r--r--apex/dexpreopt_bootjars_test.go4
-rw-r--r--apex/platform_bootclasspath_test.go10
-rw-r--r--cc/cc.go11
-rw-r--r--cc/strip.go6
-rw-r--r--filesystem/android_device_product_out.go15
-rw-r--r--java/bootclasspath_fragment.go17
-rw-r--r--java/dex.go14
-rw-r--r--java/dex_test.go56
-rw-r--r--java/dexpreopt_bootjars.go6
-rw-r--r--java/dexpreopt_config.go19
-rw-r--r--java/platform_bootclasspath.go13
-rw-r--r--java/systemserver_classpath_fragment.go7
-rw-r--r--rust/binary.go5
-rw-r--r--rust/config/global.go2
-rw-r--r--rust/library.go16
-rw-r--r--rust/rust.go109
-rw-r--r--rust/rust_test.go175
-rw-r--r--scripts/gen_build_prop.py3
-rw-r--r--ui/build/build.go3
-rw-r--r--ui/build/test_build.go6
31 files changed, 582 insertions, 542 deletions
diff --git a/android/androidmk.go b/android/androidmk.go
index f862a9628..cf1589d3a 100644
--- a/android/androidmk.go
+++ b/android/androidmk.go
@@ -333,6 +333,25 @@ type distCopy struct {
dest string
}
+func (d *distCopy) String() string {
+ if len(d.dest) == 0 {
+ return d.from.String()
+ }
+ return fmt.Sprintf("%s:%s", d.from.String(), d.dest)
+}
+
+type distCopies []distCopy
+
+func (d *distCopies) Strings() (ret []string) {
+ if d == nil {
+ return
+ }
+ for _, dist := range *d {
+ ret = append(ret, dist.String())
+ }
+ return
+}
+
// Compute the contributions that the module makes to the dist.
func (a *AndroidMkEntries) getDistContributions(mod blueprint.Module) *distContributions {
amod := mod.(Module).base()
@@ -821,6 +840,26 @@ func writeValueIfChanged(ctx SingletonContext, path string, value string) {
}
}
+func getMakeVarsDistContributions(mctx *makeVarsContext) *distContributions {
+ if len(mctx.dists) == 0 {
+ return nil
+ }
+
+ copyGoals := []*copiesForGoals{}
+ for _, dist := range mctx.dists {
+ for _, goal := range dist.goals {
+ copy := &copiesForGoals{}
+ copy.goals = goal
+ copy.copies = dist.paths
+ copyGoals = append(copyGoals, copy)
+ }
+ }
+
+ contribution := &distContributions{}
+ contribution.copiesForGoals = copyGoals
+ return contribution
+}
+
// getSoongOnlyDataFromMods gathers data from the given modules needed in soong-only builds.
// Currently, this is the dist contributions, and the module-info.json contents.
func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module) ([]distContributions, []*ModuleInfoJSON) {
@@ -853,6 +892,11 @@ func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module)
}
}
} else {
+ mctx := &makeVarsContext{
+ SingletonContext: ctx.(SingletonContext),
+ config: ctx.Config(),
+ pctx: pctx,
+ }
switch x := mod.(type) {
case AndroidMkDataProvider:
data := x.AndroidMk()
@@ -885,6 +929,21 @@ func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module)
allDistContributions = append(allDistContributions, *contribution)
}
}
+ case ModuleMakeVarsProvider:
+ if !x.Enabled(ctx) {
+ continue
+ }
+ x.MakeVars(mctx)
+ if contribution := getMakeVarsDistContributions(mctx); contribution != nil {
+ allDistContributions = append(allDistContributions, *contribution)
+ }
+
+ case SingletonMakeVarsProvider:
+ x.MakeVars(mctx)
+ if contribution := getMakeVarsDistContributions(mctx); contribution != nil {
+ allDistContributions = append(allDistContributions, *contribution)
+ }
+
default:
// Not exported to make so no make variables to set.
}
diff --git a/android/apex.go b/android/apex.go
index 08c82eb5a..c2f73a9c1 100644
--- a/android/apex.go
+++ b/android/apex.go
@@ -105,6 +105,9 @@ func (i ApexInfo) AddJSONData(d *map[string]interface{}) {
// thus wouldn't be merged.
func (i ApexInfo) mergedName() string {
name := "apex" + strconv.Itoa(i.MinSdkVersion.FinalOrFutureInt())
+ if i.UsePlatformApis {
+ name += "_p"
+ }
return name
}
diff --git a/android/apex_test.go b/android/apex_test.go
index 78597b234..acc195de2 100644
--- a/android/apex_test.go
+++ b/android/apex_test.go
@@ -193,7 +193,7 @@ func Test_mergeApexVariations(t *testing.T) {
},
},
{
- name: "merge different UsePlatformApis but don't allow using platform api",
+ name: "don't merge different UsePlatformApis",
in: []ApexInfo{
{
ApexVariationName: "foo",
@@ -213,13 +213,20 @@ func Test_mergeApexVariations(t *testing.T) {
{
ApexVariationName: "apex10000",
MinSdkVersion: FutureApiLevel,
- InApexVariants: []string{"foo", "bar"},
+ InApexVariants: []string{"foo"},
+ ForPrebuiltApex: NotForPrebuiltApex,
+ },
+ {
+ ApexVariationName: "apex10000_p",
+ MinSdkVersion: FutureApiLevel,
+ UsePlatformApis: true,
+ InApexVariants: []string{"bar"},
ForPrebuiltApex: NotForPrebuiltApex,
},
},
wantAliases: [][2]string{
{"foo", "apex10000"},
- {"bar", "apex10000"},
+ {"bar", "apex10000_p"},
},
},
{
@@ -242,7 +249,7 @@ func Test_mergeApexVariations(t *testing.T) {
},
wantMerged: []ApexInfo{
{
- ApexVariationName: "apex10000",
+ ApexVariationName: "apex10000_p",
MinSdkVersion: FutureApiLevel,
UsePlatformApis: true,
InApexVariants: []string{"foo", "bar"},
@@ -250,8 +257,8 @@ func Test_mergeApexVariations(t *testing.T) {
},
},
wantAliases: [][2]string{
- {"foo", "apex10000"},
- {"bar", "apex10000"},
+ {"foo", "apex10000_p"},
+ {"bar", "apex10000_p"},
},
},
}
diff --git a/android/compliance_metadata.go b/android/compliance_metadata.go
index dcf393d66..1e1f4bc60 100644
--- a/android/compliance_metadata.go
+++ b/android/compliance_metadata.go
@@ -240,10 +240,22 @@ var (
blueprint.RuleParams{
Command: `rm -rf $out && ` +
`${sqlite3} $out ".import --csv $in modules" && ` +
- `([ -z "${make_metadata}" ] || ${sqlite3} $out ".import --csv ${make_metadata} make_metadata") && ` +
- `([ -z "${make_modules}" ] || ${sqlite3} $out ".import --csv ${make_modules} make_modules")`,
+ `${sqlite3} $out ".import --csv ${make_metadata} make_metadata" && ` +
+ `${sqlite3} $out ".import --csv ${make_modules} make_modules"`,
CommandDeps: []string{"${sqlite3}"},
}, "make_metadata", "make_modules")
+
+ buildMakeMetadataCsv = pctx.AndroidStaticRule("buildMakeMetadataCsv",
+ blueprint.RuleParams{
+ Command: `rm -rf $out && ` +
+ `echo "installed_file,module_path,is_soong_module,is_prebuilt_make_module,product_copy_files,kernel_module_copy_files,is_platform_generated,static_libs,whole_static_libs,license_text" > $out`,
+ })
+
+ buildMakeModulesCsv = pctx.AndroidStaticRule("buildMakeModulesCsv",
+ blueprint.RuleParams{
+ Command: `rm -rf $out && ` +
+ `echo "name,module_path,module_class,module_type,static_libs,whole_static_libs,built_files,installed_files" > $out`,
+ })
)
func complianceMetadataSingletonFactory() Singleton {
@@ -311,29 +323,35 @@ func (c *complianceMetadataSingleton) GenerateBuildActions(ctx SingletonContext)
modulesCsv := PathForOutput(ctx, "compliance-metadata", deviceProduct, "soong-modules.csv")
WriteFileRuleVerbatim(ctx, modulesCsv, buffer.String())
- var implicits []Path
- args := make(map[string]string)
-
- if ctx.Config().KatiEnabled() {
- // Metadata generated in Make
- makeMetadataCsv := PathForOutput(ctx, "compliance-metadata", deviceProduct, "make-metadata.csv")
- makeModulesCsv := PathForOutput(ctx, "compliance-metadata", deviceProduct, "make-modules.csv")
- implicits = append(implicits, makeMetadataCsv, makeModulesCsv)
- args["make_metadata"] = makeMetadataCsv.String()
- args["make_modules"] = makeModulesCsv.String()
- } else {
- args["make_metadata"] = ""
- args["make_modules"] = ""
+ // Metadata generated in Make
+ makeMetadataCsv := PathForOutput(ctx, "compliance-metadata", deviceProduct, "make-metadata.csv")
+ makeModulesCsv := PathForOutput(ctx, "compliance-metadata", deviceProduct, "make-modules.csv")
+
+ if !ctx.Config().KatiEnabled() {
+ ctx.Build(pctx, BuildParams{
+ Rule: buildMakeMetadataCsv,
+ Output: makeMetadataCsv,
+ })
+ ctx.Build(pctx, BuildParams{
+ Rule: buildMakeModulesCsv,
+ Output: makeModulesCsv,
+ })
}
// Import metadata from Make and Soong to sqlite3 database
complianceMetadataDb := PathForOutput(ctx, "compliance-metadata", deviceProduct, "compliance-metadata.db")
ctx.Build(pctx, BuildParams{
- Rule: importCsv,
- Input: modulesCsv,
- Implicits: implicits,
- Output: complianceMetadataDb,
- Args: args,
+ Rule: importCsv,
+ Input: modulesCsv,
+ Implicits: []Path{
+ makeMetadataCsv,
+ makeModulesCsv,
+ },
+ Output: complianceMetadataDb,
+ Args: map[string]string{
+ "make_metadata": makeMetadataCsv.String(),
+ "make_modules": makeModulesCsv.String(),
+ },
})
// Phony rule "compliance-metadata.db". "m compliance-metadata.db" to create the compliance metadata database.
diff --git a/android/filegroup.go b/android/filegroup.go
index 4daff8f68..47102b915 100644
--- a/android/filegroup.go
+++ b/android/filegroup.go
@@ -41,11 +41,11 @@ type fileGroupProperties struct {
Exclude_srcs proptools.Configurable[[]string] `android:"path"`
- // Sources the will be included in the filegroup, but any module dependencies will be added
+ // Sources that will be included in the filegroup, but any module dependencies will be added
// using the device os and the device's first architecture's variant.
Device_first_srcs proptools.Configurable[[]string] `android:"path_device_first"`
- // Sources the will be included in the filegroup, but any module dependencies will be added
+ // Sources that will be included in the filegroup, but any module dependencies will be added
// using the device os and the common architecture's variant.
Device_common_srcs proptools.Configurable[[]string] `android:"path_device_common"`
diff --git a/android/makevars.go b/android/makevars.go
index 8305d8e00..d4389cfac 100644
--- a/android/makevars.go
+++ b/android/makevars.go
@@ -220,7 +220,7 @@ type phony struct {
type dist struct {
goals []string
- paths []string
+ paths distCopies
}
func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) {
@@ -330,7 +330,7 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) {
return len(a) < len(b)
}
sort.Slice(dists, func(i, j int) bool {
- return lessArr(dists[i].goals, dists[j].goals) || lessArr(dists[i].paths, dists[j].paths)
+ return lessArr(dists[i].goals, dists[j].goals) || lessArr(dists[i].paths.Strings(), dists[j].paths.Strings())
})
outBytes := s.writeVars(vars)
@@ -458,7 +458,7 @@ func (s *makeVarsSingleton) writeLate(phonies []phony, dists []dist) []byte {
for _, dist := range dists {
fmt.Fprintf(buf, ".PHONY: %s\n", strings.Join(dist.goals, " "))
fmt.Fprintf(buf, "$(call dist-for-goals,%s,%s)\n",
- strings.Join(dist.goals, " "), strings.Join(dist.paths, " "))
+ strings.Join(dist.goals, " "), strings.Join(dist.paths.Strings(), " "))
}
return buf.Bytes()
@@ -607,7 +607,7 @@ func (c *makeVarsContext) addPhony(name string, deps []string) {
c.phonies = append(c.phonies, phony{name, deps})
}
-func (c *makeVarsContext) addDist(goals []string, paths []string) {
+func (c *makeVarsContext) addDist(goals []string, paths []distCopy) {
c.dists = append(c.dists, dist{
goals: goals,
paths: paths,
@@ -647,9 +647,15 @@ func (c *makeVarsContext) DistForGoalWithFilename(goal string, path Path, filena
}
func (c *makeVarsContext) DistForGoals(goals []string, paths ...Path) {
- c.addDist(goals, Paths(paths).Strings())
+ var copies distCopies
+ for _, path := range paths {
+ copies = append(copies, distCopy{
+ from: path,
+ })
+ }
+ c.addDist(goals, copies)
}
func (c *makeVarsContext) DistForGoalsWithFilename(goals []string, path Path, filename string) {
- c.addDist(goals, []string{path.String() + ":" + filename})
+ c.addDist(goals, distCopies{{from: path, dest: filename}})
}
diff --git a/android/module_info_json.go b/android/module_info_json.go
index f7bffdb51..bb309ffee 100644
--- a/android/module_info_json.go
+++ b/android/module_info_json.go
@@ -133,4 +133,12 @@ func (m *ModuleInfoJSON) GobDecode(data []byte) error {
return gobtools.CustomGobDecode[combinedModuleInfoJSON](data, m)
}
+func (m *ModuleInfoJSON) GetInstalled() []string {
+ return m.core.Installed
+}
+
+func (m *ModuleInfoJSON) GetClass() []string {
+ return m.Class
+}
+
var ModuleInfoJSONProvider = blueprint.NewProvider[[]*ModuleInfoJSON]()
diff --git a/apex/apex.go b/apex/apex.go
index a3106717a..fa796e534 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -1032,9 +1032,9 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) {
// be built for this apexBundle.
apexVariationName := mctx.ModuleName() // could be com.android.foo
- if overridable, ok := mctx.Module().(android.OverridableModule); ok && overridable.GetOverriddenBy() != "" {
+ if a.GetOverriddenBy() != "" {
// use the overridden name com.mycompany.android.foo
- apexVariationName = overridable.GetOverriddenBy()
+ apexVariationName = a.GetOverriddenBy()
}
a.properties.ApexVariationName = apexVariationName
@@ -1202,8 +1202,6 @@ func (a *apexTransitionMutator) Split(ctx android.BaseModuleContext) []string {
return []string{overridable.GetOverriddenBy()}
}
return []string{ai.ApexVariationName()}
- } else if _, ok := ctx.Module().(*OverrideApex); ok {
- return []string{ctx.ModuleName()}
}
return []string{""}
}
@@ -1220,8 +1218,6 @@ func (a *apexTransitionMutator) IncomingTransition(ctx android.IncomingTransitio
return overridable.GetOverriddenBy()
}
return ai.ApexVariationName()
- } else if _, ok := ctx.Module().(*OverrideApex); ok {
- return ctx.Module().Name()
}
return ""
@@ -1663,6 +1659,10 @@ func apexFileForFilesystem(ctx android.BaseModuleContext, buildFile android.Path
// to the child modules. Returning false makes the visit to continue in the sibling or the parent
// modules. This is used in check* functions below.
func (a *apexBundle) WalkPayloadDeps(ctx android.BaseModuleContext, do android.PayloadDepsCallback) {
+ apexVariationName := ctx.ModuleName()
+ if overrideName := a.GetOverriddenBy(); overrideName != "" {
+ apexVariationName = overrideName
+ }
ctx.WalkDeps(func(child, parent android.Module) bool {
am, ok := child.(android.ApexModule)
if !ok || !am.CanHaveApexVariants() {
@@ -1682,7 +1682,7 @@ func (a *apexBundle) WalkPayloadDeps(ctx android.BaseModuleContext, do android.P
}
ai, _ := android.OtherModuleProvider(ctx, child, android.ApexInfoProvider)
- externalDep := !android.InList(ctx.ModuleName(), ai.InApexVariants)
+ externalDep := !android.InList(apexVariationName, ai.InApexVariants)
// Visit actually
return do(ctx, parent, am, externalDep)
diff --git a/apex/apex_test.go b/apex/apex_test.go
index cd2df5190..987cb6905 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -20,7 +20,6 @@ import (
"path/filepath"
"reflect"
"regexp"
- "slices"
"sort"
"strconv"
"strings"
@@ -29,7 +28,6 @@ import (
"android/soong/aconfig/codegen"
"github.com/google/blueprint"
- "github.com/google/blueprint/bpmodify"
"github.com/google/blueprint/proptools"
"android/soong/android"
@@ -1249,12 +1247,12 @@ func TestApexCanUsePrivateApis(t *testing.T) {
// Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
// of the platform_apis: true)
- mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
+ mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_p").Rule("ld").Args["libFlags"]
ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
- rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
+ rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_p").Rule("rustc").Args["linkFlags"]
ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
ensureNotContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib_rust.shared_from_rust.so")
@@ -5475,7 +5473,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
my-bootclasspath-fragment/index.csv
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
- out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
+ out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
`)
})
@@ -5548,7 +5546,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
my-bootclasspath-fragment/index.csv
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
- out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
+ out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
`)
myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
@@ -5743,7 +5741,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
my-bootclasspath-fragment/index.csv
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
- out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
+ out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
`)
})
@@ -5842,7 +5840,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
- out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
+ out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
`)
})
@@ -5954,7 +5952,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
my-bootclasspath-fragment/index.csv
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
- out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
+ out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
`)
})
@@ -11302,7 +11300,7 @@ func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
{
desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
selectedApexContributions: "foo.source.contributions",
- expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
+ expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_com.android.foo/hiddenapi-modular/encoded/framework-foo.jar",
},
{
desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
@@ -11359,7 +11357,7 @@ func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
variation := func(moduleName string) string {
ret := "android_common_com.android.foo"
if moduleName == "com.google.android.foo" {
- ret = "android_common_com.google.android.foo_com.google.android.foo"
+ ret = "android_common_com.google.android.foo"
}
return ret
}
@@ -11874,7 +11872,7 @@ func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
}
`)
- java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
+ java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex", "foo")
}
func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
@@ -12210,396 +12208,3 @@ func TestFilesystemWithApexDeps(t *testing.T) {
fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
}
-
-func TestApexVerifyNativeImplementationLibs(t *testing.T) {
- t.Parallel()
-
- extractDepenencyPathFromErrors := func(errs []error) []string {
- i := slices.IndexFunc(errs, func(err error) bool {
- return strings.Contains(err.Error(), "dependency path:")
- })
- if i < 0 {
- return nil
- }
- var dependencyPath []string
- for _, err := range errs[i+1:] {
- s := err.Error()
- lastSpace := strings.LastIndexByte(s, ' ')
- if lastSpace >= 0 {
- dependencyPath = append(dependencyPath, s[lastSpace+1:])
- }
- }
- return dependencyPath
- }
-
- checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
- return func(t *testing.T, result *android.TestResult) {
- t.Helper()
- if len(result.Errs) == 0 {
- t.Fatalf("expected errors")
- }
- t.Log("found errors:")
- for _, err := range result.Errs {
- t.Log(err)
- }
- if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
- t.Fatalf("expected error %q, got %q", w, g)
- }
- dependencyPath := extractDepenencyPathFromErrors(result.Errs)
- if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
- t.Errorf("expected dependency path %q, got %q", w, g)
- }
- }
- }
-
- addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
- return func(bp *bpmodify.Blueprint) {
- m := bp.ModulesByName(module)
- props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
- if err != nil {
- panic(err)
- }
- props.AddStringToList(lib)
- }
- }
-
- bpTemplate := `
- apex {
- name: "myapex",
- key: "myapex.key",
- native_shared_libs: ["mylib"],
- rust_dyn_libs: ["libmyrust"],
- binaries: ["mybin", "myrustbin"],
- jni_libs: ["libjni"],
- apps: ["myapp"],
- updatable: false,
- }
-
- apex {
- name: "otherapex",
- key: "myapex.key",
- native_shared_libs: ["libotherapex"],
- updatable: false,
- }
-
- apex_key {
- name: "myapex.key",
- public_key: "testkey.avbpubkey",
- private_key: "testkey.pem",
- }
-
- cc_library {
- name: "mylib",
- srcs: ["foo.cpp"],
- apex_available: ["myapex"],
- }
-
- cc_binary {
- name: "mybin",
- srcs: ["foo.cpp"],
- apex_available: ["myapex"],
- }
-
- rust_library {
- name: "libmyrust",
- crate_name: "myrust",
- srcs: ["src/lib.rs"],
- rustlibs: ["libmyrust_transitive_dylib"],
- rlibs: ["libmyrust_transitive_rlib"],
- apex_available: ["myapex"],
- }
-
- rust_library{
- name: "libmyrust_transitive_dylib",
- crate_name: "myrust_transitive_dylib",
- srcs: ["src/lib.rs"],
- apex_available: ["myapex"],
- }
-
- rust_library {
- name: "libmyrust_transitive_rlib",
- crate_name: "myrust_transitive_rlib",
- srcs: ["src/lib.rs"],
- apex_available: ["myapex"],
- }
-
- rust_binary {
- name: "myrustbin",
- srcs: ["src/main.rs"],
- apex_available: ["myapex"],
- }
-
- cc_library {
- name: "libbar",
- sdk_version: "current",
- srcs: ["bar.cpp"],
- apex_available: ["myapex"],
- stl: "none",
- }
-
- android_app {
- name: "myapp",
- jni_libs: ["libembeddedjni"],
- use_embedded_native_libs: true,
- sdk_version: "current",
- apex_available: ["myapex"],
- }
-
- cc_library {
- name: "libembeddedjni",
- sdk_version: "current",
- srcs: ["bar.cpp"],
- apex_available: ["myapex"],
- stl: "none",
- }
-
- cc_library {
- name: "libjni",
- sdk_version: "current",
- srcs: ["bar.cpp"],
- apex_available: ["myapex"],
- stl: "none",
- }
-
- cc_library {
- name: "libotherapex",
- sdk_version: "current",
- srcs: ["otherapex.cpp"],
- apex_available: ["otherapex"],
- stubs: {
- symbol_file: "libotherapex.map.txt",
- versions: ["1", "2", "3"],
- },
- stl: "none",
- }
-
- cc_library {
- name: "libplatform",
- sdk_version: "current",
- srcs: ["libplatform.cpp"],
- stubs: {
- symbol_file: "libplatform.map.txt",
- versions: ["1", "2", "3"],
- },
- stl: "none",
- system_shared_libs: [],
- }
- `
-
- testCases := []struct {
- name string
- bpModifier func(bp *bpmodify.Blueprint)
- dependencyPath []string
- }{
- {
- name: "library dependency in other apex",
- bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
- dependencyPath: []string{"myapex", "mylib", "libotherapex"},
- },
- {
- name: "transitive library dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("mylib", "libbar")(bp)
- addToSharedLibs("libbar", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
- },
- {
- name: "library dependency in platform",
- bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
- dependencyPath: []string{"myapex", "mylib", "libplatform"},
- },
- {
- name: "jni library dependency in other apex",
- bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
- dependencyPath: []string{"myapex", "libjni", "libotherapex"},
- },
- {
- name: "transitive jni library dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libjni", "libbar")(bp)
- addToSharedLibs("libbar", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
- },
- {
- name: "jni library dependency in platform",
- bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
- dependencyPath: []string{"myapex", "libjni", "libplatform"},
- },
- {
- name: "transitive jni library dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libjni", "libbar")(bp)
- addToSharedLibs("libbar", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
- },
- {
- name: "app jni library dependency in other apex",
- bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
- dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
- },
- {
- name: "transitive app jni library dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libembeddedjni", "libbar")(bp)
- addToSharedLibs("libbar", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
- },
- {
- name: "app jni library dependency in platform",
- bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
- dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
- },
- {
- name: "transitive app jni library dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libembeddedjni", "libbar")(bp)
- addToSharedLibs("libbar", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
- },
- {
- name: "binary dependency in other apex",
- bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
- dependencyPath: []string{"myapex", "mybin", "libotherapex"},
- },
- {
- name: "transitive binary dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("mybin", "libbar")(bp)
- addToSharedLibs("libbar", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
- },
- {
- name: "binary dependency in platform",
- bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
- dependencyPath: []string{"myapex", "mybin", "libplatform"},
- },
- {
- name: "transitive binary dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("mybin", "libbar")(bp)
- addToSharedLibs("libbar", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
- },
-
- {
- name: "rust library dependency in other apex",
- bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
- dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
- },
- {
- name: "transitive rust library dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libmyrust", "libbar")(bp)
- addToSharedLibs("libbar", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
- },
- {
- name: "rust library dependency in platform",
- bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
- dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
- },
- {
- name: "transitive rust library dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libmyrust", "libbar")(bp)
- addToSharedLibs("libbar", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
- },
- {
- name: "transitive rust library dylib dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
- },
- {
- name: "transitive rust library dylib dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
- },
- {
- name: "transitive rust library rlib dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
- },
- {
- name: "transitive rust library rlib dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
- },
- {
- name: "rust binary dependency in other apex",
- bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
- dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
- },
- {
- name: "transitive rust binary dependency in other apex",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("myrustbin", "libbar")(bp)
- addToSharedLibs("libbar", "libotherapex#impl")(bp)
- },
- dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
- },
- {
- name: "rust binary dependency in platform",
- bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
- dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
- },
- {
- name: "transitive rust binary dependency in platform",
- bpModifier: func(bp *bpmodify.Blueprint) {
- addToSharedLibs("myrustbin", "libbar")(bp)
- addToSharedLibs("libbar", "libplatform#impl")(bp)
- },
- dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
- },
- }
-
- for _, testCase := range testCases {
- t.Run(testCase.name, func(t *testing.T) {
- t.Parallel()
- bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
- if err != nil {
- t.Fatal(err)
- }
- if testCase.bpModifier != nil {
- func() {
- defer func() {
- if r := recover(); r != nil {
- t.Fatalf("panic in bpModifier: %v", r)
- }
- }()
- testCase.bpModifier(bp)
- }()
- }
- android.GroupFixturePreparers(
- android.PrepareForTestWithAndroidBuildComponents,
- cc.PrepareForTestWithCcBuildComponents,
- java.PrepareForTestWithDexpreopt,
- rust.PrepareForTestWithRustDefaultModules,
- PrepareForTestWithApexBuildComponents,
- prepareForTestWithMyapex,
- prepareForTestWithOtherapex,
- android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
- variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
- }),
- ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
- RunTestWithBp(t, bp.String())
- })
- }
-}
diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go
index d0bff625d..c7674b58a 100644
--- a/apex/bootclasspath_fragment_test.go
+++ b/apex/bootclasspath_fragment_test.go
@@ -242,6 +242,7 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) {
apex_available: [
"com.android.art",
],
+ min_sdk_version: "33",
}
`, content)
}
@@ -711,7 +712,7 @@ func TestBootclasspathFragmentContentsNoName(t *testing.T) {
copyCommands := apexRule.Args["copy_commands"]
// Make sure that the fragment provides the hidden API encoded dex jars to the APEX.
- fragment := result.Module("mybootclasspathfragment", "android_common_apex10000")
+ fragment := result.Module("mybootclasspathfragment", "android_common_myapex")
info, _ := android.OtherModuleProvider(result, fragment, java.BootclasspathFragmentApexContentInfoProvider)
@@ -727,8 +728,8 @@ func TestBootclasspathFragmentContentsNoName(t *testing.T) {
android.AssertStringDoesContain(t, name+" apex copy command", copyCommands, expectedCopyCommand)
}
- checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/foo.jar")
- checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar")
+ checkFragmentExportedDexJar("foo", "out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/hiddenapi-modular/encoded/foo.jar")
+ checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/hiddenapi-modular/encoded/bar.jar")
}
func getDexJarPath(result *android.TestResult, name string) string {
@@ -859,7 +860,7 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
}
`)
- java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
+ java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
"all_apex_contributions",
"art-bootclasspath-fragment",
"bar",
@@ -874,7 +875,7 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib")
// Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags.
- fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
+ fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
command := rule.RuleParams.Command
@@ -1032,7 +1033,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
}
`)
- java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
+ java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
"all_apex_contributions",
"android-non-updatable.stubs",
"android-non-updatable.stubs.module_lib",
@@ -1051,7 +1052,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
// Make sure that the fragment uses the android-non-updatable modules when generating the hidden
// API flags.
- fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
+ fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
command := rule.RuleParams.Command
@@ -1206,7 +1207,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
}
`)
- java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
+ java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
"all_apex_contributions",
"android-non-updatable.stubs",
"android-non-updatable.stubs.system",
@@ -1222,7 +1223,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
// Make sure that the fragment uses the android-non-updatable modules when generating the hidden
// API flags.
- fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
+ fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
command := rule.RuleParams.Command
@@ -1361,7 +1362,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test
}
`)
- java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{
+ java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{
"all_apex_contributions",
"art-bootclasspath-fragment",
"bar",
@@ -1380,7 +1381,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test
// Make sure that the fragment uses the android-non-updatable modules when generating the hidden
// API flags.
- fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
+ fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
rule := fragment.Rule("modularHiddenAPIStubFlagsFile")
command := rule.RuleParams.Command
@@ -1463,7 +1464,7 @@ func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) {
}
`)
- fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000")
+ fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex")
classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto"))
// foo
ensureContains(t, classPathProtoContent, `jars {
diff --git a/apex/classpath_element_test.go b/apex/classpath_element_test.go
index f3671743a..55f1475f7 100644
--- a/apex/classpath_element_test.go
+++ b/apex/classpath_element_test.go
@@ -198,11 +198,11 @@ func TestCreateClasspathElements(t *testing.T) {
result := preparer.RunTest(t)
- artFragment := result.Module("art-bootclasspath-fragment", "android_common_apex10000")
+ artFragment := result.Module("art-bootclasspath-fragment", "android_common_com.android.art")
artBaz := result.Module("baz", "android_common_apex10000")
artQuuz := result.Module("quuz", "android_common_apex10000")
- myFragment := result.Module("mybootclasspath-fragment", "android_common_apex10000")
+ myFragment := result.Module("mybootclasspath-fragment", "android_common_myapex")
myBar := result.Module("bar", "android_common_apex10000")
other := result.Module("othersdklibrary", "android_common_apex10000")
diff --git a/apex/dexpreopt_bootjars_test.go b/apex/dexpreopt_bootjars_test.go
index b51bb36cf..6fa1fe225 100644
--- a/apex/dexpreopt_bootjars_test.go
+++ b/apex/dexpreopt_bootjars_test.go
@@ -176,7 +176,7 @@ func TestDexpreoptBootJarsWithSourceArtApex(t *testing.T) {
"out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar",
"out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar",
"out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar",
- "out/soong/.intermediates/art-bootclasspath-fragment/android_common_apex10000/art-bootclasspath-fragment/boot.prof",
+ "out/soong/.intermediates/art-bootclasspath-fragment/android_common_com.android.art/art-bootclasspath-fragment/boot.prof",
"out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof",
"out/soong/dexpreopt/uffd_gc_flag.txt",
}
@@ -396,7 +396,7 @@ func TestDexpreoptProfileWithMultiplePrebuiltArtApexes(t *testing.T) {
{
desc: "Source apex com.android.art is selected, profile should come from source java library",
selectedArtApexContributions: "art.source.contributions",
- expectedProfile: "out/soong/.intermediates/art-bootclasspath-fragment/android_common_apex10000/art-bootclasspath-fragment/boot.prof",
+ expectedProfile: "out/soong/.intermediates/art-bootclasspath-fragment/android_common_com.android.art/art-bootclasspath-fragment/boot.prof",
},
{
desc: "Prebuilt apex prebuilt_com.android.art is selected, profile should come from .prof deapexed from the prebuilt",
diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go
index c13d59989..8b5fce91c 100644
--- a/apex/platform_bootclasspath_test.go
+++ b/apex/platform_bootclasspath_test.go
@@ -165,12 +165,12 @@ func TestPlatformBootclasspath_Fragments(t *testing.T) {
android.AssertPathsRelativeToTopEquals(t, message, expected, info.FlagsFilesByCategory[category])
}
- android.AssertPathsRelativeToTopEquals(t, "annotation flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/annotation-flags.csv"}, info.AnnotationFlagsPaths)
- android.AssertPathsRelativeToTopEquals(t, "metadata flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/metadata.csv"}, info.MetadataPaths)
- android.AssertPathsRelativeToTopEquals(t, "index flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/index.csv"}, info.IndexPaths)
+ android.AssertPathsRelativeToTopEquals(t, "annotation flags", []string{"out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv"}, info.AnnotationFlagsPaths)
+ android.AssertPathsRelativeToTopEquals(t, "metadata flags", []string{"out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/metadata.csv"}, info.MetadataPaths)
+ android.AssertPathsRelativeToTopEquals(t, "index flags", []string{"out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/index.csv"}, info.IndexPaths)
- android.AssertArrayString(t, "stub flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/filtered-stub-flags.csv:out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/signature-patterns.csv"}, info.StubFlagSubsets.RelativeToTop())
- android.AssertArrayString(t, "all flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/signature-patterns.csv"}, info.FlagSubsets.RelativeToTop())
+ android.AssertArrayString(t, "stub flags", []string{"out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv:out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv"}, info.StubFlagSubsets.RelativeToTop())
+ android.AssertArrayString(t, "all flags", []string{"out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/bar-fragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv"}, info.FlagSubsets.RelativeToTop())
}
// TestPlatformBootclasspath_LegacyPrebuiltFragment verifies that the
diff --git a/cc/cc.go b/cc/cc.go
index 027992868..ad6468d6c 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -839,6 +839,7 @@ type libraryDependencyTag struct {
reexportFlags bool
explicitlyVersioned bool
+ explicitlyImpl bool
dataLib bool
ndk bool
@@ -934,6 +935,11 @@ var (
llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
)
+func IsExplicitImplSharedDepTag(depTag blueprint.DependencyTag) bool {
+ ccLibDepTag, ok := depTag.(libraryDependencyTag)
+ return ok && ccLibDepTag.shared() && ccLibDepTag.explicitlyImpl
+}
+
func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
ccLibDepTag, ok := depTag.(libraryDependencyTag)
return ok && ccLibDepTag.shared()
@@ -2699,6 +2705,9 @@ func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mo
variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
if tag, ok := depTag.(libraryDependencyTag); ok {
tag.explicitlyVersioned = true
+ if version == "" {
+ tag.explicitlyImpl = true
+ }
// depTag is an interface that contains a concrete non-pointer struct. That makes the local
// tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
// the modified copy to depTag.
@@ -4074,7 +4083,7 @@ func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
if c.HasStubsVariants() {
- if IsSharedDepTag(depTag) {
+ if IsSharedDepTag(depTag) && !IsExplicitImplSharedDepTag(depTag) {
// dynamic dep to a stubs lib crosses APEX boundary
return false
}
diff --git a/cc/strip.go b/cc/strip.go
index 36c0c489a..a950df898 100644
--- a/cc/strip.go
+++ b/cc/strip.go
@@ -23,10 +23,8 @@ import (
// StripProperties defines the type of stripping applied to the module.
type StripProperties struct {
Strip struct {
- // none forces all stripping to be disabled.
- // Device modules default to stripping enabled leaving mini debuginfo.
- // Host modules default to stripping disabled, but can be enabled by setting any other
- // strip boolean property.
+ // Device and host modules default to stripping enabled leaving mini debuginfo.
+ // This can be disabled by setting none to true.
None *bool `android:"arch_variant"`
// all forces stripping everything, including the mini debug info.
diff --git a/filesystem/android_device_product_out.go b/filesystem/android_device_product_out.go
index 1175c428c..c06715ab8 100644
--- a/filesystem/android_device_product_out.go
+++ b/filesystem/android_device_product_out.go
@@ -36,6 +36,7 @@ func (a *androidDevice) copyFilesToProductOutForSoongOnly(ctx android.ModuleCont
filesystemInfos := a.getFsInfos(ctx)
var deps android.Paths
+ var depsNoImg android.Paths // subset of deps without any img files. used for sbom creation.
for _, partition := range android.SortedKeys(filesystemInfos) {
info := filesystemInfos[partition]
@@ -86,6 +87,7 @@ func (a *androidDevice) copyFilesToProductOutForSoongOnly(ctx android.ModuleCont
ctx.Phony(info.ModuleName, fip.FullInstallPath)
ctx.Phony(partition, fip.FullInstallPath)
deps = append(deps, fip.FullInstallPath)
+ depsNoImg = append(depsNoImg, fip.FullInstallPath)
ctx.Phony("sync_"+partition, fip.FullInstallPath)
ctx.Phony("sync", fip.FullInstallPath)
}
@@ -94,6 +96,8 @@ func (a *androidDevice) copyFilesToProductOutForSoongOnly(ctx android.ModuleCont
deps = append(deps, imgInstallPath)
}
+ a.createComplianceMetadataTimestamp(ctx, depsNoImg)
+
// List all individual files to be copied to PRODUCT_OUT here
if a.deviceProps.Bootloader != nil {
bootloaderInstallPath := android.PathForModuleInPartitionInstall(ctx, "", "bootloader")
@@ -176,6 +180,17 @@ func (a *androidDevice) copyFilesToProductOutForSoongOnly(ctx android.ModuleCont
return copyToProductOutTimestamp
}
+// createComplianceMetadataTimestampForSoongOnly creates a timestamp file in m --soong-only
+// this timestamp file depends on installed files of the main `android_device`.
+// Any changes to installed files of the main `android_device` will retrigger SBOM generation
+func (a *androidDevice) createComplianceMetadataTimestamp(ctx android.ModuleContext, installedFiles android.Paths) {
+ ctx.Build(pctx, android.BuildParams{
+ Rule: android.Touch,
+ Implicits: installedFiles,
+ Output: android.PathForOutput(ctx, "compliance-metadata", ctx.Config().DeviceProduct(), "installed_files.stamp"),
+ })
+}
+
// Returns a mapping from partition type -> FilesystemInfo. This includes filesystems that are
// nested inside of other partitions, such as the partitions inside super.img, or ramdisk inside
// of boot.
diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go
index d6777e50e..f6d6cad4a 100644
--- a/java/bootclasspath_fragment.go
+++ b/java/bootclasspath_fragment.go
@@ -290,6 +290,10 @@ func testBootclasspathFragmentFactory() android.Module {
return m
}
+func (m *BootclasspathFragmentModule) UniqueApexVariations() bool {
+ return true
+}
+
func (m *BootclasspathFragmentModule) bootclasspathFragmentPropertyCheck(ctx android.ModuleContext) {
contents := m.properties.Contents.GetOrDefault(ctx, nil)
if len(contents) == 0 {
@@ -527,19 +531,18 @@ func (b *BootclasspathFragmentModule) getProfileProviderApex(ctx android.BaseMod
}
// Bootclasspath fragment modules that are for the platform do not produce boot related files.
- apexInfos, _ := android.ModuleProvider(ctx, android.AllApexInfoProvider)
- if apexInfos == nil {
+ apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
+ if apexInfo.IsForPlatform() {
return ""
}
- for _, apexInfo := range apexInfos.ApexInfos {
- for _, apex := range apexInfo.InApexVariants {
- if isProfileProviderApex(ctx, apex) {
- return apex
+ for _, config := range genBootImageConfigs(ctx) {
+ if config.profileProviderModule == b.BaseModuleName() {
+ if len(config.profileImports) > 0 {
+ return config.profileImports[0]
}
}
}
-
return ""
}
diff --git a/java/dex.go b/java/dex.go
index 00a0537e8..64465a2de 100644
--- a/java/dex.go
+++ b/java/dex.go
@@ -234,21 +234,29 @@ func (d *dexer) dexCommonFlags(ctx android.ModuleContext,
deps = append(deps, f)
}
- var requestReleaseMode bool
+ var requestReleaseMode, requestDebugMode bool
requestReleaseMode, flags = android.RemoveFromList("--release", flags)
+ requestDebugMode, flags = android.RemoveFromList("--debug", flags)
if ctx.Config().Getenv("NO_OPTIMIZE_DX") != "" || ctx.Config().Getenv("GENERATE_DEX_DEBUG") != "" {
- flags = append(flags, "--debug")
+ requestDebugMode = true
requestReleaseMode = false
}
// Don't strip out debug information for eng builds, unless the target
// explicitly provided the `--release` build flag. This allows certain
// test targets to remain optimized as part of eng test_suites builds.
- if requestReleaseMode {
+ if requestDebugMode {
+ flags = append(flags, "--debug")
+ } else if requestReleaseMode {
flags = append(flags, "--release")
} else if ctx.Config().Eng() {
flags = append(flags, "--debug")
+ } else if !d.effectiveOptimizeEnabled() && d.dexProperties.Optimize.EnabledByDefault {
+ // D8 uses --debug by default, whereas R8 uses --release by default.
+ // For targets that default to R8 usage (e.g., apps), but override this default, we still
+ // want D8 to run in release mode, preserving semantics as much as possible between the two.
+ flags = append(flags, "--release")
}
// Supplying the platform build flag disables various features like API modeling and desugaring.
diff --git a/java/dex_test.go b/java/dex_test.go
index f261066df..4e515b403 100644
--- a/java/dex_test.go
+++ b/java/dex_test.go
@@ -16,6 +16,7 @@ package java
import (
"fmt"
+ "strconv"
"testing"
"android/soong/android"
@@ -311,14 +312,25 @@ func TestD8(t *testing.T) {
name: "static_lib",
srcs: ["foo.java"],
}
+
+ android_app {
+ name: "app",
+ srcs: ["foo.java"],
+ platform_apis: true,
+ optimize: {
+ enabled: false,
+ },
+ }
`)
foo := result.ModuleForTests("foo", "android_common")
lib := result.ModuleForTests("lib", "android_common")
+ app := result.ModuleForTests("app", "android_common")
staticLib := result.ModuleForTests("static_lib", "android_common")
fooJavac := foo.Rule("javac")
fooD8 := foo.Rule("d8")
+ appD8 := app.Rule("d8")
libHeader := lib.Output("turbine-combined/lib.jar").Output
staticLibHeader := staticLib.Output("turbine-combined/static_lib.jar").Output
@@ -331,6 +343,16 @@ func TestD8(t *testing.T) {
fooD8.Args["d8Flags"], libHeader.String())
android.AssertStringDoesNotContain(t, "expected no static_lib header jar in foo javac classpath",
fooD8.Args["d8Flags"], staticLibHeader.String())
+
+ // A --release flag is added only for targets that opt out of default R8 behavior (e.g., apps).
+ // For library targets that don't use R8 by default, no --debug or --release flag should be
+ // added, instead relying on default D8 behavior (--debug).
+ android.AssertStringDoesContain(t, "expected --release in app d8 flags",
+ appD8.Args["d8Flags"], "--release")
+ android.AssertStringDoesNotContain(t, "expected no --release flag in lib d8 flags",
+ fooD8.Args["d8Flags"], "--release")
+ android.AssertStringDoesNotContain(t, "expected no --debug flag in lib d8 flags",
+ fooD8.Args["d8Flags"], "--debug")
}
func TestProguardFlagsInheritanceStatic(t *testing.T) {
@@ -732,6 +754,9 @@ func TestDebugReleaseFlags(t *testing.T) {
name: "app",
srcs: ["foo.java"],
platform_apis: true,
+ optimize: {
+ enabled: %s,
+ },
dxflags: ["%s"]
}
`
@@ -740,6 +765,7 @@ func TestDebugReleaseFlags(t *testing.T) {
name string
envVar string
isEng bool
+ useD8 bool
dxFlags string
expectedFlags string
}{
@@ -779,6 +805,19 @@ func TestDebugReleaseFlags(t *testing.T) {
// Eng mode does *not* override explicit dxflags.
expectedFlags: "--release",
},
+ {
+ name: "app_d8",
+ useD8: true,
+ // D8 usage w/ apps should explicitly enable --release mode.
+ expectedFlags: "--release",
+ },
+ {
+ name: "app_d8_debug",
+ useD8: true,
+ dxFlags: "--debug",
+ // D8 usage w/ apps respects overriding dxFlags.
+ expectedFlags: "--debug",
+ },
}
for _, tc := range testcases {
@@ -801,11 +840,16 @@ func TestDebugReleaseFlags(t *testing.T) {
}),
)
}
- result := fixturePreparer.RunTestWithBp(t, fmt.Sprintf(bp, tc.dxFlags))
+ result := fixturePreparer.RunTestWithBp(t, fmt.Sprintf(bp, strconv.FormatBool(!tc.useD8), tc.dxFlags))
- appR8 := result.ModuleForTests("app", "android_common").Rule("r8")
- android.AssertStringDoesContain(t, "expected flag in R8 flags",
- appR8.Args["r8Flags"], tc.expectedFlags)
+ dexRuleKey := "r8"
+ if tc.useD8 {
+ dexRuleKey = "d8"
+ }
+ dexFlagsKey := dexRuleKey + "Flags"
+ appDex := result.ModuleForTests("app", "android_common").Rule(dexRuleKey)
+ android.AssertStringDoesContain(t, "expected flag in dex flags",
+ appDex.Args[dexFlagsKey], tc.expectedFlags)
var unexpectedFlags string
if tc.expectedFlags == "--debug" {
@@ -814,8 +858,8 @@ func TestDebugReleaseFlags(t *testing.T) {
unexpectedFlags = "--debug"
}
if unexpectedFlags != "" {
- android.AssertStringDoesNotContain(t, "unexpected flag in R8 flags",
- appR8.Args["r8Flags"], unexpectedFlags)
+ android.AssertStringDoesNotContain(t, "unexpected flag in dex flags",
+ appDex.Args[dexFlagsKey], unexpectedFlags)
}
})
}
diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go
index 8c60d2399..093cc876b 100644
--- a/java/dexpreopt_bootjars.go
+++ b/java/dexpreopt_bootjars.go
@@ -293,6 +293,9 @@ type bootImageConfig struct {
// Profiles imported from APEXes, in addition to the profile at the default path. Each entry must
// be the name of an APEX module.
profileImports []string
+
+ // The name of the module that provides boot image profiles, if any.
+ profileProviderModule string
}
// Target-dependent description of a boot image.
@@ -563,6 +566,9 @@ func addDependenciesOntoSelectedBootImageApexes(ctx android.BottomUpMutatorConte
// The prebuilt might have been renamed by prebuilt_rename mutator if the source module does not exist.
// Remove the prebuilt_ prefix.
ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, android.RemoveOptionalPrebuiltPrefix(selected))
+ } else {
+ // Couldn't find a dependency, do it again to report an error.
+ ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, selected)
}
}
}
diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go
index dc0973cdf..fb5c325d3 100644
--- a/java/dexpreopt_config.go
+++ b/java/dexpreopt_config.go
@@ -67,15 +67,16 @@ func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig
// ART boot image for testing only. Do not rely on it to make any build-time decision.
artCfg := bootImageConfig{
- name: artBootImageName,
- enabledIfExists: "art-bootclasspath-fragment",
- stem: bootImageStem,
- installDir: "apex/art_boot_images/javalib",
- modules: global.TestOnlyArtBootImageJars,
- preloadedClassesFile: "art/build/boot/preloaded-classes",
- compilerFilter: "speed-profile",
- singleImage: false,
- profileImports: profileImports,
+ name: artBootImageName,
+ enabledIfExists: "art-bootclasspath-fragment",
+ stem: bootImageStem,
+ installDir: "apex/art_boot_images/javalib",
+ modules: global.TestOnlyArtBootImageJars,
+ preloadedClassesFile: "art/build/boot/preloaded-classes",
+ compilerFilter: "speed-profile",
+ singleImage: false,
+ profileImports: profileImports,
+ profileProviderModule: "art-bootclasspath-fragment",
}
// Framework config for the boot image extension.
diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go
index 152eb1eeb..86062d489 100644
--- a/java/platform_bootclasspath.go
+++ b/java/platform_bootclasspath.go
@@ -15,6 +15,8 @@
package java
import (
+ "github.com/google/blueprint"
+
"android/soong/android"
"android/soong/dexpreopt"
)
@@ -33,9 +35,18 @@ var (
platformBootclasspathArtBootJarDepTag = bootclasspathDependencyTag{name: "art-boot-jar"}
platformBootclasspathBootJarDepTag = bootclasspathDependencyTag{name: "platform-boot-jar"}
platformBootclasspathApexBootJarDepTag = bootclasspathDependencyTag{name: "apex-boot-jar"}
- platformBootclasspathImplLibDepTag = dependencyTag{name: "impl-lib-tag"}
)
+type platformBootclasspathImplLibDepTagType struct {
+ blueprint.BaseDependencyTag
+}
+
+func (p platformBootclasspathImplLibDepTagType) ExcludeFromVisibilityEnforcement() {}
+
+var platformBootclasspathImplLibDepTag platformBootclasspathImplLibDepTagType
+
+var _ android.ExcludeFromVisibilityEnforcementTag = platformBootclasspathImplLibDepTag
+
type platformBootclasspathModule struct {
android.ModuleBase
ClasspathFragmentBase
diff --git a/java/systemserver_classpath_fragment.go b/java/systemserver_classpath_fragment.go
index 3176ad94c..f3074ed0a 100644
--- a/java/systemserver_classpath_fragment.go
+++ b/java/systemserver_classpath_fragment.go
@@ -58,6 +58,10 @@ func platformSystemServerClasspathFactory() android.Module {
return m
}
+func (m *platformSystemServerClasspathModule) UniqueApexVariations() bool {
+ return true
+}
+
func (p *platformSystemServerClasspathModule) AndroidMkEntries() (entries []android.AndroidMkEntries) {
return p.classpathFragmentBase().androidMkEntries()
}
@@ -115,6 +119,9 @@ func systemServerClasspathFactory() android.Module {
android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
return m
}
+func (m *SystemServerClasspathModule) UniqueApexVariations() bool {
+ return true
+}
func (s *SystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if len(s.properties.Contents.GetOrDefault(ctx, nil)) == 0 && len(s.properties.Standalone_contents.GetOrDefault(ctx, nil)) == 0 {
diff --git a/rust/binary.go b/rust/binary.go
index 3c7a48274..5a03d91c2 100644
--- a/rust/binary.go
+++ b/rust/binary.go
@@ -139,7 +139,10 @@ func (binary *binaryDecorator) compile(ctx ModuleContext, flags Flags, deps Path
flags.RustFlags = append(flags.RustFlags, deps.depFlags...)
flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...)
- flags.LinkFlags = append(flags.LinkFlags, deps.linkObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.rustLibObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.sharedLibObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.staticLibObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.wholeStaticLibObjects...)
if binary.stripper.NeedsStrip(ctx) {
strippedOutputFile := outputFile
diff --git a/rust/config/global.go b/rust/config/global.go
index 2623a5caa..907316fab 100644
--- a/rust/config/global.go
+++ b/rust/config/global.go
@@ -25,7 +25,7 @@ import (
var (
pctx = android.NewPackageContext("android/soong/rust/config")
- RustDefaultVersion = "1.82.0"
+ RustDefaultVersion = "1.83.0"
RustDefaultBase = "prebuilts/rust/"
DefaultEdition = "2021"
Stdlibs = []string{
diff --git a/rust/library.go b/rust/library.go
index 3686bf972..94f5730ea 100644
--- a/rust/library.go
+++ b/rust/library.go
@@ -674,7 +674,10 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa
flags.RustFlags = append(flags.RustFlags, deps.depFlags...)
flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...)
- flags.LinkFlags = append(flags.LinkFlags, deps.linkObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.rustLibObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.sharedLibObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.staticLibObjects...)
+ flags.LinkFlags = append(flags.LinkFlags, deps.wholeStaticLibObjects...)
if String(library.Properties.Version_script) != "" {
if String(library.Properties.Extra_exported_symbols) != "" {
@@ -722,9 +725,17 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa
ret.kytheFile = TransformSrctoShared(ctx, crateRootPath, deps, flags, outputFile).kytheFile
}
+ // rlibs and dylibs propagate their shared, whole static, and rustlib dependencies
if library.rlib() || library.dylib() {
library.flagExporter.exportLinkDirs(deps.linkDirs...)
- library.flagExporter.exportLinkObjects(deps.linkObjects...)
+ library.flagExporter.exportRustLibs(deps.rustLibObjects...)
+ library.flagExporter.exportSharedLibs(deps.sharedLibObjects...)
+ library.flagExporter.exportWholeStaticLibs(deps.wholeStaticLibObjects...)
+ }
+
+ // rlibs also propagate their staticlibs dependencies
+ if library.rlib() {
+ library.flagExporter.exportStaticLibs(deps.staticLibObjects...)
}
// Since we have FFI rlibs, we need to collect their includes as well
@@ -759,6 +770,7 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa
}
cc.AddStubDependencyProviders(ctx)
+ // Set our flagexporter provider to export relevant Rust flags
library.flagExporter.setProvider(ctx)
return ret
diff --git a/rust/rust.go b/rust/rust.go
index 9082678bc..7880dee8c 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -500,8 +500,11 @@ type PathDeps struct {
// linkDirs are link paths passed via -L to rustc. linkObjects are objects passed directly to the linker
// Both of these are exported and propagate to dependencies.
- linkDirs []string
- linkObjects []string
+ linkDirs []string
+ rustLibObjects []string
+ staticLibObjects []string
+ wholeStaticLibObjects []string
+ sharedLibObjects []string
// exportedLinkDirs are exported linkDirs for direct rlib dependencies to
// cc_library_static dependants of rlibs.
@@ -534,7 +537,10 @@ type RustLibrary struct {
type exportedFlagsProducer interface {
exportLinkDirs(...string)
- exportLinkObjects(...string)
+ exportRustLibs(...string)
+ exportStaticLibs(...string)
+ exportWholeStaticLibs(...string)
+ exportSharedLibs(...string)
}
type xref interface {
@@ -542,23 +548,41 @@ type xref interface {
}
type flagExporter struct {
- linkDirs []string
- ccLinkDirs []string
- linkObjects []string
+ linkDirs []string
+ ccLinkDirs []string
+ rustLibPaths []string
+ staticLibObjects []string
+ sharedLibObjects []string
+ wholeStaticLibObjects []string
}
func (flagExporter *flagExporter) exportLinkDirs(dirs ...string) {
flagExporter.linkDirs = android.FirstUniqueStrings(append(flagExporter.linkDirs, dirs...))
}
-func (flagExporter *flagExporter) exportLinkObjects(flags ...string) {
- flagExporter.linkObjects = android.FirstUniqueStrings(append(flagExporter.linkObjects, flags...))
+func (flagExporter *flagExporter) exportRustLibs(flags ...string) {
+ flagExporter.rustLibPaths = android.FirstUniqueStrings(append(flagExporter.rustLibPaths, flags...))
+}
+
+func (flagExporter *flagExporter) exportStaticLibs(flags ...string) {
+ flagExporter.staticLibObjects = android.FirstUniqueStrings(append(flagExporter.staticLibObjects, flags...))
+}
+
+func (flagExporter *flagExporter) exportSharedLibs(flags ...string) {
+ flagExporter.sharedLibObjects = android.FirstUniqueStrings(append(flagExporter.sharedLibObjects, flags...))
+}
+
+func (flagExporter *flagExporter) exportWholeStaticLibs(flags ...string) {
+ flagExporter.wholeStaticLibObjects = android.FirstUniqueStrings(append(flagExporter.wholeStaticLibObjects, flags...))
}
func (flagExporter *flagExporter) setProvider(ctx ModuleContext) {
android.SetProvider(ctx, FlagExporterInfoProvider, FlagExporterInfo{
- LinkDirs: flagExporter.linkDirs,
- LinkObjects: flagExporter.linkObjects,
+ LinkDirs: flagExporter.linkDirs,
+ RustLibObjects: flagExporter.rustLibPaths,
+ StaticLibObjects: flagExporter.staticLibObjects,
+ WholeStaticLibObjects: flagExporter.wholeStaticLibObjects,
+ SharedLibPaths: flagExporter.sharedLibObjects,
})
}
@@ -569,9 +593,12 @@ func NewFlagExporter() *flagExporter {
}
type FlagExporterInfo struct {
- Flags []string
- LinkDirs []string // TODO: this should be android.Paths
- LinkObjects []string // TODO: this should be android.Paths
+ Flags []string
+ LinkDirs []string
+ RustLibObjects []string
+ StaticLibObjects []string
+ WholeStaticLibObjects []string
+ SharedLibPaths []string
}
var FlagExporterInfoProvider = blueprint.NewProvider[FlagExporterInfo]()
@@ -1550,10 +1577,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
}
exportedInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
- //Append the dependencies exportedDirs, except for proc-macros which target a different arch/OS
+
+ //Append the dependencies exported objects, except for proc-macros which target a different arch/OS
if depTag != procMacroDepTag {
depPaths.depFlags = append(depPaths.depFlags, exportedInfo.Flags...)
- depPaths.linkObjects = append(depPaths.linkObjects, exportedInfo.LinkObjects...)
+ depPaths.rustLibObjects = append(depPaths.rustLibObjects, exportedInfo.RustLibObjects...)
+ depPaths.sharedLibObjects = append(depPaths.sharedLibObjects, exportedInfo.SharedLibPaths...)
+ depPaths.staticLibObjects = append(depPaths.staticLibObjects, exportedInfo.StaticLibObjects...)
+ depPaths.wholeStaticLibObjects = append(depPaths.wholeStaticLibObjects, exportedInfo.WholeStaticLibObjects...)
depPaths.linkDirs = append(depPaths.linkDirs, exportedInfo.LinkDirs...)
}
@@ -1586,8 +1617,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
return
}
}
- linkObject := linkableInfo.OutputFile
- if !linkObject.Valid() {
+ ccLibPath := linkableInfo.OutputFile
+ if !ccLibPath.Valid() {
if !ctx.Config().AllowMissingDependencies() {
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
} else {
@@ -1596,7 +1627,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
return
}
- linkPath := linkPathFromFilePath(linkObject.Path())
+ linkPath := linkPathFromFilePath(ccLibPath.Path())
exportDep := false
switch {
@@ -1605,20 +1636,25 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
// rustc will bundle static libraries when they're passed with "-lstatic=<lib>". This will fail
// if the library is not prefixed by "lib".
if mod.Binary() {
- // Binaries may sometimes need to link whole static libraries that don't start with 'lib'.
// Since binaries don't need to 'rebundle' these like libraries and only use these for the
// final linkage, pass the args directly to the linker to handle these cases.
- depPaths.depLinkFlags = append(depPaths.depLinkFlags, []string{"-Wl,--whole-archive", linkObject.Path().String(), "-Wl,--no-whole-archive"}...)
- } else if libName, ok := libNameFromFilePath(linkObject.Path()); ok {
- depPaths.depFlags = append(depPaths.depFlags, "-lstatic="+libName)
+ depPaths.depLinkFlags = append(depPaths.depLinkFlags, []string{"-Wl,--whole-archive", ccLibPath.Path().String(), "-Wl,--no-whole-archive"}...)
+ } else if libName, ok := libNameFromFilePath(ccLibPath.Path()); ok {
+ depPaths.depFlags = append(depPaths.depFlags, "-lstatic:+whole-archive="+libName)
+ depPaths.depLinkFlags = append(depPaths.depLinkFlags, ccLibPath.Path().String())
} else {
ctx.ModuleErrorf("'%q' cannot be listed as a whole_static_library in Rust modules unless the output is prefixed by 'lib'", depName, ctx.ModuleName())
}
}
- // Add this to linkObjects to pass the library directly to the linker as well. This propagates
- // to dependencies to avoid having to redeclare static libraries for dependents of the dylib variant.
- depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
+ if cc.IsWholeStaticLib(depTag) {
+ // Add whole staticlibs to wholeStaticLibObjects to propagate to Rust all dependents.
+ depPaths.wholeStaticLibObjects = append(depPaths.wholeStaticLibObjects, ccLibPath.String())
+ } else {
+ // Otherwise add to staticLibObjects, which only propagate through rlibs to their dependents.
+ depPaths.staticLibObjects = append(depPaths.staticLibObjects, ccLibPath.String())
+
+ }
depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider)
@@ -1650,8 +1686,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
// Re-get linkObject as ChooseStubOrImpl actually tells us which
// object (either from stub or non-stub) to use.
- linkObject = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
- if !linkObject.Valid() {
+ ccLibPath = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
+ if !ccLibPath.Valid() {
if !ctx.Config().AllowMissingDependencies() {
ctx.ModuleErrorf("Invalid output file when adding dep %q to %q", depName, ctx.ModuleName())
} else {
@@ -1659,10 +1695,10 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
}
return
}
- linkPath = linkPathFromFilePath(linkObject.Path())
+ linkPath = linkPathFromFilePath(ccLibPath.Path())
depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
- depPaths.linkObjects = append(depPaths.linkObjects, linkObject.String())
+ depPaths.sharedLibObjects = append(depPaths.sharedLibObjects, ccLibPath.String())
depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...)
depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...)
depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...)
@@ -1681,15 +1717,15 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...)
mod.Properties.AndroidMkHeaderLibs = append(mod.Properties.AndroidMkHeaderLibs, makeLibName)
case depTag == cc.CrtBeginDepTag:
- depPaths.CrtBegin = append(depPaths.CrtBegin, linkObject.Path())
+ depPaths.CrtBegin = append(depPaths.CrtBegin, ccLibPath.Path())
case depTag == cc.CrtEndDepTag:
- depPaths.CrtEnd = append(depPaths.CrtEnd, linkObject.Path())
+ depPaths.CrtEnd = append(depPaths.CrtEnd, ccLibPath.Path())
}
- // Make sure these dependencies are propagated
+ // Make sure shared dependencies are propagated
if lib, ok := mod.compiler.(exportedFlagsProducer); ok && exportDep {
lib.exportLinkDirs(linkPath)
- lib.exportLinkObjects(linkObject.String())
+ lib.exportSharedLibs(ccLibPath.String())
}
} else {
switch {
@@ -1772,7 +1808,10 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
// Dedup exported flags from dependencies
depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs)
- depPaths.linkObjects = android.FirstUniqueStrings(depPaths.linkObjects)
+ depPaths.rustLibObjects = android.FirstUniqueStrings(depPaths.rustLibObjects)
+ depPaths.staticLibObjects = android.FirstUniqueStrings(depPaths.staticLibObjects)
+ depPaths.wholeStaticLibObjects = android.FirstUniqueStrings(depPaths.wholeStaticLibObjects)
+ depPaths.sharedLibObjects = android.FirstUniqueStrings(depPaths.sharedLibObjects)
depPaths.depFlags = android.FirstUniqueStrings(depPaths.depFlags)
depPaths.depClangFlags = android.FirstUniqueStrings(depPaths.depClangFlags)
depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths)
@@ -2093,7 +2132,7 @@ func (mod *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool
}
if mod.HasStubsVariants() {
- if cc.IsSharedDepTag(depTag) {
+ if cc.IsSharedDepTag(depTag) && !cc.IsExplicitImplSharedDepTag(depTag) {
// dynamic dep to a stubs lib crosses APEX boundary
return false
}
diff --git a/rust/rust_test.go b/rust/rust_test.go
index 9f65dec41..858c4db95 100644
--- a/rust/rust_test.go
+++ b/rust/rust_test.go
@@ -204,7 +204,7 @@ func TestDepsTracking(t *testing.T) {
t.Errorf("Static library dependency not detected (dependency missing from AndroidMkStaticLibs)")
}
- if !strings.Contains(rustc.Args["rustcFlags"], "-lstatic=wholestatic") {
+ if !strings.Contains(rustc.Args["rustcFlags"], "-lstatic:+whole-archive=wholestatic") {
t.Errorf("-lstatic flag not being passed to rustc for static library %#v", rustc.Args["rustcFlags"])
}
@@ -575,3 +575,176 @@ func TestStdLinkMismatch(t *testing.T) {
}
`)
}
+
+func TestRustLinkPropagation(t *testing.T) {
+ // Test static and whole static propagation behavior
+ //
+ // Whole static libs propagate through rlibs and through dylibs to
+ // dependencies further down. rustc does not re-export whole-archived
+ // static libs for dylibs, so this simulates re-exporting those symbols.
+ //
+ // Static libs only propagate through rlibs to some final dylib. We propagate
+ // normal static libs because we allow rustlib dependencies to represent
+ // either rlibs or dylibs. Not propagating static libs through rlibs would
+ // mean we'd need to always redeclare static libs throughout a dependency tree
+ // We don't propagate past dylibs because they represent a final link.
+
+ ctx := testRust(t, `
+ rust_library_rlib {
+ name: "librlib1",
+ crate_name: "rlib1",
+ srcs: ["src/lib.rs"],
+ static_libs: ["libcc_static_rlib1"],
+ whole_static_libs: ["libcc_whole_static_rlib1"],
+ }
+
+ rust_library_dylib {
+ name: "libdylib1",
+ crate_name: "dylib1",
+ static_libs: ["libcc_static_dylib1"],
+ srcs: ["src/lib.rs"],
+ whole_static_libs: ["libcc_whole_static_dylib1"],
+ }
+
+ rust_library_rlib {
+ name: "librlib2",
+ crate_name: "rlib2",
+ srcs: ["src/lib.rs"],
+ rlibs: ["librlib1"],
+ static_libs: ["libcc_static_rlib2"],
+ whole_static_libs: ["libcc_whole_static_rlib2"],
+ }
+
+ rust_library_dylib {
+ name: "libdylib2",
+ crate_name: "dylib2",
+ srcs: ["src/lib.rs"],
+ rlibs: ["librlib1"],
+ rustlibs: ["libdylib1"],
+ static_libs: ["libcc_static_dylib2"],
+ whole_static_libs: ["libcc_whole_static_dylib2"],
+ }
+
+ cc_library_static {
+ name: "libcc_static_rlib1",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_static_rlib2",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_static_dylib1",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_static_dylib2",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_whole_static_rlib1",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_whole_static_rlib2",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_whole_static_dylib1",
+ srcs:["foo.c"],
+ }
+
+ cc_library_static {
+ name: "libcc_whole_static_dylib2",
+ srcs:["foo.c"],
+ }
+
+ rust_library_rlib {
+ name: "librlib3",
+ crate_name: "rlib3",
+ srcs: ["src/lib.rs"],
+ rlibs: ["librlib2"],
+ }
+
+ rust_library_dylib {
+ name: "libdylib3",
+ crate_name: "dylib3",
+ srcs: ["src/lib.rs"],
+ rlibs: ["librlib2"],
+ rustlibs: ["libdylib2"],
+ }
+ `)
+
+ librlib3 := ctx.ModuleForTests("librlib3", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc")
+ libdylib3 := ctx.ModuleForTests("libdylib3", "android_arm64_armv8-a_dylib").Rule("rustc")
+
+ // Test static lib propagation from:
+ // rlib -> rlib
+ if !strings.Contains(librlib3.Args["linkFlags"], "libcc_static_rlib2.a") {
+ t.Errorf("direct dependency static lib not propagating from rlib to rlib; linkFlags %#v",
+ librlib3.Args["linkFlags"])
+ }
+ // rlib -> rlib -> rlib
+ if !strings.Contains(librlib3.Args["linkFlags"], "libcc_static_rlib1.a") {
+ t.Errorf("indirect dependency static lib not propagating from rlib to rlib: linkFlags %#v",
+ librlib3.Args["linkFlags"])
+ }
+ // rlib -> rlib -> dylib
+ if !strings.Contains(libdylib3.Args["linkFlags"], "libcc_static_rlib1.a") {
+ t.Errorf("indirect dependency static lib not propagating from rlib to dylib: linkFlags %#v",
+ libdylib3.Args["linkFlags"])
+ }
+ // rlib -> dylib
+ if !strings.Contains(libdylib3.Args["linkFlags"], "libcc_static_rlib2.a") {
+ t.Errorf("direct dependency static lib not propagating from rlib to dylib: linkFlags: %#v",
+ libdylib3.Args["linkFlags"])
+ }
+ // dylib -> dylib (negative case, should not propagate)
+ if strings.Contains(libdylib3.Args["linkFlags"], "libcc_static_dylib2.a") {
+ t.Errorf("direct dependency static lib propagating from dylib to dylib: linkFlags: %#v",
+ libdylib3.Args["linkFlags"])
+ }
+ // dylib -> dylib -> dylib (negative case, should not propagate)
+ if strings.Contains(libdylib3.Args["linkFlags"], "libcc_static_dylib1.a") {
+ t.Errorf("indirect dependency static lib propagating from dylib to dylib: linkFlags: %#v",
+ libdylib3.Args["linkFlags"])
+ }
+
+ // Test whole static lib propagation from:
+ // rlib -> rlib
+ if !strings.Contains(librlib3.Args["linkFlags"], "libcc_whole_static_rlib2.a") {
+ t.Errorf("direct dependency whole static lib not propagating from rlib to rlib: linkFlags %#v",
+ librlib3.Args["linkFlags"])
+ }
+ // rlib -> rlib -> rlib
+ if !strings.Contains(librlib3.Args["linkFlags"], "libcc_whole_static_rlib1.a") {
+ t.Errorf("indirect dependency whole static lib not propagating from rlib to rlib: linkFlags %#v",
+ librlib3.Args["linkFlags"])
+ }
+ // rlib -> dylib
+ if !strings.Contains(libdylib3.Args["linkFlags"], "libcc_whole_static_rlib2.a") {
+ t.Errorf("direct dependency whole static lib not propagating from rlib to dylib: linkFlags %#v",
+ libdylib3.Args["linkFlags"])
+ }
+ // rlib -> rlib -> dylib
+ if !strings.Contains(libdylib3.Args["linkFlags"], "libcc_whole_static_rlib1.a") {
+ t.Errorf("indirect dependency whole static lib not propagating from rlib to dylib: linkFlags %#v",
+ libdylib3.Args["linkFlags"])
+ }
+ // dylib -> dylib
+ if !strings.Contains(libdylib3.Args["linkFlags"], "libcc_whole_static_dylib2.a") {
+ t.Errorf("direct dependency whole static lib not propagating from dylib to dylib: linkFlags %#v",
+ libdylib3.Args["linkFlags"])
+ }
+ // dylib -> dylib -> dylib
+ if !strings.Contains(libdylib3.Args["linkFlags"], "libcc_whole_static_dylib1.a") {
+ t.Errorf("indirect dependency whole static lib not propagating from dylib to dylib: linkFlags %#v",
+ libdylib3.Args["linkFlags"])
+ }
+}
diff --git a/scripts/gen_build_prop.py b/scripts/gen_build_prop.py
index 355f33d6c..74befd5de 100644
--- a/scripts/gen_build_prop.py
+++ b/scripts/gen_build_prop.py
@@ -369,9 +369,6 @@ def append_additional_system_props(args):
props = list(filter(lambda x: not x.startswith("ro.setupwizard.mode="), props))
props.append("ro.setupwizard.mode=OPTIONAL")
- if not config["SdkBuild"]:
- # To speedup startup of non-preopted builds, don't verify or compile the boot image.
- props.append("dalvik.vm.image-dex2oat-filter=extract")
# b/323566535
props.append("init.svc_debug.no_fatal.zygote=true")
diff --git a/ui/build/build.go b/ui/build/build.go
index ea867826c..95d7831d2 100644
--- a/ui/build/build.go
+++ b/ui/build/build.go
@@ -427,6 +427,9 @@ func evaluateWhatToRun(config Config, verboseln func(v ...interface{})) int {
if config.Checkbuild() {
what |= RunBuildTests
}
+ if value, ok := config.environ.Get("RUN_BUILD_TESTS"); ok && value == "true" {
+ what |= RunBuildTests
+ }
if !config.SkipConfig() {
what |= RunProductConfig
} else {
diff --git a/ui/build/test_build.go b/ui/build/test_build.go
index 7a2fd1668..87bec93a2 100644
--- a/ui/build/test_build.go
+++ b/ui/build/test_build.go
@@ -76,8 +76,10 @@ func testForDanglingRules(ctx Context, config Config) {
// treated as an source file.
dexpreoptConfigFilePath := filepath.Join(outDir, "soong", "dexpreopt.config")
- // out/build_date.txt is considered a "source file"
+ // out/build_(date|hostname|number).txt is considered a "source file"
buildDatetimeFilePath := filepath.Join(outDir, "build_date.txt")
+ buildHostnameFilePath := filepath.Join(outDir, "soong", "build_hostname.txt")
+ buildNumberFilePath := filepath.Join(outDir, "soong", "build_number.txt")
// release-config files are generated from the initial lunch or Kati phase
// before running soong and ninja.
@@ -102,6 +104,8 @@ func testForDanglingRules(ctx Context, config Config) {
line == extraVariablesFilePath ||
line == dexpreoptConfigFilePath ||
line == buildDatetimeFilePath ||
+ line == buildHostnameFilePath ||
+ line == buildNumberFilePath ||
strings.HasPrefix(line, releaseConfigDir) ||
buildFingerPrintFilePattern.MatchString(line) {
// Leaf node is in one of Soong's bootstrap directories, which do not have