Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2484be66 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Support aapt2 resources flagging" into main

parents c404b2b4 98ea8368
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ var (
	// For create-device-config-sysprops: Generate aconfig flag value map text file
	aconfigTextRule = pctx.AndroidStaticRule("aconfig_text",
		blueprint.RuleParams{
			Command: `${aconfig} dump-cache --dedup --format='{fully_qualified_name}={state:bool}'` +
			Command: `${aconfig} dump-cache --dedup --format='{fully_qualified_name}:{permission}={state:bool}'` +
				` --cache ${in}` +
				` --out ${out}.tmp` +
				` && ( if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out} ; fi )`,
+6 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ var aapt2CompileRule = pctx.AndroidStaticRule("aapt2Compile",

// aapt2Compile compiles resources and puts the results in the requested directory.
func aapt2Compile(ctx android.ModuleContext, dir android.Path, paths android.Paths,
	flags []string, productToFilter string) android.WritablePaths {
	flags []string, productToFilter string, featureFlagsPaths android.Paths) android.WritablePaths {
	if productToFilter != "" && productToFilter != "default" {
		// --filter-product leaves only product-specific resources. Product-specific resources only exist
		// in value resources (values/*.xml), so filter value resource files only. Ignore other types of
@@ -85,6 +85,10 @@ func aapt2Compile(ctx android.ModuleContext, dir android.Path, paths android.Pat
		flags = append([]string{"--filter-product " + productToFilter}, flags...)
	}

	for _, featureFlagsPath := range android.SortedUniquePaths(featureFlagsPaths) {
		flags = append(flags, "--feature-flags", "@"+featureFlagsPath.String())
	}

	// Shard the input paths so that they can be processed in parallel. If we shard them into too
	// small chunks, the additional cost of spinning up aapt2 outweighs the performance gain. The
	// current shard size, 100, seems to be a good balance between the added cost and the gain.
@@ -112,6 +116,7 @@ func aapt2Compile(ctx android.ModuleContext, dir android.Path, paths android.Pat
		ctx.Build(pctx, android.BuildParams{
			Rule:        aapt2CompileRule,
			Description: "aapt2 compile " + dir.String() + shardDesc,
			Implicits:   featureFlagsPaths,
			Inputs:      shard,
			Outputs:     outPaths,
			Args: map[string]string{
+4 −2
Original line number Diff line number Diff line
@@ -440,7 +440,8 @@ func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptio
	var compiledResDirs []android.Paths
	for _, dir := range resDirs {
		a.resourceFiles = append(a.resourceFiles, dir.files...)
		compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files, compileFlags, a.filterProduct()).Paths())
		compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files,
			compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths())
	}

	for i, zip := range resZips {
@@ -499,7 +500,8 @@ func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptio
	}

	for _, dir := range overlayDirs {
		compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files, compileFlags, a.filterProduct()).Paths()...)
		compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files,
			compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths()...)
	}

	var splitPackages android.WritablePaths
+20 −3
Original line number Diff line number Diff line
@@ -4364,7 +4364,16 @@ func TestPrivappAllowlistAndroidMk(t *testing.T) {
}

func TestAppFlagsPackages(t *testing.T) {
	ctx := testApp(t, `
	ctx := android.GroupFixturePreparers(
		prepareForJavaTest,
		android.FixtureMergeMockFs(
			map[string][]byte{
				"res/layout/layout.xml":         nil,
				"res/values/strings.xml":        nil,
				"res/values-en-rUS/strings.xml": nil,
			},
		),
	).RunTestWithBp(t, `
		android_app {
			name: "foo",
			srcs: ["a.java"],
@@ -4396,10 +4405,10 @@ func TestAppFlagsPackages(t *testing.T) {

	// android_app module depends on aconfig_declarations listed in flags_packages
	android.AssertBoolEquals(t, "foo expected to depend on bar", true,
		CheckModuleHasDependency(t, ctx, "foo", "android_common", "bar"))
		CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "bar"))

	android.AssertBoolEquals(t, "foo expected to depend on baz", true,
		CheckModuleHasDependency(t, ctx, "foo", "android_common", "baz"))
		CheckModuleHasDependency(t, ctx.TestContext, "foo", "android_common", "baz"))

	aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
	linkInFlags := aapt2LinkRule.Args["inFlags"]
@@ -4408,6 +4417,14 @@ func TestAppFlagsPackages(t *testing.T) {
		linkInFlags,
		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
	)

	aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
	compileFlags := aapt2CompileRule.Args["cFlags"]
	android.AssertStringDoesContain(t,
		"aapt2 compile command expected to pass feature flags arguments",
		compileFlags,
		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
	)
}

func TestAppFlagsPackagesPropagation(t *testing.T) {