diff options
| -rw-r--r-- | android/config.go | 11 | ||||
| -rw-r--r-- | android/module.go | 4 | ||||
| -rw-r--r-- | android/neverallow.go | 20 | ||||
| -rw-r--r-- | android/packaging.go | 16 | ||||
| -rw-r--r-- | android/rule_builder.go | 34 | ||||
| -rw-r--r-- | android/variable.go | 2 | ||||
| -rw-r--r-- | apex/apex.go | 10 | ||||
| -rw-r--r-- | etc/prebuilt_etc.go | 45 | ||||
| -rw-r--r-- | filesystem/aconfig_files.go | 60 | ||||
| -rw-r--r-- | filesystem/filesystem.go | 1 | ||||
| -rw-r--r-- | filesystem/filesystem_test.go | 9 | ||||
| -rw-r--r-- | filesystem/fsverity_metadata.go | 117 | ||||
| -rw-r--r-- | fsgen/filesystem_creator.go | 3 | ||||
| -rw-r--r-- | fsgen/fsgen_mutators.go | 1 | ||||
| -rw-r--r-- | fsgen/prebuilt_etc_modules_gen.go | 72 | ||||
| -rw-r--r-- | genrule/genrule.go | 31 | ||||
| -rw-r--r-- | java/base.go | 29 | ||||
| -rw-r--r-- | java/java.go | 2 |
18 files changed, 272 insertions, 195 deletions
diff --git a/android/config.go b/android/config.go index cb604a654..b811c55eb 100644 --- a/android/config.go +++ b/android/config.go @@ -1519,6 +1519,13 @@ func (c *deviceConfig) BinderBitness() string { 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 @@ func (c *deviceConfig) BuildingUserdataImage() bool { 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 67dab4f9f..7dda9abc3 100644 --- a/android/module.go +++ b/android/module.go @@ -1387,6 +1387,8 @@ func (m *ModuleBase) PartitionTag(config DeviceConfig) string { partition = "ramdisk" } else if m.InstallInVendorRamdisk() { partition = "vendor_ramdisk" + } else if m.InstallInRecovery() { + partition = "recovery" } return partition } @@ -1866,6 +1868,7 @@ type CommonModuleInfo struct { // 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 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) 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 7f7ffa781..566d73c54 100644 --- a/android/neverallow.go +++ b/android/neverallow.go @@ -245,6 +245,10 @@ func createInstallInRootAllowingRules() []Rule { 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 createLimitNdkExportRule() []Rule { } 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 @@ func createLimitDirgroupRule() []Rule { 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 @@ func createPrebuiltEtcBpDefineRule() Rule { "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) appliesToOsClass(osClass OsClass) bool { } 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 dcd8844f0..d96cccd75 100644 --- a/android/packaging.go +++ b/android/packaging.go @@ -18,7 +18,6 @@ import ( "fmt" "path/filepath" "sort" - "strings" "github.com/google/blueprint" "github.com/google/blueprint/gobtools" @@ -594,10 +593,6 @@ func (p *PackagingBase) CopySpecsToDirs(ctx ModuleContext, builder *RuleBuilder, } 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 @@ func (p *PackagingBase) CopySpecsToDirs(ctx ModuleContext, builder *RuleBuilder, 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 83f8b9992..db56c3f29 100644 --- a/android/rule_builder.go +++ b/android/rule_builder.go @@ -63,6 +63,7 @@ type RuleBuilder struct { missingDeps []string args map[string]string nsjail bool + nsjailKeepGendir bool nsjailBasePath WritablePath nsjailImplicits Paths } @@ -208,6 +209,18 @@ func (r *RuleBuilder) NsjailImplicits(inputs Paths) *RuleBuilder { 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 @@ func (r *RuleBuilder) build(name string, desc string) { 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 @@ func (r *RuleBuilder) build(name string, desc string) { 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 46f54dbb4..e06fb8a0c 100644 --- a/android/variable.go +++ b/android/variable.go @@ -351,6 +351,8 @@ type ProductVariables struct { 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 72a045525..1a598e507 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2647,16 +2647,12 @@ func (a *apexBundle) checkClasspathFragments(ctx android.ModuleContext) { 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 b0b5da946..2bcbde12d 100644 --- a/etc/prebuilt_etc.go +++ b/etc/prebuilt_etc.go @@ -81,6 +81,10 @@ func RegisterPrebuiltEtcBuildComponents(ctx android.RegistrationContext) { 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 @@ func InitPrebuiltEtcModule(p *PrebuiltEtc, dirBase string) { p.installDirBase = dirBase p.AddProperties(&p.properties) p.AddProperties(&p.subdirProperties) + p.AddProperties(&p.rootProperties) } func InitPrebuiltRootModule(p *PrebuiltEtc) { @@ -972,3 +977,43 @@ func PrebuiltTvConfigFactory() android.Module { 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 7de404f2d..c80ae03d7 100644 --- a/filesystem/aconfig_files.go +++ b/filesystem/aconfig_files.go @@ -16,7 +16,6 @@ package filesystem import ( "android/soong/android" - "strings" "github.com/google/blueprint/proptools" ) @@ -26,57 +25,34 @@ func (f *filesystem) buildAconfigFlagsFiles(ctx android.ModuleContext, builder * 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) + caches = android.SortedUniquePaths(caches) - var sbCaches strings.Builder + installAconfigFlagsPath := dir.Join(ctx, "etc", "aconfig_flags.pb") + cmd := builder.Command(). + BuiltTool("aconfig"). + Text(" dump-cache --dedup --format protobuf --out"). + Output(installAconfigFlagsPath). + Textf("--filter container:%s", f.PartitionType()) for _, cache := range caches { - sbCaches.WriteString(" --cache ") - sbCaches.WriteString(cache) - sbCaches.WriteString(" \\\n") + cmd.FlagWithInput("--cache ", cache) } - sbCaches.WriteRune('\n') - - var sb strings.Builder - sb.WriteString("set -e\n") - - 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) 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 @@ func (f *filesystem) buildAconfigFlagsFiles(ctx android.ModuleContext, builder * 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 eb3418064..b5f7e486d 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -790,6 +790,7 @@ var validPartitions = []string{ "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 746e4de74..72a52111c 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -16,6 +16,7 @@ package filesystem import ( "os" + "strings" "testing" "android/soong/android" @@ -182,10 +183,14 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) { 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 3119f2f28..ef46067f5 100644 --- a/filesystem/fsverity_metadata.go +++ b/filesystem/fsverity_metadata.go @@ -66,62 +66,44 @@ func (f *filesystem) buildFsverityMetadataFiles(ctx android.ModuleContext, build 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 + manifestGeneratorListPath := android.PathForModuleOut(ctx, "fsverity_manifest.list") + f.writeManifestGeneratorListFile(ctx, manifestGeneratorListPath, matchedSpecs, rebasedDir) 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) + 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) - 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) + 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 @@ func (f *filesystem) buildFsverityMetadataFiles(ctx android.ModuleContext, build 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 e40bce58f..ec52f61dc 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -108,6 +108,9 @@ func generatedPartitions(ctx android.LoadHookContext) []string { 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 0cc643e42..b99e2dafa 100644 --- a/fsgen/fsgen_mutators.go +++ b/fsgen/fsgen_mutators.go @@ -150,6 +150,7 @@ func createFsGenState(ctx android.LoadHookContext, generatedPrebuiltEtcModuleNam }, "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 efbc462e1..83990a638 100644 --- a/fsgen/prebuilt_etc_modules_gen.go +++ b/fsgen/prebuilt_etc_modules_gen.go @@ -176,40 +176,44 @@ type prebuiltSubdirProperties struct { 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 9d2dbc71a..ac62b8d06 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -230,8 +230,9 @@ type generateTask struct { 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 @@ func (g *Module) generateCommonBuildActions(ctx android.ModuleContext) { 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 @@ func NewGenRule() *Module { 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 @@ type genRuleProperties struct { // 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 3bf2e23d8..c0ac4ab99 100644 --- a/java/base.go +++ b/java/base.go @@ -612,21 +612,24 @@ func (j *Module) IsStubsModule() bool { 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 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath ExportedPluginDisableTurbine: j.exportedDisableTurbine, StubsLinkType: j.stubsLinkType, AconfigIntermediateCacheOutputPaths: deps.aconfigProtoFiles, + SdkVersion: j.SdkVersion(ctx), }) j.outputFile = j.headerJarFile @@ -1929,6 +1933,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath 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 260d33610..ee112c1da 100644 --- a/java/java.go +++ b/java/java.go @@ -326,6 +326,8 @@ type JavaInfo struct { // 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]() |