Merge "Reland "Skip packaging cross container cc deps of apk-in-apex"" into main
diff --git a/android/config.go b/android/config.go
index cb604a6..b811c55 100644
--- a/android/config.go
+++ b/android/config.go
@@ -1519,6 +1519,13 @@
return "64"
}
+func (c *deviceConfig) RecoveryPath() string {
+ if c.config.productVariables.RecoveryPath != nil {
+ return *c.config.productVariables.RecoveryPath
+ }
+ return "recovery"
+}
+
func (c *deviceConfig) VendorPath() string {
if c.config.productVariables.VendorPath != nil {
return *c.config.productVariables.VendorPath
@@ -1614,6 +1621,10 @@
return proptools.Bool(c.config.productVariables.BuildingUserdataImage)
}
+func (c *deviceConfig) BuildingRecoveryImage() bool {
+ return proptools.Bool(c.config.productVariables.BuildingRecoveryImage)
+}
+
func (c *deviceConfig) BtConfigIncludeDir() string {
return String(c.config.productVariables.BtConfigIncludeDir)
}
diff --git a/android/module.go b/android/module.go
index 67dab4f..7dda9ab 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1387,6 +1387,8 @@
partition = "ramdisk"
} else if m.InstallInVendorRamdisk() {
partition = "vendor_ramdisk"
+ } else if m.InstallInRecovery() {
+ partition = "recovery"
}
return partition
}
@@ -1866,6 +1868,7 @@
// The Target of artifacts that this module variant is responsible for creating.
CompileTarget Target
SkipAndroidMkProcessing bool
+ BaseModuleName string
}
var CommonModuleInfoKey = blueprint.NewProvider[CommonModuleInfo]()
@@ -2134,6 +2137,7 @@
ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt,
CompileTarget: m.commonProperties.CompileTarget,
SkipAndroidMkProcessing: shouldSkipAndroidMkProcessing(ctx, m),
+ BaseModuleName: m.BaseModuleName(),
}
if m.commonProperties.ForcedDisabled {
commonData.Enabled = false
diff --git a/android/neverallow.go b/android/neverallow.go
index 7f7ffa7..566d73c 100644
--- a/android/neverallow.go
+++ b/android/neverallow.go
@@ -245,6 +245,10 @@
Without("name", "librecovery_ui_ext").
With("install_in_root", "true").
NotModuleType("prebuilt_root").
+ NotModuleType("prebuilt_vendor").
+ NotModuleType("prebuilt_sbin").
+ NotModuleType("prebuilt_system").
+ NotModuleType("prebuilt_first_stage_ramdisk").
Because("install_in_root is only for init_first_stage or librecovery_ui_ext."),
}
}
@@ -282,7 +286,7 @@
}
func createLimitDirgroupRule() []Rule {
- reason := "dirgroup module and dir_srcs property of genrule is allowed only to Trusty build rule."
+ reason := "dirgroup module and dir_srcs / keep_gendir property of genrule is allowed only to Trusty build rule."
return []Rule{
NeverAllow().
ModuleType("dirgroup").
@@ -297,6 +301,13 @@
Without("name", "trusty-x86_64.lk.elf.gen").
Without("name", "trusty-x86_64-test.lk.elf.gen").
WithMatcher("dir_srcs", isSetMatcherInstance).Because(reason),
+ NeverAllow().
+ ModuleType("genrule").
+ Without("name", "trusty-arm64.lk.elf.gen").
+ Without("name", "trusty-arm64-virt-test-debug.lk.elf.gen").
+ Without("name", "trusty-x86_64.lk.elf.gen").
+ Without("name", "trusty-x86_64-test.lk.elf.gen").
+ With("keep_gendir", "true").Because(reason),
}
}
@@ -341,6 +352,10 @@
"prebuilt_tvservice",
"prebuilt_optee",
"prebuilt_tvconfig",
+ "prebuilt_vendor",
+ "prebuilt_sbin",
+ "prebuilt_system",
+ "prebuilt_first_stage_ramdisk",
).
DefinedInBpFile().
Because("module type not allowed to be defined in bp file")
@@ -705,6 +720,9 @@
}
func (r *rule) appliesToModuleType(moduleType string) bool {
+ // Remove prefix for auto-generated modules
+ moduleType = strings.TrimSuffix(moduleType, "__loadHookModule")
+ moduleType = strings.TrimSuffix(moduleType, "__bottomUpMutatorModule")
return (len(r.moduleTypes) == 0 || InList(moduleType, r.moduleTypes)) && !InList(moduleType, r.unlessModuleTypes)
}
diff --git a/android/packaging.go b/android/packaging.go
index dcd8844..d96cccd 100644
--- a/android/packaging.go
+++ b/android/packaging.go
@@ -18,7 +18,6 @@
"fmt"
"path/filepath"
"sort"
- "strings"
"github.com/google/blueprint"
"github.com/google/blueprint/gobtools"
@@ -594,10 +593,6 @@
}
seenDir := make(map[string]bool)
- preparerPath := PathForModuleOut(ctx, "preparer.sh")
- cmd := builder.Command().Tool(preparerPath)
- var sb strings.Builder
- sb.WriteString("set -e\n")
dirs := make([]WritablePath, 0, len(dirsToSpecs))
for dir, _ := range dirsToSpecs {
@@ -616,22 +611,19 @@
entries = append(entries, ps.relPathInPackage)
if _, ok := seenDir[destDir]; !ok {
seenDir[destDir] = true
- sb.WriteString(fmt.Sprintf("mkdir -p %s\n", destDir))
+ builder.Command().Textf("mkdir -p %s", destDir)
}
if ps.symlinkTarget == "" {
- cmd.Implicit(ps.srcPath)
- sb.WriteString(fmt.Sprintf("cp %s %s\n", ps.srcPath, destPath))
+ builder.Command().Text("cp").Input(ps.srcPath).Text(destPath)
} else {
- sb.WriteString(fmt.Sprintf("ln -sf %s %s\n", ps.symlinkTarget, destPath))
+ builder.Command().Textf("ln -sf %s %s", ps.symlinkTarget, destPath)
}
if ps.executable {
- sb.WriteString(fmt.Sprintf("chmod a+x %s\n", destPath))
+ builder.Command().Textf("chmod a+x %s", destPath)
}
}
}
- WriteExecutableFileRuleVerbatim(ctx, preparerPath, sb.String())
-
return entries
}
diff --git a/android/rule_builder.go b/android/rule_builder.go
index 83f8b99..db56c3f 100644
--- a/android/rule_builder.go
+++ b/android/rule_builder.go
@@ -63,6 +63,7 @@
missingDeps []string
args map[string]string
nsjail bool
+ nsjailKeepGendir bool
nsjailBasePath WritablePath
nsjailImplicits Paths
}
@@ -208,6 +209,18 @@
return r
}
+// By default, nsjail rules truncate outputDir and baseDir before running commands, similar to Sbox
+// rules which always run commands in a fresh sandbox. Calling NsjailKeepGendir keeps outputDir and
+// baseDir as-is, leaving previous artifacts. This is useful when the rules support incremental
+// builds.
+func (r *RuleBuilder) NsjailKeepGendir() *RuleBuilder {
+ if !r.nsjail {
+ panic("NsjailKeepGendir() must be called after Nsjail()")
+ }
+ r.nsjailKeepGendir = true
+ return r
+}
+
// SandboxTools enables tool sandboxing for the rule by copying any referenced tools into the
// sandbox.
func (r *RuleBuilder) SandboxTools() *RuleBuilder {
@@ -555,8 +568,17 @@
if r.nsjail {
var nsjailCmd strings.Builder
nsjailPath := r.ctx.Config().PrebuiltBuildTool(r.ctx, "nsjail")
+ if !r.nsjailKeepGendir {
+ nsjailCmd.WriteString("rm -rf ")
+ nsjailCmd.WriteString(r.nsjailBasePath.String())
+ nsjailCmd.WriteRune(' ')
+ nsjailCmd.WriteString(r.outDir.String())
+ nsjailCmd.WriteString(" && ")
+ }
nsjailCmd.WriteString("mkdir -p ")
nsjailCmd.WriteString(r.nsjailBasePath.String())
+ nsjailCmd.WriteRune(' ')
+ nsjailCmd.WriteString(r.outDir.String())
nsjailCmd.WriteString(" && ")
nsjailCmd.WriteString(nsjailPath.String())
nsjailCmd.WriteRune(' ')
@@ -853,6 +875,18 @@
pool = localPool
}
+ // If the command length is getting close to linux's maximum, dump it to a file, which allows
+ // for longer commands.
+ if len(commandString) > 100000 {
+ hasher := sha256.New()
+ hasher.Write([]byte(output.String()))
+ script := PathForOutput(r.ctx, "rule_builder_scripts", fmt.Sprintf("%x.sh", hasher.Sum(nil)))
+ commandString = "set -eu\n\n" + commandString + "\n"
+ WriteExecutableFileRuleVerbatim(r.ctx, script, commandString)
+ inputs = append(inputs, script)
+ commandString = script.String()
+ }
+
commandString = proptools.NinjaEscape(commandString)
args_vars := make([]string, len(r.args))
diff --git a/android/variable.go b/android/variable.go
index 46f54db..e06fb8a 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -351,6 +351,8 @@
OemPath *string `json:",omitempty"`
UserdataPath *string `json:",omitempty"`
BuildingUserdataImage *bool `json:",omitempty"`
+ RecoveryPath *string `json:",omitempty"`
+ BuildingRecoveryImage *bool `json:",omitempty"`
ClangTidy *bool `json:",omitempty"`
TidyChecks *string `json:",omitempty"`
diff --git a/apex/apex.go b/apex/apex.go
index 72a0455..1a598e5 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -2647,16 +2647,12 @@
func (a *apexBundle) checkJavaStableSdkVersion(ctx android.ModuleContext) {
// Visit direct deps only. As long as we guarantee top-level deps are using stable SDKs,
// java's checkLinkType guarantees correct usage for transitive deps
- ctx.VisitDirectDeps(func(module android.Module) {
+ ctx.VisitDirectDepsProxy(func(module android.ModuleProxy) {
tag := ctx.OtherModuleDependencyTag(module)
switch tag {
case javaLibTag, androidAppTag:
- if m, ok := module.(interface {
- CheckStableSdkVersion(ctx android.BaseModuleContext) error
- }); ok {
- if err := m.CheckStableSdkVersion(ctx); err != nil {
- ctx.ModuleErrorf("cannot depend on \"%v\": %v", ctx.OtherModuleName(module), err)
- }
+ if err := java.CheckStableSdkVersion(ctx, module); err != nil {
+ ctx.ModuleErrorf("cannot depend on \"%v\": %v", ctx.OtherModuleName(module), err)
}
}
})
diff --git a/etc/prebuilt_etc.go b/etc/prebuilt_etc.go
index b0b5da9..2bcbde1 100644
--- a/etc/prebuilt_etc.go
+++ b/etc/prebuilt_etc.go
@@ -81,6 +81,10 @@
ctx.RegisterModuleType("prebuilt_tvservice", PrebuiltTvServiceFactory)
ctx.RegisterModuleType("prebuilt_optee", PrebuiltOpteeFactory)
ctx.RegisterModuleType("prebuilt_tvconfig", PrebuiltTvConfigFactory)
+ ctx.RegisterModuleType("prebuilt_vendor", PrebuiltVendorFactory)
+ ctx.RegisterModuleType("prebuilt_sbin", PrebuiltSbinFactory)
+ ctx.RegisterModuleType("prebuilt_system", PrebuiltSystemFactory)
+ ctx.RegisterModuleType("prebuilt_first_stage_ramdisk", PrebuiltFirstStageRamdiskFactory)
ctx.RegisterModuleType("prebuilt_defaults", defaultsFactory)
@@ -573,6 +577,7 @@
p.installDirBase = dirBase
p.AddProperties(&p.properties)
p.AddProperties(&p.subdirProperties)
+ p.AddProperties(&p.rootProperties)
}
func InitPrebuiltRootModule(p *PrebuiltEtc) {
@@ -972,3 +977,43 @@
android.InitDefaultableModule(module)
return module
}
+
+// prebuilt_vendor installs files in <partition>/vendor directory.
+func PrebuiltVendorFactory() android.Module {
+ module := &PrebuiltEtc{}
+ InitPrebuiltEtcModule(module, "vendor")
+ // This module is device-only
+ android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
+ android.InitDefaultableModule(module)
+ return module
+}
+
+// prebuilt_sbin installs files in <partition>/sbin directory.
+func PrebuiltSbinFactory() android.Module {
+ module := &PrebuiltEtc{}
+ InitPrebuiltEtcModule(module, "sbin")
+ // This module is device-only
+ android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
+ android.InitDefaultableModule(module)
+ return module
+}
+
+// prebuilt_system installs files in <partition>/system directory.
+func PrebuiltSystemFactory() android.Module {
+ module := &PrebuiltEtc{}
+ InitPrebuiltEtcModule(module, "system")
+ // This module is device-only
+ android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
+ android.InitDefaultableModule(module)
+ return module
+}
+
+// prebuilt_first_stage_ramdisk installs files in <partition>/first_stage_ramdisk directory.
+func PrebuiltFirstStageRamdiskFactory() android.Module {
+ module := &PrebuiltEtc{}
+ InitPrebuiltEtcModule(module, "first_stage_ramdisk")
+ // This module is device-only
+ android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
+ android.InitDefaultableModule(module)
+ return module
+}
diff --git a/filesystem/aconfig_files.go b/filesystem/aconfig_files.go
index 7de404f..c80ae03 100644
--- a/filesystem/aconfig_files.go
+++ b/filesystem/aconfig_files.go
@@ -16,7 +16,6 @@
import (
"android/soong/android"
- "strings"
"github.com/google/blueprint/proptools"
)
@@ -26,57 +25,34 @@
return
}
- aconfigFlagsBuilderPath := android.PathForModuleOut(ctx, "aconfig_flags_builder.sh")
- aconfigToolPath := ctx.Config().HostToolPath(ctx, "aconfig")
- cmd := builder.Command().Tool(aconfigFlagsBuilderPath).Implicit(aconfigToolPath)
-
- var caches []string
+ var caches []android.Path
for _, ps := range specs {
- cmd.Implicits(ps.GetAconfigPaths())
- caches = append(caches, ps.GetAconfigPaths().Strings()...)
+ caches = append(caches, ps.GetAconfigPaths()...)
}
- caches = android.SortedUniqueStrings(caches)
-
- var sbCaches strings.Builder
- for _, cache := range caches {
- sbCaches.WriteString(" --cache ")
- sbCaches.WriteString(cache)
- sbCaches.WriteString(" \\\n")
- }
- sbCaches.WriteRune('\n')
-
- var sb strings.Builder
- sb.WriteString("set -e\n")
+ caches = android.SortedUniquePaths(caches)
installAconfigFlagsPath := dir.Join(ctx, "etc", "aconfig_flags.pb")
- sb.WriteString(aconfigToolPath.String())
- sb.WriteString(" dump-cache --dedup --format protobuf --out ")
- sb.WriteString(installAconfigFlagsPath.String())
- sb.WriteString(" --filter container:")
- sb.WriteString(f.PartitionType())
- sb.WriteString(" \\\n")
- sb.WriteString(sbCaches.String())
- cmd.ImplicitOutput(installAconfigFlagsPath)
+ cmd := builder.Command().
+ BuiltTool("aconfig").
+ Text(" dump-cache --dedup --format protobuf --out").
+ Output(installAconfigFlagsPath).
+ Textf("--filter container:%s", f.PartitionType())
+ for _, cache := range caches {
+ cmd.FlagWithInput("--cache ", cache)
+ }
f.appendToEntry(ctx, installAconfigFlagsPath)
installAconfigStorageDir := dir.Join(ctx, "etc", "aconfig")
- sb.WriteString("mkdir -p ")
- sb.WriteString(installAconfigStorageDir.String())
- sb.WriteRune('\n')
+ builder.Command().Text("mkdir -p").Text(installAconfigStorageDir.String())
generatePartitionAconfigStorageFile := func(fileType, fileName string) {
outputPath := installAconfigStorageDir.Join(ctx, fileName)
- sb.WriteString(aconfigToolPath.String())
- sb.WriteString(" create-storage --container ")
- sb.WriteString(f.PartitionType())
- sb.WriteString(" --file ")
- sb.WriteString(fileType)
- sb.WriteString(" --out ")
- sb.WriteString(outputPath.String())
- sb.WriteString(" --cache ")
- sb.WriteString(installAconfigFlagsPath.String())
- sb.WriteRune('\n')
- cmd.ImplicitOutput(outputPath)
+ builder.Command().
+ BuiltTool("aconfig").
+ FlagWithArg("create-storage --container ", f.PartitionType()).
+ FlagWithArg("--file ", fileType).
+ FlagWithOutput("--out ", outputPath).
+ FlagWithArg("--cache ", installAconfigFlagsPath.String())
f.appendToEntry(ctx, outputPath)
}
@@ -86,6 +62,4 @@
generatePartitionAconfigStorageFile("flag_val", "flag.val")
generatePartitionAconfigStorageFile("flag_info", "flag.info")
}
-
- android.WriteExecutableFileRuleVerbatim(ctx, aconfigFlagsBuilderPath, sb.String())
}
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go
index eb34180..b5f7e48 100644
--- a/filesystem/filesystem.go
+++ b/filesystem/filesystem.go
@@ -790,6 +790,7 @@
"system_dlkm",
"ramdisk",
"vendor_ramdisk",
+ "recovery",
}
func (f *filesystem) addMakeBuiltFiles(ctx android.ModuleContext, builder *android.RuleBuilder, rootDir android.Path) {
diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go
index 746e4de..72a5211 100644
--- a/filesystem/filesystem_test.go
+++ b/filesystem/filesystem_test.go
@@ -16,6 +16,7 @@
import (
"os"
+ "strings"
"testing"
"android/soong/android"
@@ -182,10 +183,14 @@
module := result.ModuleForTests("myfilesystem", "android_common")
output := module.Output("out/soong/.intermediates/myfilesystem/android_common/root/system/etc/linker.config.pb")
+ fullCommand := output.RuleParams.Command
+ startIndex := strings.Index(fullCommand, "conv_linker_config")
+ linkerConfigCommand := fullCommand[startIndex:]
+
android.AssertStringDoesContain(t, "linker.config.pb should have libfoo",
- output.RuleParams.Command, "libfoo.so")
+ linkerConfigCommand, "libfoo.so")
android.AssertStringDoesNotContain(t, "linker.config.pb should not have libbar",
- output.RuleParams.Command, "libbar.so")
+ linkerConfigCommand, "libbar.so")
}
func registerComponent(ctx android.RegistrationContext) {
diff --git a/filesystem/fsverity_metadata.go b/filesystem/fsverity_metadata.go
index 3119f2f..ef46067 100644
--- a/filesystem/fsverity_metadata.go
+++ b/filesystem/fsverity_metadata.go
@@ -66,62 +66,44 @@
return
}
- fsverityBuilderPath := android.PathForModuleOut(ctx, "fsverity_builder.sh")
- metadataGeneratorPath := ctx.Config().HostToolPath(ctx, "fsverity_metadata_generator")
fsverityPath := ctx.Config().HostToolPath(ctx, "fsverity")
- cmd := builder.Command().Tool(fsverityBuilderPath)
-
// STEP 1: generate .fsv_meta
var sb strings.Builder
sb.WriteString("set -e\n")
- cmd.Implicit(metadataGeneratorPath).Implicit(fsverityPath)
for _, spec := range matchedSpecs {
// srcPath is copied by CopySpecsToDir()
srcPath := rebasedDir.Join(ctx, spec.RelPathInPackage())
destPath := rebasedDir.Join(ctx, spec.RelPathInPackage()+".fsv_meta")
- sb.WriteString(metadataGeneratorPath.String())
- sb.WriteString(" --fsverity-path ")
- sb.WriteString(fsverityPath.String())
- sb.WriteString(" --signature none --hash-alg sha256 --output ")
- sb.WriteString(destPath.String())
- sb.WriteRune(' ')
- sb.WriteString(srcPath.String())
- sb.WriteRune('\n')
+ builder.Command().
+ BuiltTool("fsverity_metadata_generator").
+ FlagWithInput("--fsverity-path ", fsverityPath).
+ FlagWithArg("--signature ", "none").
+ FlagWithArg("--hash-alg ", "sha256").
+ FlagWithArg("--output ", destPath.String()).
+ Text(srcPath.String())
f.appendToEntry(ctx, destPath)
}
// STEP 2: generate signed BuildManifest.apk
// STEP 2-1: generate build_manifest.pb
- assetsPath := android.PathForModuleOut(ctx, "fsverity_manifest/assets")
- manifestPbPath := assetsPath.Join(ctx, "build_manifest.pb")
- manifestGeneratorPath := ctx.Config().HostToolPath(ctx, "fsverity_manifest_generator")
- cmd.Implicit(manifestGeneratorPath)
- sb.WriteString("rm -rf ")
- sb.WriteString(assetsPath.String())
- sb.WriteString(" && mkdir -p ")
- sb.WriteString(assetsPath.String())
- sb.WriteRune('\n')
- sb.WriteString(manifestGeneratorPath.String())
- sb.WriteString(" --fsverity-path ")
- sb.WriteString(fsverityPath.String())
- sb.WriteString(" --base-dir ")
- sb.WriteString(rootDir.String())
- sb.WriteString(" --output ")
- sb.WriteString(manifestPbPath.String())
- sb.WriteRune(' ')
- f.appendToEntry(ctx, manifestPbPath)
-
manifestGeneratorListPath := android.PathForModuleOut(ctx, "fsverity_manifest.list")
f.writeManifestGeneratorListFile(ctx, manifestGeneratorListPath, matchedSpecs, rebasedDir)
- sb.WriteRune('@')
- sb.WriteString(manifestGeneratorListPath.String())
- sb.WriteRune('\n')
- cmd.Implicit(manifestGeneratorListPath)
+ assetsPath := android.PathForModuleOut(ctx, "fsverity_manifest/assets")
+ manifestPbPath := assetsPath.Join(ctx, "build_manifest.pb")
+ builder.Command().Text("rm -rf " + assetsPath.String())
+ builder.Command().Text("mkdir -p " + assetsPath.String())
+ builder.Command().
+ BuiltTool("fsverity_manifest_generator").
+ FlagWithInput("--fsverity-path ", fsverityPath).
+ FlagWithArg("--base-dir ", rootDir.String()).
+ FlagWithArg("--output ", manifestPbPath.String()).
+ FlagWithInput("@", manifestGeneratorListPath)
+
+ f.appendToEntry(ctx, manifestPbPath)
f.appendToEntry(ctx, manifestGeneratorListPath)
// STEP 2-2: generate BuildManifest.apk (unsigned)
- aapt2Path := ctx.Config().HostToolPath(ctx, "aapt2")
apkNameSuffix := ""
if f.PartitionType() == "system_ext" {
//https://source.corp.google.com/h/googleplex-android/platform/build/+/e392d2b486c2d4187b20a72b1c67cc737ecbcca5:core/Makefile;l=3410;drc=ea8f34bc1d6e63656b4ec32f2391e9d54b3ebb6b;bpv=1;bpt=0
@@ -131,55 +113,38 @@
idsigPath := rebasedDir.Join(ctx, "etc", "security", "fsverity", fmt.Sprintf("BuildManifest%s.apk.idsig", apkNameSuffix))
manifestTemplatePath := android.PathForSource(ctx, "system/security/fsverity/AndroidManifest.xml")
libs := android.PathsForModuleSrc(ctx, f.properties.Fsverity.Libs)
- cmd.Implicit(aapt2Path)
- cmd.Implicit(manifestTemplatePath)
- cmd.Implicits(libs)
- cmd.ImplicitOutput(apkPath)
- sb.WriteString(aapt2Path.String())
- sb.WriteString(" link -o ")
- sb.WriteString(apkPath.String())
- sb.WriteString(" -A ")
- sb.WriteString(assetsPath.String())
- for _, lib := range libs {
- sb.WriteString(" -I ")
- sb.WriteString(lib.String())
- }
minSdkVersion := ctx.Config().PlatformSdkCodename()
if minSdkVersion == "REL" {
minSdkVersion = ctx.Config().PlatformSdkVersion().String()
}
- sb.WriteString(" --min-sdk-version ")
- sb.WriteString(minSdkVersion)
- sb.WriteString(" --version-code ")
- sb.WriteString(ctx.Config().PlatformSdkVersion().String())
- sb.WriteString(" --version-name ")
- sb.WriteString(ctx.Config().AppsDefaultVersionName())
- sb.WriteString(" --manifest ")
- sb.WriteString(manifestTemplatePath.String())
- sb.WriteString(" --rename-manifest-package com.android.security.fsverity_metadata.")
- sb.WriteString(f.partitionName())
- sb.WriteRune('\n')
+
+ unsignedApkCommand := builder.Command().
+ BuiltTool("aapt2").
+ Text("link").
+ FlagWithOutput("-o ", apkPath).
+ FlagWithArg("-A ", assetsPath.String())
+ for _, lib := range libs {
+ unsignedApkCommand.FlagWithInput("-I ", lib)
+ }
+ unsignedApkCommand.
+ FlagWithArg("--min-sdk-version ", minSdkVersion).
+ FlagWithArg("--version-code ", ctx.Config().PlatformSdkVersion().String()).
+ FlagWithArg("--version-name ", ctx.Config().AppsDefaultVersionName()).
+ FlagWithInput("--manifest ", manifestTemplatePath).
+ Text(" --rename-manifest-package com.android.security.fsverity_metadata." + f.partitionName())
f.appendToEntry(ctx, apkPath)
// STEP 2-3: sign BuildManifest.apk
- apksignerPath := ctx.Config().HostToolPath(ctx, "apksigner")
pemPath, keyPath := ctx.Config().DefaultAppCertificate(ctx)
- cmd.Implicit(apksignerPath)
- cmd.Implicit(pemPath)
- cmd.Implicit(keyPath)
- cmd.ImplicitOutput(idsigPath)
- sb.WriteString(apksignerPath.String())
- sb.WriteString(" sign --in ")
- sb.WriteString(apkPath.String())
- sb.WriteString(" --cert ")
- sb.WriteString(pemPath.String())
- sb.WriteString(" --key ")
- sb.WriteString(keyPath.String())
- sb.WriteRune('\n')
+ builder.Command().
+ BuiltTool("apksigner").
+ Text("sign").
+ FlagWithArg("--in ", apkPath.String()).
+ FlagWithInput("--cert ", pemPath).
+ FlagWithInput("--key ", keyPath).
+ ImplicitOutput(idsigPath)
f.appendToEntry(ctx, idsigPath)
-
- android.WriteExecutableFileRuleVerbatim(ctx, fsverityBuilderPath, sb.String())
}
diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go
index e40bce5..ec52f61 100644
--- a/fsgen/filesystem_creator.go
+++ b/fsgen/filesystem_creator.go
@@ -108,6 +108,9 @@
if buildingVendorBootImage(partitionVars) {
generatedPartitions = append(generatedPartitions, "vendor_ramdisk")
}
+ if ctx.DeviceConfig().BuildingRecoveryImage() && ctx.DeviceConfig().RecoveryPath() == "recovery" {
+ generatedPartitions = append(generatedPartitions, "recovery")
+ }
return generatedPartitions
}
diff --git a/fsgen/fsgen_mutators.go b/fsgen/fsgen_mutators.go
index 0cc643e..b99e2da 100644
--- a/fsgen/fsgen_mutators.go
+++ b/fsgen/fsgen_mutators.go
@@ -150,6 +150,7 @@
},
"ramdisk": {},
"vendor_ramdisk": {},
+ "recovery": {},
},
fsDepsMutex: sync.Mutex{},
moduleToInstallationProps: map[string]installationProperties{},
diff --git a/fsgen/prebuilt_etc_modules_gen.go b/fsgen/prebuilt_etc_modules_gen.go
index efbc462..83990a6 100644
--- a/fsgen/prebuilt_etc_modules_gen.go
+++ b/fsgen/prebuilt_etc_modules_gen.go
@@ -176,40 +176,44 @@
var (
etcInstallPathToFactoryList = map[string]android.ModuleFactory{
- "": etc.PrebuiltRootFactory,
- "avb": etc.PrebuiltAvbFactory,
- "bin": etc.PrebuiltBinaryFactory,
- "bt_firmware": etc.PrebuiltBtFirmwareFactory,
- "cacerts": etc.PrebuiltEtcCaCertsFactory,
- "dsp": etc.PrebuiltDSPFactory,
- "etc": etc.PrebuiltEtcFactory,
- "etc/dsp": etc.PrebuiltDSPFactory,
- "etc/firmware": etc.PrebuiltFirmwareFactory,
- "firmware": etc.PrebuiltFirmwareFactory,
- "fonts": etc.PrebuiltFontFactory,
- "framework": etc.PrebuiltFrameworkFactory,
- "lib": etc.PrebuiltRenderScriptBitcodeFactory,
- "lib64": etc.PrebuiltRenderScriptBitcodeFactory,
- "lib/rfsa": etc.PrebuiltRFSAFactory,
- "media": etc.PrebuiltMediaFactory,
- "odm": etc.PrebuiltOdmFactory,
- "optee": etc.PrebuiltOpteeFactory,
- "overlay": etc.PrebuiltOverlayFactory,
- "priv-app": etc.PrebuiltPrivAppFactory,
- "res": etc.PrebuiltResFactory,
- "rfs": etc.PrebuiltRfsFactory,
- "tts": etc.PrebuiltVoicepackFactory,
- "tvconfig": etc.PrebuiltTvConfigFactory,
- "tvservice": etc.PrebuiltTvServiceFactory,
- "usr/share": etc.PrebuiltUserShareFactory,
- "usr/hyphen-data": etc.PrebuiltUserHyphenDataFactory,
- "usr/keylayout": etc.PrebuiltUserKeyLayoutFactory,
- "usr/keychars": etc.PrebuiltUserKeyCharsFactory,
- "usr/srec": etc.PrebuiltUserSrecFactory,
- "usr/idc": etc.PrebuiltUserIdcFactory,
- "vendor_dlkm": etc.PrebuiltVendorDlkmFactory,
- "wallpaper": etc.PrebuiltWallpaperFactory,
- "wlc_upt": etc.PrebuiltWlcUptFactory,
+ "": etc.PrebuiltRootFactory,
+ "avb": etc.PrebuiltAvbFactory,
+ "bin": etc.PrebuiltBinaryFactory,
+ "bt_firmware": etc.PrebuiltBtFirmwareFactory,
+ "cacerts": etc.PrebuiltEtcCaCertsFactory,
+ "dsp": etc.PrebuiltDSPFactory,
+ "etc": etc.PrebuiltEtcFactory,
+ "etc/dsp": etc.PrebuiltDSPFactory,
+ "etc/firmware": etc.PrebuiltFirmwareFactory,
+ "firmware": etc.PrebuiltFirmwareFactory,
+ "first_stage_ramdisk": etc.PrebuiltFirstStageRamdiskFactory,
+ "fonts": etc.PrebuiltFontFactory,
+ "framework": etc.PrebuiltFrameworkFactory,
+ "lib": etc.PrebuiltRenderScriptBitcodeFactory,
+ "lib64": etc.PrebuiltRenderScriptBitcodeFactory,
+ "lib/rfsa": etc.PrebuiltRFSAFactory,
+ "media": etc.PrebuiltMediaFactory,
+ "odm": etc.PrebuiltOdmFactory,
+ "optee": etc.PrebuiltOpteeFactory,
+ "overlay": etc.PrebuiltOverlayFactory,
+ "priv-app": etc.PrebuiltPrivAppFactory,
+ "sbin": etc.PrebuiltSbinFactory,
+ "system": etc.PrebuiltSystemFactory,
+ "res": etc.PrebuiltResFactory,
+ "rfs": etc.PrebuiltRfsFactory,
+ "tts": etc.PrebuiltVoicepackFactory,
+ "tvconfig": etc.PrebuiltTvConfigFactory,
+ "tvservice": etc.PrebuiltTvServiceFactory,
+ "usr/share": etc.PrebuiltUserShareFactory,
+ "usr/hyphen-data": etc.PrebuiltUserHyphenDataFactory,
+ "usr/keylayout": etc.PrebuiltUserKeyLayoutFactory,
+ "usr/keychars": etc.PrebuiltUserKeyCharsFactory,
+ "usr/srec": etc.PrebuiltUserSrecFactory,
+ "usr/idc": etc.PrebuiltUserIdcFactory,
+ "vendor": etc.PrebuiltVendorFactory,
+ "vendor_dlkm": etc.PrebuiltVendorDlkmFactory,
+ "wallpaper": etc.PrebuiltWallpaperFactory,
+ "wlc_upt": etc.PrebuiltWlcUptFactory,
}
)
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 9d2dbc7..ac62b8d 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -230,8 +230,9 @@
shards int
// For nsjail tasks
- useNsjail bool
- dirSrcs android.DirectoryPaths
+ useNsjail bool
+ dirSrcs android.DirectoryPaths
+ keepGendir bool
}
func (g *Module) GeneratedSourceFiles() android.Paths {
@@ -487,6 +488,9 @@
name := "generator"
if task.useNsjail {
rule = android.NewRuleBuilder(pctx, ctx).Nsjail(task.genDir, android.PathForModuleOut(ctx, "nsjail_build_sandbox"))
+ if task.keepGendir {
+ rule.NsjailKeepGendir()
+ }
} else {
manifestName := "genrule.sbox.textproto"
if task.shards > 0 {
@@ -897,17 +901,24 @@
return nil
}
+ keepGendir := Bool(properties.Keep_gendir)
+ if keepGendir && !useNsjail {
+ ctx.PropertyErrorf("keep_gendir", "can't use keep_gendir if use_nsjail is false")
+ return nil
+ }
+
outs := make(android.WritablePaths, len(properties.Out))
for i, out := range properties.Out {
outs[i] = android.PathForModuleGen(ctx, out)
}
return []generateTask{{
- in: srcFiles,
- out: outs,
- genDir: android.PathForModuleGen(ctx),
- cmd: rawCommand,
- useNsjail: useNsjail,
- dirSrcs: dirSrcs,
+ in: srcFiles,
+ out: outs,
+ genDir: android.PathForModuleGen(ctx),
+ cmd: rawCommand,
+ useNsjail: useNsjail,
+ dirSrcs: dirSrcs,
+ keepGendir: keepGendir,
}}
}
@@ -928,6 +939,10 @@
// dir_srcs is limited only to Trusty build.
Dir_srcs []string `android:"path"`
+ // If set to true, $(genDir) is not truncated. Useful when this genrule can be incrementally
+ // built. Can be set only when use_nsjail is true.
+ Keep_gendir *bool
+
// names of the output files that will be generated
Out []string `android:"arch_variant"`
}
diff --git a/java/base.go b/java/base.go
index 3bf2e23..c0ac4ab 100644
--- a/java/base.go
+++ b/java/base.go
@@ -612,21 +612,24 @@
return proptools.Bool(j.properties.Is_stubs_module)
}
-func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
- sdkVersion := j.SdkVersion(ctx)
- if sdkVersion.Stable() {
- return nil
- }
- if sdkVersion.Kind == android.SdkCorePlatform {
- if useLegacyCorePlatformApi(ctx, j.BaseModuleName()) {
- return fmt.Errorf("non stable SDK %v - uses legacy core platform", sdkVersion)
- } else {
- // Treat stable core platform as stable.
+func CheckStableSdkVersion(ctx android.BaseModuleContext, module android.ModuleProxy) error {
+ if info, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
+ if info.SdkVersion.Stable() {
return nil
}
- } else {
- return fmt.Errorf("non stable SDK %v", sdkVersion)
+ if info.SdkVersion.Kind == android.SdkCorePlatform {
+ if useLegacyCorePlatformApi(ctx, android.OtherModuleProviderOrDefault(ctx, module, android.CommonModuleInfoKey).BaseModuleName) {
+ return fmt.Errorf("non stable SDK %v - uses legacy core platform", info.SdkVersion)
+ } else {
+ // Treat stable core platform as stable.
+ return nil
+ }
+ } else {
+ return fmt.Errorf("non stable SDK %v", info.SdkVersion)
+ }
}
+
+ return nil
}
// checkSdkVersions enforces restrictions around SDK dependencies.
@@ -1300,6 +1303,7 @@
ExportedPluginDisableTurbine: j.exportedDisableTurbine,
StubsLinkType: j.stubsLinkType,
AconfigIntermediateCacheOutputPaths: deps.aconfigProtoFiles,
+ SdkVersion: j.SdkVersion(ctx),
})
j.outputFile = j.headerJarFile
@@ -1929,6 +1933,7 @@
JacocoReportClassesFile: j.jacocoReportClassesFile,
StubsLinkType: j.stubsLinkType,
AconfigIntermediateCacheOutputPaths: j.aconfigCacheFiles,
+ SdkVersion: j.SdkVersion(ctx),
})
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
diff --git a/java/java.go b/java/java.go
index 260d336..ee112c1 100644
--- a/java/java.go
+++ b/java/java.go
@@ -326,6 +326,8 @@
// AconfigIntermediateCacheOutputPaths is a path to the cache files collected from the
// java_aconfig_library modules that are statically linked to this module.
AconfigIntermediateCacheOutputPaths android.Paths
+
+ SdkVersion android.SdkSpec
}
var JavaInfoProvider = blueprint.NewProvider[*JavaInfo]()