2018-03-29 05:58:31 +08:00
|
|
|
// Copyright 2018 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"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"android/soong/android"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
android.RegisterPreSingletonType("overlay", OverlaySingletonFactory)
|
2020-10-30 08:09:13 +08:00
|
|
|
|
2018-03-29 05:58:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
var androidResourceIgnoreFilenames = []string{
|
|
|
|
".svn",
|
|
|
|
".git",
|
|
|
|
".ds_store",
|
|
|
|
"*.scc",
|
|
|
|
".*",
|
|
|
|
"CVS",
|
|
|
|
"thumbs.db",
|
|
|
|
"picasa.ini",
|
|
|
|
"*~",
|
|
|
|
}
|
|
|
|
|
2020-11-11 04:27:45 +08:00
|
|
|
// androidResourceGlob returns the list of files in the given directory, using the standard
|
|
|
|
// exclusion patterns for Android resources.
|
2018-03-29 05:58:31 +08:00
|
|
|
func androidResourceGlob(ctx android.ModuleContext, dir android.Path) android.Paths {
|
|
|
|
return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames)
|
|
|
|
}
|
|
|
|
|
2020-11-11 04:27:45 +08:00
|
|
|
// androidResourceGlobList creates a rule to write the list of files in the given directory, using
|
|
|
|
// the standard exclusion patterns for Android resources, to the given output file.
|
|
|
|
func androidResourceGlobList(ctx android.ModuleContext, dir android.Path,
|
|
|
|
fileListFile android.WritablePath) {
|
|
|
|
|
|
|
|
android.GlobToListFileRule(ctx, filepath.Join(dir.String(), "**/*"),
|
|
|
|
androidResourceIgnoreFilenames, fileListFile)
|
|
|
|
}
|
|
|
|
|
2019-03-18 23:53:16 +08:00
|
|
|
type overlayType int
|
|
|
|
|
|
|
|
const (
|
|
|
|
device overlayType = iota + 1
|
|
|
|
product
|
|
|
|
)
|
|
|
|
|
|
|
|
type rroDir struct {
|
|
|
|
path android.Path
|
|
|
|
overlayType overlayType
|
|
|
|
}
|
|
|
|
|
2018-03-29 05:58:31 +08:00
|
|
|
type overlayGlobResult struct {
|
2019-03-18 23:53:16 +08:00
|
|
|
dir string
|
|
|
|
paths android.DirectorySortedPaths
|
|
|
|
overlayType overlayType
|
2018-03-29 05:58:31 +08:00
|
|
|
}
|
|
|
|
|
2019-02-05 03:22:08 +08:00
|
|
|
var overlayDataKey = android.NewOnceKey("overlayDataKey")
|
2018-03-29 05:58:31 +08:00
|
|
|
|
|
|
|
type globbedResourceDir struct {
|
|
|
|
dir android.Path
|
|
|
|
files android.Paths
|
|
|
|
}
|
|
|
|
|
2020-10-07 09:56:10 +08:00
|
|
|
func overlayResourceGlob(ctx android.ModuleContext, a *aapt, dir android.Path) (res []globbedResourceDir,
|
2019-03-18 23:53:16 +08:00
|
|
|
rroDirs []rroDir) {
|
2018-03-29 05:58:31 +08:00
|
|
|
|
|
|
|
overlayData := ctx.Config().Get(overlayDataKey).([]overlayGlobResult)
|
|
|
|
|
|
|
|
// Runtime resource overlays (RRO) may be turned on by the product config for some modules
|
2020-10-07 09:56:10 +08:00
|
|
|
rroEnabled := a.IsRROEnforced(ctx)
|
2018-03-29 05:58:31 +08:00
|
|
|
|
|
|
|
for _, data := range overlayData {
|
|
|
|
files := data.paths.PathsInDirectory(filepath.Join(data.dir, dir.String()))
|
|
|
|
if len(files) > 0 {
|
|
|
|
overlayModuleDir := android.PathForSource(ctx, data.dir, dir.String())
|
2019-01-31 00:03:37 +08:00
|
|
|
|
2018-03-29 05:58:31 +08:00
|
|
|
// If enforce RRO is enabled for this module and this overlay is not in the
|
|
|
|
// exclusion list, ignore the overlay. The list of ignored overlays will be
|
|
|
|
// passed to Make to be turned into an RRO package.
|
2019-01-31 00:03:37 +08:00
|
|
|
if rroEnabled && !ctx.Config().EnforceRROExcludedOverlay(overlayModuleDir.String()) {
|
2019-03-18 23:53:16 +08:00
|
|
|
rroDirs = append(rroDirs, rroDir{overlayModuleDir, data.overlayType})
|
2018-03-29 05:58:31 +08:00
|
|
|
} else {
|
|
|
|
res = append(res, globbedResourceDir{
|
|
|
|
dir: overlayModuleDir,
|
|
|
|
files: files,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, rroDirs
|
|
|
|
}
|
|
|
|
|
|
|
|
func OverlaySingletonFactory() android.Singleton {
|
|
|
|
return overlaySingleton{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type overlaySingleton struct{}
|
|
|
|
|
|
|
|
func (overlaySingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
|
|
|
var overlayData []overlayGlobResult
|
2019-03-18 23:53:16 +08:00
|
|
|
|
|
|
|
appendOverlayData := func(overlayDirs []string, t overlayType) {
|
|
|
|
for i := range overlayDirs {
|
|
|
|
// Iterate backwards through the list of overlay directories so that the later, lower-priority
|
|
|
|
// directories in the list show up earlier in the command line to aapt2.
|
|
|
|
overlay := overlayDirs[len(overlayDirs)-1-i]
|
|
|
|
var result overlayGlobResult
|
|
|
|
result.dir = overlay
|
|
|
|
result.overlayType = t
|
|
|
|
|
|
|
|
files, err := ctx.GlobWithDeps(filepath.Join(overlay, "**/*"), androidResourceIgnoreFilenames)
|
|
|
|
if err != nil {
|
|
|
|
ctx.Errorf("failed to glob resource dir %q: %s", overlay, err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
var paths android.Paths
|
|
|
|
for _, f := range files {
|
|
|
|
if !strings.HasSuffix(f, "/") {
|
|
|
|
paths = append(paths, android.PathForSource(ctx, f))
|
|
|
|
}
|
2018-03-29 05:58:31 +08:00
|
|
|
}
|
2019-03-18 23:53:16 +08:00
|
|
|
result.paths = android.PathsToDirectorySortedPaths(paths)
|
|
|
|
overlayData = append(overlayData, result)
|
2018-03-29 05:58:31 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-18 23:53:16 +08:00
|
|
|
appendOverlayData(ctx.Config().DeviceResourceOverlays(), device)
|
|
|
|
appendOverlayData(ctx.Config().ProductResourceOverlays(), product)
|
2018-03-29 05:58:31 +08:00
|
|
|
ctx.Config().Once(overlayDataKey, func() interface{} {
|
|
|
|
return overlayData
|
|
|
|
})
|
|
|
|
}
|