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

Commit cde5534c authored by Colin Cross's avatar Colin Cross
Browse files

Support transitive proguard specs in android_library_import

Add support for android_library_import to propagate the proguard specs
from its static dependencies.

Bug: 326265727
Test: TestExportedProguardFlagFiles
Change-Id: I174c1d7937a529958f8d240214b279062ef74868
parent eee4ab12
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1161,11 +1161,17 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	a.rTxt = extractedAARDir.Join(ctx, "R.txt")
	a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
	a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
	transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx)
	android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{
		ProguardFlagsFiles: android.NewDepSet[android.Path](
			android.POSTORDER,
			android.Paths{a.proguardFlags},
			transitiveProguardFlags,
		),
		UnconditionallyExportedProguardFlags: android.NewDepSet[android.Path](
			android.POSTORDER,
			nil,
			transitiveUnconditionalExportedFlags,
		),
	})

+42 −12
Original line number Diff line number Diff line
@@ -3625,7 +3625,10 @@ func TestExportedProguardFlagFiles(t *testing.T) {
		android_app {
			name: "foo",
			sdk_version: "current",
			static_libs: ["lib1"],
			static_libs: [
				"lib1",
				"lib3",
			],
		}

		android_library {
@@ -3633,24 +3636,51 @@ func TestExportedProguardFlagFiles(t *testing.T) {
			sdk_version: "current",
			optimize: {
				proguard_flags_files: ["lib1proguard.cfg"],
			},
			static_libs: ["lib2"],
		}
		}
	`)

	m := ctx.ModuleForTests("foo", "android_common")
	hasLib1Proguard := false
	for _, s := range m.Rule("java.r8").Implicits.Strings() {
		if s == "lib1proguard.cfg" {
			hasLib1Proguard = true
			break
		android_library {
			name: "lib2",
			sdk_version: "current",
			optimize: {
				proguard_flags_files: ["lib2proguard.cfg"],
			}
		}

		android_library_import {
			name: "lib3",
			sdk_version: "current",
			aars: ["lib3.aar"],
			static_libs: ["lib4"],
		}

	if !hasLib1Proguard {
		t.Errorf("App does not use library proguard config")
		android_library {
			name: "lib4",
			sdk_version: "current",
			optimize: {
				proguard_flags_files: ["lib4proguard.cfg"],
			}
		}


	`)

	m := ctx.ModuleForTests("foo", "android_common")
	r8 := m.Rule("java.r8")
	implicits := r8.Implicits.RelativeToTop().Strings()
	android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg")
	android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg")
	android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg")
	android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt")

	flags := r8.Args["r8Flags"]
	android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg")
	android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg")
	android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg")
	android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt")
}

func TestTargetSdkVersionManifestFixer(t *testing.T) {
	platform_sdk_codename := "Tiramisu"
	platform_sdk_version := 33
+7 −4
Original line number Diff line number Diff line
@@ -1757,10 +1757,7 @@ func (j *Module) useCompose() bool {
	return android.InList("androidx.compose.runtime_runtime", j.properties.Static_libs)
}

func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo {
	transitiveUnconditionalExportedFlags := []*android.DepSet[android.Path]{}
	transitiveProguardFlags := []*android.DepSet[android.Path]{}

func collectDepProguardSpecInfo(ctx android.ModuleContext) (transitiveProguardFlags, transitiveUnconditionalExportedFlags []*android.DepSet[android.Path]) {
	ctx.VisitDirectDeps(func(m android.Module) {
		depProguardInfo, _ := android.OtherModuleProvider(ctx, m, ProguardSpecInfoProvider)
		depTag := ctx.OtherModuleDependencyTag(m)
@@ -1775,6 +1772,12 @@ func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpec
		}
	})

	return transitiveProguardFlags, transitiveUnconditionalExportedFlags
}

func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo {
	transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx)

	directUnconditionalExportedFlags := android.Paths{}
	proguardFlagsForThisModule := android.PathsForModuleSrc(ctx, j.dexProperties.Optimize.Proguard_flags_files)
	exportUnconditionally := proptools.Bool(j.dexProperties.Optimize.Export_proguard_flags_files)