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  }