diff options
author | 2024-10-22 19:10:25 +0000 | |
---|---|---|
committer | 2024-10-22 19:10:25 +0000 | |
commit | 8c67d5842e0135ec517045aa0cd2cf5b63b53e6d (patch) | |
tree | 32871694b97edaa654055b4d0f99b7d342d7765a /java/aapt2.go | |
parent | 6a9357d1f74d04cc5c96f52ce02af352d043ed72 (diff) |
Add support for .flat files with flags in the directory
aapt2 allows flagging the resource file by specifying the name of the
flag in the directory, such as
`res/flag(test.package.myFlag)/values/bools.xml`, in which aapt2 will
generate files like `values_bools.(test.package.myFlag).arsc.flat`. This
change adds support for such aapt2 generated flagged resource files.
Test: Patch ag/29931886 && ag/29501772 && m
Bug: 374827548
Change-Id: I0ea6d6f747ad008c8f2a554a192196dc59f0c1a8
Diffstat (limited to 'java/aapt2.go')
-rw-r--r-- | java/aapt2.go | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/java/aapt2.go b/java/aapt2.go index 61cf37381..bae4d1ee3 100644 --- a/java/aapt2.go +++ b/java/aapt2.go @@ -15,7 +15,9 @@ package java import ( + "fmt" "path/filepath" + "regexp" "sort" "strconv" "strings" @@ -31,19 +33,35 @@ func isPathValueResource(res android.Path) bool { return strings.HasPrefix(lastDir, "values") } +func isFlagsPath(subDir string) bool { + re := regexp.MustCompile(`flag\(!?([a-zA-Z_-]+\.)*[a-zA-Z0-9_-]+\)`) + lastDir := filepath.Base(subDir) + return re.MatchString(lastDir) +} + // Convert input resource file path to output file path. // values-[config]/<file>.xml -> values-[config]_<file>.arsc.flat; +// flag(fully.qualified.flag_name)/values-[config]/<file>.xml -> /values-[config]_<file>.(fully.qualified.flag_name).arsc.flat; // For other resource file, just replace the last "/" with "_" and add .flat extension. func pathToAapt2Path(ctx android.ModuleContext, res android.Path) android.WritablePath { - name := res.Base() + extension := filepath.Ext(res.Base()) + name := strings.TrimSuffix(res.Base(), extension) if isPathValueResource(res) { - name = strings.TrimSuffix(name, ".xml") + ".arsc" + extension = ".arsc" } subDir := filepath.Dir(res.String()) subDir, lastDir := filepath.Split(subDir) - name = lastDir + "_" + name + ".flat" - return android.PathForModuleOut(ctx, "aapt2", subDir, name) + if isFlagsPath(subDir) { + var flag string + subDir, flag = filepath.Split(filepath.Dir(subDir)) + flag = strings.TrimPrefix(flag, "flag") + name = fmt.Sprintf("%s_%s.%s%s.flat", lastDir, name, flag, extension) + } else { + name = fmt.Sprintf("%s_%s%s.flat", lastDir, name, extension) + } + out := android.PathForModuleOut(ctx, "aapt2", subDir, name) + return out } // pathsToAapt2Paths Calls pathToAapt2Path on each entry of the given Paths, i.e. []Path. |