From c20dc8533e0ed41ba3d708e85515980fff04c9f2 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 10 Nov 2020 12:27:45 -0800 Subject: [PATCH] Add dependency to list of asset files We had a dependency on each file in the asset directories, but that wouldn't cause aapt2 to run if a file was removed. Add a dependency on a file that contains the list of files in the asset directories. Fixes: 172867096 Test: m CarrierConfig && rm packages/apps/CarrierConfig/assets/carrier_config_no_sim.xml && m CarrierConfig Change-Id: I35f3b85355fa890a3e95eaa6458a21466b6930e4 --- android/defs.go | 7 ++++++- android/module.go | 6 ++++++ java/aar.go | 20 +++++++++++++++----- java/android_resources.go | 11 +++++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/android/defs.go b/android/defs.go index f5bd362cd..38ecb0505 100644 --- a/android/defs.go +++ b/android/defs.go @@ -20,7 +20,7 @@ import ( "testing" "github.com/google/blueprint" - _ "github.com/google/blueprint/bootstrap" + "github.com/google/blueprint/bootstrap" "github.com/google/blueprint/proptools" ) @@ -200,3 +200,8 @@ func ContentFromFileRuleForTests(t *testing.T, params TestingBuildParams) string return content } + +// GlobToListFileRule creates a rule that writes a list of files matching a pattern to a file. +func GlobToListFileRule(ctx ModuleContext, pattern string, excludes []string, file WritablePath) { + bootstrap.GlobFile(ctx.blueprintModuleContext(), pattern, excludes, file.String()) +} diff --git a/android/module.go b/android/module.go index bbdeb2733..f805acdf5 100644 --- a/android/module.go +++ b/android/module.go @@ -331,6 +331,8 @@ type BaseContext interface { type ModuleContext interface { BaseModuleContext + blueprintModuleContext() blueprint.ModuleContext + // Deprecated: use ModuleContext.Build instead. ModuleBuild(pctx PackageContext, params ModuleBuildParams) @@ -2544,6 +2546,10 @@ func (m *moduleContext) CheckbuildFile(srcPath Path) { m.checkbuildFiles = append(m.checkbuildFiles, srcPath) } +func (m *moduleContext) blueprintModuleContext() blueprint.ModuleContext { + return m.bp +} + // SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input // was not a module reference. func SrcIsModule(s string) (module string) { diff --git a/java/aar.go b/java/aar.go index 3b6b34e27..3750f72ba 100644 --- a/java/aar.go +++ b/java/aar.go @@ -17,6 +17,7 @@ package java import ( "fmt" "path/filepath" + "strconv" "strings" "android/soong/android" @@ -192,22 +193,31 @@ func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext sdkContext, rroDirs = append(rroDirs, resRRODirs...) } - var assetFiles android.Paths - for _, dir := range assetDirs { - assetFiles = append(assetFiles, androidResourceGlob(ctx, dir)...) + var assetDeps android.Paths + for i, dir := range assetDirs { + // Add a dependency on every file in the asset directory. This ensures the aapt2 + // rule will be rerun if one of the files in the asset directory is modified. + assetDeps = append(assetDeps, androidResourceGlob(ctx, dir)...) + + // Add a dependency on a file that contains a list of all the files in the asset directory. + // This ensures the aapt2 rule will be run if a file is removed from the asset directory, + // or a file is added whose timestamp is older than the output of aapt2. + assetFileListFile := android.PathForModuleOut(ctx, "asset_dir_globs", strconv.Itoa(i)+".glob") + androidResourceGlobList(ctx, dir, assetFileListFile) + assetDeps = append(assetDeps, assetFileListFile) } assetDirStrings := assetDirs.Strings() if a.noticeFile.Valid() { assetDirStrings = append(assetDirStrings, filepath.Dir(a.noticeFile.Path().String())) - assetFiles = append(assetFiles, a.noticeFile.Path()) + assetDeps = append(assetDeps, a.noticeFile.Path()) } linkFlags = append(linkFlags, "--manifest "+manifestPath.String()) linkDeps = append(linkDeps, manifestPath) linkFlags = append(linkFlags, android.JoinWithPrefix(assetDirStrings, "-A ")) - linkDeps = append(linkDeps, assetFiles...) + linkDeps = append(linkDeps, assetDeps...) // SDK version flags minSdkVersion, err := sdkContext.minSdkVersion().effectiveVersionString(ctx) diff --git a/java/android_resources.go b/java/android_resources.go index 720d3a5ae..4d420cfed 100644 --- a/java/android_resources.go +++ b/java/android_resources.go @@ -38,10 +38,21 @@ var androidResourceIgnoreFilenames = []string{ "*~", } +// androidResourceGlob returns the list of files in the given directory, using the standard +// exclusion patterns for Android resources. func androidResourceGlob(ctx android.ModuleContext, dir android.Path) android.Paths { return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames) } +// androidResourceGlobList creates a rule to write the list of files in the given directory, using +// the standard exclusion patterns for Android resources, to the given output file. +func androidResourceGlobList(ctx android.ModuleContext, dir android.Path, + fileListFile android.WritablePath) { + + android.GlobToListFileRule(ctx, filepath.Join(dir.String(), "**/*"), + androidResourceIgnoreFilenames, fileListFile) +} + type overlayType int const (