Merge "Refactor .aar resource compilation"
am: 588857b418
Change-Id: I85532e6de6a8514e64c4304df711856584c2caef
This commit is contained in:
commit
2758050dc4
3 changed files with 35 additions and 38 deletions
|
@ -30,6 +30,7 @@ var (
|
|||
outputDir = flag.String("d", "", "output dir")
|
||||
outputFile = flag.String("l", "", "output list file")
|
||||
filter = flag.String("f", "", "optional filter pattern")
|
||||
zipPrefix = flag.String("zip-prefix", "", "optional prefix within the zip file to extract, stripping the prefix")
|
||||
)
|
||||
|
||||
func must(err error) {
|
||||
|
@ -77,6 +78,10 @@ func main() {
|
|||
var files []string
|
||||
seen := make(map[string]string)
|
||||
|
||||
if *zipPrefix != "" {
|
||||
*zipPrefix = filepath.Clean(*zipPrefix) + "/"
|
||||
}
|
||||
|
||||
for _, input := range inputs {
|
||||
reader, err := zip.OpenReader(input)
|
||||
if err != nil {
|
||||
|
@ -85,23 +90,30 @@ func main() {
|
|||
defer reader.Close()
|
||||
|
||||
for _, f := range reader.File {
|
||||
name := f.Name
|
||||
if *zipPrefix != "" {
|
||||
if !strings.HasPrefix(name, *zipPrefix) {
|
||||
continue
|
||||
}
|
||||
name = strings.TrimPrefix(name, *zipPrefix)
|
||||
}
|
||||
if *filter != "" {
|
||||
if match, err := filepath.Match(*filter, filepath.Base(f.Name)); err != nil {
|
||||
if match, err := filepath.Match(*filter, filepath.Base(name)); err != nil {
|
||||
log.Fatal(err)
|
||||
} else if !match {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if filepath.IsAbs(f.Name) {
|
||||
log.Fatalf("%q in %q is an absolute path", f.Name, input)
|
||||
if filepath.IsAbs(name) {
|
||||
log.Fatalf("%q in %q is an absolute path", name, input)
|
||||
}
|
||||
|
||||
if prev, exists := seen[f.Name]; exists {
|
||||
log.Fatalf("%q found in both %q and %q", f.Name, prev, input)
|
||||
if prev, exists := seen[name]; exists {
|
||||
log.Fatalf("%q found in both %q and %q", name, prev, input)
|
||||
}
|
||||
seen[f.Name] = input
|
||||
seen[name] = input
|
||||
|
||||
filename := filepath.Join(*outputDir, f.Name)
|
||||
filename := filepath.Join(*outputDir, name)
|
||||
if f.FileInfo().IsDir() {
|
||||
must(os.MkdirAll(filename, f.FileInfo().Mode()))
|
||||
} else {
|
||||
|
|
|
@ -94,32 +94,20 @@ func aapt2Compile(ctx android.ModuleContext, dir android.Path, paths android.Pat
|
|||
return ret
|
||||
}
|
||||
|
||||
func aapt2CompileDirs(ctx android.ModuleContext, flata android.WritablePath, dirs android.Paths, deps android.Paths) {
|
||||
ctx.Build(pctx, android.BuildParams{
|
||||
Rule: aapt2CompileRule,
|
||||
Description: "aapt2 compile dirs",
|
||||
Implicits: deps,
|
||||
Output: flata,
|
||||
Args: map[string]string{
|
||||
"outDir": flata.String(),
|
||||
// Always set --pseudo-localize, it will be stripped out later for release
|
||||
// builds that don't want it.
|
||||
"cFlags": "--pseudo-localize " + android.JoinWithPrefix(dirs.Strings(), "--dir "),
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
var aapt2CompileZipRule = pctx.AndroidStaticRule("aapt2CompileZip",
|
||||
blueprint.RuleParams{
|
||||
Command: `${config.ZipSyncCmd} -d $resZipDir $in && ` +
|
||||
Command: `${config.ZipSyncCmd} -d $resZipDir $zipSyncFlags $in && ` +
|
||||
`${config.Aapt2Cmd} compile -o $out $cFlags --legacy --dir $resZipDir`,
|
||||
CommandDeps: []string{
|
||||
"${config.Aapt2Cmd}",
|
||||
"${config.ZipSyncCmd}",
|
||||
},
|
||||
}, "cFlags", "resZipDir")
|
||||
}, "cFlags", "resZipDir", "zipSyncFlags")
|
||||
|
||||
func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip android.Path) {
|
||||
func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip android.Path, zipPrefix string) {
|
||||
if zipPrefix != "" {
|
||||
zipPrefix = "--zip-prefix " + zipPrefix
|
||||
}
|
||||
ctx.Build(pctx, android.BuildParams{
|
||||
Rule: aapt2CompileZipRule,
|
||||
Description: "aapt2 compile zip",
|
||||
|
@ -128,8 +116,9 @@ func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip
|
|||
Args: map[string]string{
|
||||
// Always set --pseudo-localize, it will be stripped out later for release
|
||||
// builds that don't want it.
|
||||
"cFlags": "--pseudo-localize",
|
||||
"resZipDir": android.PathForModuleOut(ctx, "aapt2", "reszip", flata.Base()).String(),
|
||||
"cFlags": "--pseudo-localize",
|
||||
"resZipDir": android.PathForModuleOut(ctx, "aapt2", "reszip", flata.Base()).String(),
|
||||
"zipSyncFlags": zipPrefix,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
|
18
java/aar.go
18
java/aar.go
|
@ -245,7 +245,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex
|
|||
|
||||
for i, zip := range resZips {
|
||||
flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
|
||||
aapt2CompileZip(ctx, flata, zip)
|
||||
aapt2CompileZip(ctx, flata, zip, "")
|
||||
compiledResDirs = append(compiledResDirs, android.Paths{flata})
|
||||
}
|
||||
|
||||
|
@ -556,13 +556,13 @@ func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|||
}
|
||||
|
||||
// Unzip an AAR into its constituent files and directories. Any files in Outputs that don't exist in the AAR will be
|
||||
// touched to create an empty file, and any directories in $expectedDirs will be created.
|
||||
// touched to create an empty file. The res directory is not extracted, as it will be extracted in its own rule.
|
||||
var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
|
||||
blueprint.RuleParams{
|
||||
Command: `rm -rf $outDir && mkdir -p $outDir $expectedDirs && ` +
|
||||
`unzip -qo -d $outDir $in && touch $out`,
|
||||
Command: `rm -rf $outDir && mkdir -p $outDir && ` +
|
||||
`unzip -qo -d $outDir $in && rm -rf $outDir/res && touch $out`,
|
||||
},
|
||||
"expectedDirs", "outDir")
|
||||
"outDir")
|
||||
|
||||
func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
if len(a.properties.Aars) != 1 {
|
||||
|
@ -580,7 +580,6 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
}
|
||||
|
||||
extractedAARDir := android.PathForModuleOut(ctx, "aar")
|
||||
extractedResDir := extractedAARDir.Join(ctx, "res")
|
||||
a.classpathFile = extractedAARDir.Join(ctx, "classes.jar")
|
||||
a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
|
||||
a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
|
||||
|
@ -591,16 +590,13 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest},
|
||||
Description: "unzip AAR",
|
||||
Args: map[string]string{
|
||||
"expectedDirs": extractedResDir.String(),
|
||||
"outDir": extractedAARDir.String(),
|
||||
"outDir": extractedAARDir.String(),
|
||||
},
|
||||
})
|
||||
|
||||
compiledResDir := android.PathForModuleOut(ctx, "flat-res")
|
||||
aaptCompileDeps := android.Paths{a.classpathFile}
|
||||
aaptCompileDirs := android.Paths{extractedResDir}
|
||||
flata := compiledResDir.Join(ctx, "gen_res.flata")
|
||||
aapt2CompileDirs(ctx, flata, aaptCompileDirs, aaptCompileDeps)
|
||||
aapt2CompileZip(ctx, flata, aar, "res")
|
||||
|
||||
a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
|
||||
srcJar := android.PathForModuleGen(ctx, "R.jar")
|
||||
|
|
Loading…
Reference in a new issue