github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/java/aapt2.go (about) 1 // Copyright 2017 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package java 16 17 import ( 18 "path/filepath" 19 "sort" 20 "strconv" 21 "strings" 22 23 "github.com/google/blueprint" 24 25 "android/soong/android" 26 ) 27 28 const AAPT2_SHARD_SIZE = 100 29 30 // Convert input resource file path to output file path. 31 // values-[config]/<file>.xml -> values-[config]_<file>.arsc.flat; 32 // For other resource file, just replace the last "/" with "_" and 33 // add .flat extension. 34 func pathToAapt2Path(ctx android.ModuleContext, res android.Path) android.WritablePath { 35 36 name := res.Base() 37 subDir := filepath.Dir(res.String()) 38 subDir, lastDir := filepath.Split(subDir) 39 if strings.HasPrefix(lastDir, "values") { 40 name = strings.TrimSuffix(name, ".xml") + ".arsc" 41 } 42 name = lastDir + "_" + name + ".flat" 43 return android.PathForModuleOut(ctx, "aapt2", subDir, name) 44 } 45 46 func pathsToAapt2Paths(ctx android.ModuleContext, resPaths android.Paths) android.WritablePaths { 47 outPaths := make(android.WritablePaths, len(resPaths)) 48 49 for i, res := range resPaths { 50 outPaths[i] = pathToAapt2Path(ctx, res) 51 } 52 53 return outPaths 54 } 55 56 var aapt2CompileRule = pctx.AndroidStaticRule("aapt2Compile", 57 blueprint.RuleParams{ 58 Command: `${config.Aapt2Cmd} compile -o $outDir $cFlags --legacy $in`, 59 CommandDeps: []string{"${config.Aapt2Cmd}"}, 60 }, 61 "outDir", "cFlags") 62 63 func aapt2Compile(ctx android.ModuleContext, dir android.Path, paths android.Paths) android.WritablePaths { 64 shards := shardPaths(paths, AAPT2_SHARD_SIZE) 65 66 ret := make(android.WritablePaths, 0, len(paths)) 67 68 for i, shard := range shards { 69 outPaths := pathsToAapt2Paths(ctx, shard) 70 ret = append(ret, outPaths...) 71 72 shardDesc := "" 73 if i != 0 { 74 shardDesc = " " + strconv.Itoa(i+1) 75 } 76 77 ctx.Build(pctx, android.BuildParams{ 78 Rule: aapt2CompileRule, 79 Description: "aapt2 compile " + dir.String() + shardDesc, 80 Inputs: shard, 81 Outputs: outPaths, 82 Args: map[string]string{ 83 "outDir": android.PathForModuleOut(ctx, "aapt2", dir.String()).String(), 84 // Always set --pseudo-localize, it will be stripped out later for release 85 // builds that don't want it. 86 "cFlags": "--pseudo-localize", 87 }, 88 }) 89 } 90 91 sort.Slice(ret, func(i, j int) bool { 92 return ret[i].String() < ret[j].String() 93 }) 94 return ret 95 } 96 97 func aapt2CompileDirs(ctx android.ModuleContext, flata android.WritablePath, dirs android.Paths, deps android.Paths) { 98 ctx.Build(pctx, android.BuildParams{ 99 Rule: aapt2CompileRule, 100 Description: "aapt2 compile dirs", 101 Implicits: deps, 102 Output: flata, 103 Args: map[string]string{ 104 "outDir": flata.String(), 105 // Always set --pseudo-localize, it will be stripped out later for release 106 // builds that don't want it. 107 "cFlags": "--pseudo-localize " + android.JoinWithPrefix(dirs.Strings(), "--dir "), 108 }, 109 }) 110 } 111 112 var aapt2LinkRule = pctx.AndroidStaticRule("aapt2Link", 113 blueprint.RuleParams{ 114 Command: `${config.Aapt2Cmd} link -o $out $flags --java $genDir --proguard $proguardOptions ` + 115 `--output-text-symbols ${rTxt} $inFlags && ` + 116 `${config.SoongZipCmd} -write_if_changed -jar -o $genJar -C $genDir -D $genDir &&` + 117 `${config.ExtractJarPackagesCmd} -i $genJar -o $extraPackages --prefix '--extra-packages '`, 118 119 CommandDeps: []string{ 120 "${config.Aapt2Cmd}", 121 "${config.SoongZipCmd}", 122 "${config.ExtractJarPackagesCmd}", 123 }, 124 Restat: true, 125 }, 126 "flags", "inFlags", "proguardOptions", "genDir", "genJar", "rTxt", "extraPackages") 127 128 var fileListToFileRule = pctx.AndroidStaticRule("fileListToFile", 129 blueprint.RuleParams{ 130 Command: `cp $out.rsp $out`, 131 Rspfile: "$out.rsp", 132 RspfileContent: "$in", 133 }) 134 135 func aapt2Link(ctx android.ModuleContext, 136 packageRes, genJar, proguardOptions, rTxt, extraPackages android.WritablePath, 137 flags []string, deps android.Paths, 138 compiledRes, compiledOverlay android.Paths) { 139 140 genDir := android.PathForModuleGen(ctx, "aapt2", "R") 141 142 var inFlags []string 143 144 if len(compiledRes) > 0 { 145 resFileList := android.PathForModuleOut(ctx, "aapt2", "res.list") 146 // Write out file lists to files 147 ctx.Build(pctx, android.BuildParams{ 148 Rule: fileListToFileRule, 149 Description: "resource file list", 150 Inputs: compiledRes, 151 Output: resFileList, 152 }) 153 154 deps = append(deps, compiledRes...) 155 deps = append(deps, resFileList) 156 inFlags = append(inFlags, "@"+resFileList.String()) 157 } 158 159 if len(compiledOverlay) > 0 { 160 overlayFileList := android.PathForModuleOut(ctx, "aapt2", "overlay.list") 161 ctx.Build(pctx, android.BuildParams{ 162 Rule: fileListToFileRule, 163 Description: "overlay resource file list", 164 Inputs: compiledOverlay, 165 Output: overlayFileList, 166 }) 167 168 deps = append(deps, compiledOverlay...) 169 deps = append(deps, overlayFileList) 170 inFlags = append(inFlags, "-R", "@"+overlayFileList.String()) 171 } 172 173 ctx.Build(pctx, android.BuildParams{ 174 Rule: aapt2LinkRule, 175 Description: "aapt2 link", 176 Implicits: deps, 177 Output: packageRes, 178 ImplicitOutputs: android.WritablePaths{proguardOptions, genJar, rTxt, extraPackages}, 179 Args: map[string]string{ 180 "flags": strings.Join(flags, " "), 181 "inFlags": strings.Join(inFlags, " "), 182 "proguardOptions": proguardOptions.String(), 183 "genDir": genDir.String(), 184 "genJar": genJar.String(), 185 "rTxt": rTxt.String(), 186 "extraPackages": extraPackages.String(), 187 }, 188 }) 189 }