2017-11-23 01:19:37 +01:00
|
|
|
// Copyright 2017 Google Inc. All rights reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package java
|
|
|
|
|
|
|
|
import (
|
|
|
|
"path/filepath"
|
2017-12-01 19:48:26 +01:00
|
|
|
"sort"
|
2017-11-23 01:19:37 +01:00
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/google/blueprint"
|
|
|
|
|
|
|
|
"android/soong/android"
|
|
|
|
)
|
|
|
|
|
|
|
|
const AAPT2_SHARD_SIZE = 100
|
|
|
|
|
|
|
|
// Convert input resource file path to output file path.
|
|
|
|
// values-[config]/<file>.xml -> values-[config]_<file>.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()
|
|
|
|
subDir := filepath.Dir(res.String())
|
|
|
|
subDir, lastDir := filepath.Split(subDir)
|
|
|
|
if strings.HasPrefix(lastDir, "values") {
|
|
|
|
name = strings.TrimSuffix(name, ".xml") + ".arsc"
|
|
|
|
}
|
|
|
|
name = lastDir + "_" + name + ".flat"
|
|
|
|
return android.PathForModuleOut(ctx, "aapt2", subDir, name)
|
|
|
|
}
|
|
|
|
|
|
|
|
func pathsToAapt2Paths(ctx android.ModuleContext, resPaths android.Paths) android.WritablePaths {
|
|
|
|
outPaths := make(android.WritablePaths, len(resPaths))
|
|
|
|
|
|
|
|
for i, res := range resPaths {
|
|
|
|
outPaths[i] = pathToAapt2Path(ctx, res)
|
|
|
|
}
|
|
|
|
|
|
|
|
return outPaths
|
|
|
|
}
|
|
|
|
|
|
|
|
var aapt2CompileRule = pctx.AndroidStaticRule("aapt2Compile",
|
|
|
|
blueprint.RuleParams{
|
2017-11-29 09:17:36 +01:00
|
|
|
Command: `${config.Aapt2Cmd} compile -o $outDir $cFlags --legacy $in`,
|
2017-11-23 01:19:37 +01:00
|
|
|
CommandDeps: []string{"${config.Aapt2Cmd}"},
|
|
|
|
},
|
|
|
|
"outDir", "cFlags")
|
|
|
|
|
|
|
|
func aapt2Compile(ctx android.ModuleContext, dir android.Path, paths android.Paths) android.WritablePaths {
|
|
|
|
shards := shardPaths(paths, AAPT2_SHARD_SIZE)
|
|
|
|
|
|
|
|
ret := make(android.WritablePaths, 0, len(paths))
|
|
|
|
|
|
|
|
for i, shard := range shards {
|
|
|
|
outPaths := pathsToAapt2Paths(ctx, shard)
|
|
|
|
ret = append(ret, outPaths...)
|
|
|
|
|
|
|
|
shardDesc := ""
|
|
|
|
if i != 0 {
|
|
|
|
shardDesc = " " + strconv.Itoa(i+1)
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Build(pctx, android.BuildParams{
|
|
|
|
Rule: aapt2CompileRule,
|
|
|
|
Description: "aapt2 compile " + dir.String() + shardDesc,
|
|
|
|
Inputs: shard,
|
|
|
|
Outputs: outPaths,
|
|
|
|
Args: map[string]string{
|
|
|
|
"outDir": android.PathForModuleOut(ctx, "aapt2", dir.String()).String(),
|
|
|
|
"cFlags": "--pseudo-localize",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2017-12-01 19:48:26 +01:00
|
|
|
sort.Slice(ret, func(i, j int) bool {
|
|
|
|
return ret[i].String() < ret[j].String()
|
|
|
|
})
|
2017-11-23 01:19:37 +01:00
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
|
|
|
var aapt2LinkRule = pctx.AndroidStaticRule("aapt2Link",
|
|
|
|
blueprint.RuleParams{
|
2017-11-29 09:17:36 +01:00
|
|
|
Command: `${config.Aapt2Cmd} link -o $out $flags --java $genDir --proguard $proguardOptions $inFlags && ` +
|
2017-11-23 01:19:37 +01:00
|
|
|
`${config.SoongZipCmd} -write_if_changed -jar -o $genJar -C $genDir -D $genDir`,
|
|
|
|
CommandDeps: []string{
|
2017-11-29 09:17:36 +01:00
|
|
|
"${config.Aapt2Cmd}",
|
2017-11-23 01:19:37 +01:00
|
|
|
"${config.SoongZipCmd}",
|
|
|
|
},
|
|
|
|
Restat: true,
|
|
|
|
},
|
|
|
|
"flags", "inFlags", "proguardOptions", "genDir", "genJar")
|
|
|
|
|
|
|
|
var fileListToFileRule = pctx.AndroidStaticRule("fileListToFile",
|
|
|
|
blueprint.RuleParams{
|
|
|
|
Command: `cp $out.rsp $out`,
|
|
|
|
Rspfile: "$out.rsp",
|
|
|
|
RspfileContent: "$in",
|
|
|
|
})
|
|
|
|
|
|
|
|
func aapt2Link(ctx android.ModuleContext,
|
|
|
|
packageRes, genJar, proguardOptions android.WritablePath,
|
|
|
|
flags []string, deps android.Paths,
|
|
|
|
compiledRes, compiledOverlay android.Paths) {
|
|
|
|
|
|
|
|
genDir := android.PathForModuleGen(ctx, "aapt2", "R")
|
|
|
|
|
|
|
|
var inFlags []string
|
|
|
|
|
|
|
|
if len(compiledRes) > 0 {
|
|
|
|
resFileList := android.PathForModuleOut(ctx, "aapt2", "res.list")
|
|
|
|
// Write out file lists to files
|
|
|
|
ctx.Build(pctx, android.BuildParams{
|
|
|
|
Rule: fileListToFileRule,
|
|
|
|
Description: "resource file list",
|
|
|
|
Inputs: compiledRes,
|
|
|
|
Output: resFileList,
|
|
|
|
})
|
|
|
|
|
|
|
|
deps = append(deps, compiledRes...)
|
|
|
|
deps = append(deps, resFileList)
|
|
|
|
inFlags = append(inFlags, "@"+resFileList.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(compiledOverlay) > 0 {
|
|
|
|
overlayFileList := android.PathForModuleOut(ctx, "aapt2", "overlay.list")
|
|
|
|
ctx.Build(pctx, android.BuildParams{
|
|
|
|
Rule: fileListToFileRule,
|
|
|
|
Description: "overlay resource file list",
|
|
|
|
Inputs: compiledOverlay,
|
|
|
|
Output: overlayFileList,
|
|
|
|
})
|
|
|
|
|
|
|
|
deps = append(deps, compiledOverlay...)
|
|
|
|
deps = append(deps, overlayFileList)
|
|
|
|
inFlags = append(inFlags, "-R", "@"+overlayFileList.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Build(pctx, android.BuildParams{
|
|
|
|
Rule: aapt2LinkRule,
|
|
|
|
Description: "aapt2 link",
|
|
|
|
Implicits: deps,
|
|
|
|
Output: packageRes,
|
|
|
|
ImplicitOutputs: android.WritablePaths{proguardOptions, genJar},
|
|
|
|
Args: map[string]string{
|
|
|
|
"flags": strings.Join(flags, " "),
|
|
|
|
"inFlags": strings.Join(inFlags, " "),
|
|
|
|
"proguardOptions": proguardOptions.String(),
|
|
|
|
"genDir": genDir.String(),
|
|
|
|
"genJar": genJar.String(),
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|