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

Commit 9c54f032 authored by Jared Duke's avatar Jared Duke
Browse files

Include proguard flag files from transitive java_library deps

Ensure proguard flag files specified by java_library targets propagate
to downstream targets. This matches bazel behavior, as well as
behavior for transitive android_library deps.

Bug: 212623640
Test: m + presubmit
Change-Id: I61abaf1fd43d6f06bb610383751bb26e9a1bafd6
parent c34d9143
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -29,8 +29,8 @@ import (
)

type AndroidLibraryDependency interface {
	LibraryDependency
	ExportPackage() android.Path
	ExportedProguardFlagFiles() android.Paths
	ExportedRRODirs() []rroDir
	ExportedStaticPackages() android.Paths
	ExportedManifests() android.Paths
@@ -498,7 +498,6 @@ type AndroidLibrary struct {

	aarFile android.WritablePath

	exportedProguardFlagFiles android.Paths
	exportedStaticPackages android.Paths
}

@@ -514,10 +513,6 @@ func (a *AndroidLibrary) OutputFiles(tag string) (android.Paths, error) {
	}
}

func (a *AndroidLibrary) ExportedProguardFlagFiles() android.Paths {
	return a.exportedProguardFlagFiles
}

func (a *AndroidLibrary) ExportedStaticPackages() android.Paths {
	return a.exportedStaticPackages
}
@@ -566,13 +561,16 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
	a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles,
		android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...)
	ctx.VisitDirectDeps(func(m android.Module) {
		if lib, ok := m.(AndroidLibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag {
		if ctx.OtherModuleDependencyTag(m) == staticLibTag {
			if lib, ok := m.(LibraryDependency); ok {
				a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
			a.exportedStaticPackages = append(a.exportedStaticPackages, lib.ExportPackage())
			a.exportedStaticPackages = append(a.exportedStaticPackages, lib.ExportedStaticPackages()...)
			}
			if alib, ok := m.(AndroidLibraryDependency); ok {
				a.exportedStaticPackages = append(a.exportedStaticPackages, alib.ExportPackage())
				a.exportedStaticPackages = append(a.exportedStaticPackages, alib.ExportedStaticPackages()...)
			}
		}
	})

	a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles)
	a.exportedStaticPackages = android.FirstUniquePaths(a.exportedStaticPackages)

+1 −1
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
func (a *AndroidApp) proguardBuildActions(ctx android.ModuleContext) {
	var staticLibProguardFlagFiles android.Paths
	ctx.VisitDirectDeps(func(m android.Module) {
		if lib, ok := m.(AndroidLibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag {
		if lib, ok := m.(LibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag {
			staticLibProguardFlagFiles = append(staticLibProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
		}
	})
+54 −0
Original line number Diff line number Diff line
@@ -155,3 +155,57 @@ func TestD8(t *testing.T) {
	android.AssertStringDoesNotContain(t, "expected no  static_lib header jar in foo javac classpath",
		fooD8.Args["d8Flags"], staticLibHeader.String())
}

func TestProguardFlagsInheritance(t *testing.T) {
	result := PrepareForTestWithJavaDefaultModulesWithoutFakeDex2oatd.RunTestWithBp(t, `
		android_app {
			name: "app",
			static_libs: [
				"primary_android_lib",
				"primary_lib",
			],
			platform_apis: true,
		}

		java_library {
			name: "primary_lib",
			optimize: {
				proguard_flags_files: ["primary.flags"],
			},
		}

		android_library {
			name: "primary_android_lib",
			static_libs: ["secondary_lib"],
			optimize: {
				proguard_flags_files: ["primary_android.flags"],
			},
		}

		java_library {
			name: "secondary_lib",
			static_libs: ["tertiary_lib"],
			optimize: {
				proguard_flags_files: ["secondary.flags"],
			},
		}

		java_library {
			name: "tertiary_lib",
			optimize: {
				proguard_flags_files: ["tertiary.flags"],
			},
		}
	`)

	app := result.ModuleForTests("app", "android_common")
	appR8 := app.Rule("r8")
	android.AssertStringDoesContain(t, "expected primary_lib's proguard flags from direct dep",
		appR8.Args["r8Flags"], "primary.flags")
	android.AssertStringDoesContain(t, "expected primary_android_lib's proguard flags from direct dep",
		appR8.Args["r8Flags"], "primary_android.flags")
	android.AssertStringDoesContain(t, "expected secondary_lib's proguard flags from inherited dep",
		appR8.Args["r8Flags"], "secondary.flags")
	android.AssertStringDoesContain(t, "expected tertiary_lib's proguard flags from inherited dep",
		appR8.Args["r8Flags"], "tertiary.flags")
}
+22 −0
Original line number Diff line number Diff line
@@ -283,6 +283,11 @@ type UsesLibraryDependency interface {
	ClassLoaderContexts() dexpreopt.ClassLoaderContextMap
}

// Provides transitive Proguard flag files to downstream DEX jars.
type LibraryDependency interface {
	ExportedProguardFlagFiles() android.Paths
}

// TODO(jungjw): Move this to kythe.go once it's created.
type xref interface {
	XrefJavaFiles() android.Paths
@@ -585,9 +590,17 @@ func normalizeJavaVersion(ctx android.BaseModuleContext, javaVersion string) jav
type Library struct {
	Module

	exportedProguardFlagFiles android.Paths

	InstallMixin func(ctx android.ModuleContext, installPath android.Path) (extraInstallDeps android.Paths)
}

var _ LibraryDependency = (*Library)(nil)

func (j *Library) ExportedProguardFlagFiles() android.Paths {
	return j.exportedProguardFlagFiles
}

var _ android.ApexModule = (*Library)(nil)

// Provides access to the list of permitted packages from apex boot jars.
@@ -683,6 +696,15 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
		}
		j.installFile = ctx.InstallFile(installDir, j.Stem()+".jar", j.outputFile, extraInstallDeps...)
	}

	j.exportedProguardFlagFiles = append(j.exportedProguardFlagFiles,
		android.PathsForModuleSrc(ctx, j.dexProperties.Optimize.Proguard_flags_files)...)
	ctx.VisitDirectDeps(func(m android.Module) {
		if lib, ok := m.(LibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag {
			j.exportedProguardFlagFiles = append(j.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
		}
	})
	j.exportedProguardFlagFiles = android.FirstUniquePaths(j.exportedProguardFlagFiles)
}

func (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) {