Loading cmd/zipsync/zipsync.go +19 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 { Loading @@ -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 { Loading java/aapt2.go +9 −20 Original line number Diff line number Diff line Loading @@ -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", Loading @@ -130,6 +118,7 @@ func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip // builds that don't want it. "cFlags": "--pseudo-localize", "resZipDir": android.PathForModuleOut(ctx, "aapt2", "reszip", flata.Base()).String(), "zipSyncFlags": zipPrefix, }, }) } Loading java/aar.go +7 −11 Original line number Diff line number Diff line Loading @@ -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}) } Loading Loading @@ -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 { Loading @@ -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") Loading @@ -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(), }, }) 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 Loading
cmd/zipsync/zipsync.go +19 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 { Loading @@ -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 { Loading
java/aapt2.go +9 −20 Original line number Diff line number Diff line Loading @@ -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", Loading @@ -130,6 +118,7 @@ func aapt2CompileZip(ctx android.ModuleContext, flata android.WritablePath, zip // builds that don't want it. "cFlags": "--pseudo-localize", "resZipDir": android.PathForModuleOut(ctx, "aapt2", "reszip", flata.Base()).String(), "zipSyncFlags": zipPrefix, }, }) } Loading
java/aar.go +7 −11 Original line number Diff line number Diff line Loading @@ -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}) } Loading Loading @@ -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 { Loading @@ -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") Loading @@ -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(), }, }) 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