From 89c31581a52e4534e1a726f49d700250d676e1a2 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Mon, 30 Apr 2018 15:55:11 -0700 Subject: [PATCH] Use and export proguard flags from static dependencies Export proguard flags from Android library modules, and use them from static dependencies in Android apps when running proguard. Also export them to Make. Unlike Make, which concatentates all the exported flags from dependencies, Soong dedups exported flags files. Bug: 73724997 Test: m checkbuild Change-Id: I8f86fecb09cbc591832ce67e8ecef551a6600349 --- java/aar.go | 19 +++++++++++++++++++ java/androidmk.go | 3 ++- java/app.go | 17 +++++++++++++++-- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/java/aar.go b/java/aar.go index 16d82af45..47676fd9e 100644 --- a/java/aar.go +++ b/java/aar.go @@ -25,6 +25,7 @@ import ( type AndroidLibraryDependency interface { Dependency ExportPackage() android.Path + ExportedProguardFlagFiles() android.Paths } func init() { @@ -247,6 +248,12 @@ type AndroidLibrary struct { androidLibraryProperties androidLibraryProperties aarFile android.WritablePath + + exportedProguardFlagFiles android.Paths +} + +func (a *AndroidLibrary) ExportedProguardFlagFiles() android.Paths { + return a.exportedProguardFlagFiles } var _ AndroidLibraryDependency = (*AndroidLibrary)(nil) @@ -279,6 +286,14 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res) ctx.CheckbuildFile(a.aarFile) } + + ctx.VisitDirectDeps(func(m android.Module) { + if lib, ok := m.(AndroidLibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag { + a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...) + } + }) + + a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles) } func AndroidLibraryFactory() android.Module { @@ -327,6 +342,10 @@ func (a *AARImport) ExportPackage() android.Path { return a.exportPackage } +func (a *AARImport) ExportedProguardFlagFiles() android.Paths { + return android.Paths{a.proguardFlags} +} + func (a *AARImport) Prebuilt() *android.Prebuilt { return &a.prebuilt } diff --git a/java/androidmk.go b/java/androidmk.go index fc93cfb53..1e77d05f8 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -244,7 +244,8 @@ func (a *AndroidLibrary) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, "LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE :=", a.exportPackage.String()) fmt.Fprintln(w, "LOCAL_FULL_MANIFEST_FILE :=", a.manifestPath.String()) - fmt.Fprintln(w, "LOCAL_SOONG_EXPORT_PROGUARD_FLAGS :=", a.proguardOptionsFile.String()) + fmt.Fprintln(w, "LOCAL_SOONG_EXPORT_PROGUARD_FLAGS :=", + strings.Join(a.exportedProguardFlagFiles.Strings(), " ")) fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") fmt.Fprintln(w, "LOCAL_DEX_PREOPT := false") }) diff --git a/java/app.go b/java/app.go index dd83a0a77..1fdce129c 100644 --- a/java/app.go +++ b/java/app.go @@ -63,6 +63,10 @@ type AndroidApp struct { appProperties appProperties } +func (a *AndroidApp) ExportedProguardFlagFiles() android.Paths { + return nil +} + var _ AndroidLibraryDependency = (*AndroidApp)(nil) type certificate struct { @@ -116,8 +120,17 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { // apps manifests are handled by aapt, don't let Module see them a.properties.Manifest = nil - a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles, - a.proguardOptionsFile) + var staticLibProguardFlagFiles android.Paths + ctx.VisitDirectDeps(func(m android.Module) { + if lib, ok := m.(AndroidLibraryDependency); ok && ctx.OtherModuleDependencyTag(m) == staticLibTag { + staticLibProguardFlagFiles = append(staticLibProguardFlagFiles, lib.ExportedProguardFlagFiles()...) + } + }) + + staticLibProguardFlagFiles = android.FirstUniquePaths(staticLibProguardFlagFiles) + + a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles, staticLibProguardFlagFiles...) + a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles, a.proguardOptionsFile) if ctx.ModuleName() != "framework-res" { a.Module.compile(ctx, a.aaptSrcJar)