From a6182ab2fa21738384a3d83c6038c17f01b29dda Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 21 Aug 2024 10:47:44 -0700 Subject: [PATCH] Move checkbuild targets of Soong modules into Soong Pass the name of Soong's checkbuild target for each module to Make so that it can depend on it from the main checkbuild rule. This will give better control over which files get built, allowing checkbuild to skip the jar combining step when transitive classpath jars are enabled. The per-module checkbuild targets are passed to make instead of added directly as a dependency of checkbuild in order to maintain the existing behavior of only building modules exposed to make in checkbuild. Also tweak the existing calls to CheckbuildFile and add InstallFileWithoutCheckbuild to match the files that are in the Make-based checkbuild. Bug: 308016794 Test: m checkbuild Change-Id: Ic5140819381d58f4d00f23a7a12447950c4cf268 --- android/androidmk.go | 8 ++++++ android/module.go | 48 +++++++++++++++++++++++++--------- android/module_context.go | 55 ++++++++++++++++++++++++++++----------- apex/androidmk.go | 5 ++++ apex/apex.go | 5 ++++ java/aar.go | 9 ++++++- java/app.go | 2 ++ java/base.go | 9 ++++++- java/dexpreopt.go | 4 ++- java/java.go | 3 +++ java/sdk_library.go | 5 ++++ rust/rust.go | 5 ++-- sdk/sdk.go | 5 ++++ sdk/update.go | 4 +-- 14 files changed, 131 insertions(+), 36 deletions(-) diff --git a/android/androidmk.go b/android/androidmk.go index 68a6415b1..fb515313d 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -554,6 +554,14 @@ func (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint a.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", proptools.Bool(base.commonProperties.No_full_install)) } + if info.UncheckedModule { + a.SetBool("LOCAL_DONT_CHECK_MODULE", true) + } else if info.CheckbuildTarget != nil { + a.SetPath("LOCAL_CHECKED_MODULE", info.CheckbuildTarget) + } else { + a.SetOptionalPath("LOCAL_CHECKED_MODULE", a.OutputFile) + } + if len(info.TestData) > 0 { a.AddStrings("LOCAL_TEST_DATA", androidMkDataPaths(info.TestData)...) } diff --git a/android/module.go b/android/module.go index 7ce4e0535..297a1dc87 100644 --- a/android/module.go +++ b/android/module.go @@ -1545,26 +1545,43 @@ func (m *ModuleBase) VintfFragmentModuleNames(ctx ConfigAndErrorContext) []strin return m.base().commonProperties.Vintf_fragment_modules.GetOrDefault(m.ConfigurableEvaluator(ctx), nil) } +func (m *ModuleBase) generateVariantTarget(ctx *moduleContext) { + namespacePrefix := ctx.Namespace().id + if namespacePrefix != "" { + namespacePrefix = namespacePrefix + "-" + } + + if !ctx.uncheckedModule { + name := namespacePrefix + ctx.ModuleName() + "-" + ctx.ModuleSubDir() + "-checkbuild" + ctx.Phony(name, ctx.checkbuildFiles...) + ctx.checkbuildTarget = PathForPhony(ctx, name) + } + +} + func (m *ModuleBase) generateModuleTarget(ctx *moduleContext) { var allInstalledFiles InstallPaths - var allCheckbuildFiles Paths + var allCheckbuildTargets Paths ctx.VisitAllModuleVariants(func(module Module) { a := module.base() - var checkBuilds Paths + var checkbuildTarget Path + var uncheckedModule bool if a == m { allInstalledFiles = append(allInstalledFiles, ctx.installFiles...) - checkBuilds = ctx.checkbuildFiles + checkbuildTarget = ctx.checkbuildTarget + uncheckedModule = ctx.uncheckedModule } else { info := OtherModuleProviderOrDefault(ctx, module, InstallFilesProvider) allInstalledFiles = append(allInstalledFiles, info.InstallFiles...) - checkBuilds = info.CheckbuildFiles + checkbuildTarget = info.CheckbuildTarget + uncheckedModule = info.UncheckedModule } // A module's -checkbuild phony targets should // not be created if the module is not exported to make. // Those could depend on the build target and fail to compile // for the current build target. - if !ctx.Config().KatiEnabled() || !shouldSkipAndroidMkProcessing(ctx, a) { - allCheckbuildFiles = append(allCheckbuildFiles, checkBuilds...) + if (!ctx.Config().KatiEnabled() || !shouldSkipAndroidMkProcessing(ctx, a)) && !uncheckedModule && checkbuildTarget != nil { + allCheckbuildTargets = append(allCheckbuildTargets, checkbuildTarget) } }) @@ -1585,11 +1602,10 @@ func (m *ModuleBase) generateModuleTarget(ctx *moduleContext) { deps = append(deps, info.InstallTarget) } - if len(allCheckbuildFiles) > 0 { + if len(allCheckbuildTargets) > 0 { name := namespacePrefix + ctx.ModuleName() + "-checkbuild" - ctx.Phony(name, allCheckbuildFiles...) - info.CheckbuildTarget = PathForPhony(ctx, name) - deps = append(deps, info.CheckbuildTarget) + ctx.Phony(name, allCheckbuildTargets...) + deps = append(deps, PathForPhony(ctx, name)) } if len(deps) > 0 { @@ -1706,9 +1722,11 @@ func (m *ModuleBase) archModuleContextFactory(ctx archModuleContextFactoryContex } type InstallFilesInfo struct { - InstallFiles InstallPaths - CheckbuildFiles Paths - PackagingSpecs []PackagingSpec + InstallFiles InstallPaths + CheckbuildFiles Paths + CheckbuildTarget Path + UncheckedModule bool + PackagingSpecs []PackagingSpec // katiInstalls tracks the install rules that were created by Soong but are being exported // to Make to convert to ninja rules so that Make can add additional dependencies. KatiInstalls katiInstalls @@ -1945,9 +1963,13 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) return } + m.generateVariantTarget(ctx) + installFiles.LicenseMetadataFile = ctx.licenseMetadataFile installFiles.InstallFiles = ctx.installFiles installFiles.CheckbuildFiles = ctx.checkbuildFiles + installFiles.CheckbuildTarget = ctx.checkbuildTarget + installFiles.UncheckedModule = ctx.uncheckedModule installFiles.PackagingSpecs = ctx.packagingSpecs installFiles.KatiInstalls = ctx.katiInstalls installFiles.KatiSymlinks = ctx.katiSymlinks diff --git a/android/module_context.go b/android/module_context.go index c677f9482..6c52a7e39 100644 --- a/android/module_context.go +++ b/android/module_context.go @@ -122,6 +122,16 @@ type ModuleContext interface { // dependency tags for which IsInstallDepNeeded returns true. InstallFile(installPath InstallPath, name string, srcPath Path, deps ...InstallPath) InstallPath + // InstallFileWithoutCheckbuild creates a rule to copy srcPath to name in the installPath directory, + // with the given additional dependencies, but does not add the file to the list of files to build + // during `m checkbuild`. + // + // The installed file will be returned by FilesToInstall(), and the PackagingSpec for the + // installed file will be returned by PackagingSpecs() on this module or by + // TransitivePackagingSpecs() on modules that depend on this module through dependency tags + // for which IsInstallDepNeeded returns true. + InstallFileWithoutCheckbuild(installPath InstallPath, name string, srcPath Path, deps ...InstallPath) InstallPath + // InstallFileWithExtraFilesZip creates a rule to copy srcPath to name in the installPath // directory, and also unzip a zip file containing extra files to install into the same // directory. @@ -168,7 +178,8 @@ type ModuleContext interface { // dependency tags for which IsInstallDepNeeded returns true. PackageFile(installPath InstallPath, name string, srcPath Path) PackagingSpec - CheckbuildFile(srcPath Path) + CheckbuildFile(srcPaths ...Path) + UncheckedModule() InstallInData() bool InstallInTestcases() bool @@ -237,11 +248,13 @@ type ModuleContext interface { type moduleContext struct { bp blueprint.ModuleContext baseModuleContext - packagingSpecs []PackagingSpec - installFiles InstallPaths - checkbuildFiles Paths - module Module - phonies map[string]Paths + packagingSpecs []PackagingSpec + installFiles InstallPaths + checkbuildFiles Paths + checkbuildTarget Path + uncheckedModule bool + module Module + phonies map[string]Paths // outputFiles stores the output of a module by tag and is used to set // the OutputFilesProvider in GenerateBuildActions outputFiles OutputFilesInfo @@ -512,17 +525,22 @@ func (m *moduleContext) requiresFullInstall() bool { func (m *moduleContext) InstallFile(installPath InstallPath, name string, srcPath Path, deps ...InstallPath) InstallPath { - return m.installFile(installPath, name, srcPath, deps, false, true, nil) + return m.installFile(installPath, name, srcPath, deps, false, true, true, nil) +} + +func (m *moduleContext) InstallFileWithoutCheckbuild(installPath InstallPath, name string, srcPath Path, + deps ...InstallPath) InstallPath { + return m.installFile(installPath, name, srcPath, deps, false, true, false, nil) } func (m *moduleContext) InstallExecutable(installPath InstallPath, name string, srcPath Path, deps ...InstallPath) InstallPath { - return m.installFile(installPath, name, srcPath, deps, true, true, nil) + return m.installFile(installPath, name, srcPath, deps, true, true, true, nil) } func (m *moduleContext) InstallFileWithExtraFilesZip(installPath InstallPath, name string, srcPath Path, extraZip Path, deps ...InstallPath) InstallPath { - return m.installFile(installPath, name, srcPath, deps, false, true, &extraFilesZip{ + return m.installFile(installPath, name, srcPath, deps, false, true, true, &extraFilesZip{ zip: extraZip, dir: installPath, }) @@ -559,7 +577,7 @@ func (m *moduleContext) packageFile(fullInstallPath InstallPath, srcPath Path, e } func (m *moduleContext) installFile(installPath InstallPath, name string, srcPath Path, deps []InstallPath, - executable bool, hooks bool, extraZip *extraFilesZip) InstallPath { + executable bool, hooks bool, checkbuild bool, extraZip *extraFilesZip) InstallPath { fullInstallPath := installPath.Join(m, name) if hooks { @@ -626,7 +644,9 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat m.packageFile(fullInstallPath, srcPath, executable) - m.checkbuildFiles = append(m.checkbuildFiles, srcPath) + if checkbuild { + m.checkbuildFiles = append(m.checkbuildFiles, srcPath) + } return fullInstallPath } @@ -667,7 +687,6 @@ func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, src } m.installFiles = append(m.installFiles, fullInstallPath) - m.checkbuildFiles = append(m.checkbuildFiles, srcPath) } m.packagingSpecs = append(m.packagingSpecs, PackagingSpec{ @@ -734,15 +753,21 @@ func (m *moduleContext) InstallTestData(installPath InstallPath, data []DataPath ret := make(InstallPaths, 0, len(data)) for _, d := range data { relPath := d.ToRelativeInstallPath() - installed := m.installFile(installPath, relPath, d.SrcPath, nil, false, false, nil) + installed := m.installFile(installPath, relPath, d.SrcPath, nil, false, false, true, nil) ret = append(ret, installed) } return ret } -func (m *moduleContext) CheckbuildFile(srcPath Path) { - m.checkbuildFiles = append(m.checkbuildFiles, srcPath) +// CheckbuildFile specifies the output files that should be built by checkbuild. +func (m *moduleContext) CheckbuildFile(srcPaths ...Path) { + m.checkbuildFiles = append(m.checkbuildFiles, srcPaths...) +} + +// UncheckedModule marks the current module has having no files that should be built by checkbuild. +func (m *moduleContext) UncheckedModule() { + m.uncheckedModule = true } func (m *moduleContext) blueprintModuleContext() blueprint.ModuleContext { diff --git a/apex/androidmk.go b/apex/androidmk.go index 4112108dd..933682ab1 100644 --- a/apex/androidmk.go +++ b/apex/androidmk.go @@ -136,6 +136,11 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir st fmt.Fprintln(w, "LOCAL_SOONG_INSTALLED_MODULE :=", filepath.Join(modulePath, fi.stem())) fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_PAIRS :=", fi.builtFile.String()+":"+filepath.Join(modulePath, fi.stem())) fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", fi.builtFile.String()) + if fi.checkbuildTarget != nil { + fmt.Fprintln(w, "LOCAL_CHECKED_MODULE :=", fi.checkbuildTarget.String()) + } else { + fmt.Fprintln(w, "LOCAL_CHECKED_MODULE :=", fi.builtFile.String()) + } fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", fi.class.nameInMake()) if fi.module != nil { // This apexFile's module comes from Soong diff --git a/apex/apex.go b/apex/apex.go index d5776b5de..373c56225 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -577,6 +577,8 @@ type apexFile struct { customStem string symlinks []string // additional symlinks + checkbuildTarget android.Path + // Info for Android.mk Module name of `module` in AndroidMk. Note the generated AndroidMk // module for apexFile is named something like .[] @@ -612,6 +614,9 @@ func newApexFile(ctx android.BaseModuleContext, builtFile android.Path, androidM module: module, } if module != nil { + if installFilesInfo, ok := android.OtherModuleProvider(ctx, module, android.InstallFilesProvider); ok { + ret.checkbuildTarget = installFilesInfo.CheckbuildTarget + } ret.moduleDir = ctx.OtherModuleDir(module) ret.partition = module.PartitionTag(ctx.DeviceConfig()) ret.requiredModuleNames = module.RequiredModuleNames(ctx) diff --git a/java/aar.go b/java/aar.go index 1bd372f95..db2ea66b4 100644 --- a/java/aar.go +++ b/java/aar.go @@ -403,6 +403,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptio packageName: a.manifestValues.applicationId, } a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], manifestMergerParams) + ctx.CheckbuildFile(a.mergedManifestFile) if !a.isLibrary { // Only use the merged manifest for applications. For libraries, the transitive closure of manifests // will be propagated to the final application and merged there. The merged manifest for libraries is @@ -537,6 +538,8 @@ func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptio aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages, opts.aconfigTextFiles) + ctx.CheckbuildFile(packageRes) + // Extract assets from the resource package output so that they can be used later in aapt2link // for modules that depend on this one. if android.PrefixInList(linkFlags, "-A ") { @@ -887,7 +890,6 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) var res android.Paths if a.androidLibraryProperties.BuildAAR { BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res) - ctx.CheckbuildFile(a.aarFile) } prebuiltJniPackages := android.Paths{} @@ -1252,10 +1254,12 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets()) aapt2Link(ctx, exportPackage, nil, proguardOptionsFile, aaptRTxt, linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil, nil) + ctx.CheckbuildFile(exportPackage) a.exportPackage = exportPackage rJar := android.PathForModuleOut(ctx, "busybox/R.jar") resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, rJar, nil, true, nil, false) + ctx.CheckbuildFile(rJar) a.rJar = rJar aapt2ExtractExtraPackages(ctx, extraAaptPackagesFile, a.rJar) @@ -1350,6 +1354,9 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.headerJarFile = classpathFile } + ctx.CheckbuildFile(a.headerJarFile) + ctx.CheckbuildFile(a.implementationJarFile) + android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ HeaderJars: android.PathsIfNonNil(a.headerJarFile), ResourceJars: android.PathsIfNonNil(resourceJarFile), diff --git a/java/app.go b/java/app.go index abd78b7ed..56eb917d7 100644 --- a/java/app.go +++ b/java/app.go @@ -1009,6 +1009,8 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { ctx.InstallFile(a.installDir, a.outputFile.Base(), a.outputFile, extraInstalledPaths...) } + ctx.CheckbuildFile(a.outputFile) + a.buildAppDependencyInfo(ctx) providePrebuiltInfo(ctx, diff --git a/java/base.go b/java/base.go index e516891a3..cbe6a43a8 100644 --- a/java/base.go +++ b/java/base.go @@ -1272,6 +1272,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath } j.headerJarFile = combinedHeaderJarFile + ctx.CheckbuildFile(j.headerJarFile) + android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ HeaderJars: android.PathsIfNonNil(j.headerJarFile), TransitiveLibsHeaderJars: j.transitiveLibsHeaderJars, @@ -1740,6 +1742,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath j.dexpreopt(ctx, libName, dexOutputFile) outputFile = dexOutputFile + + ctx.CheckbuildFile(dexOutputFile) } else { // There is no code to compile into a dex jar, make sure the resources are propagated // to the APK if this is an app. @@ -1783,7 +1787,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath j.collectTransitiveSrcFiles(ctx, srcFiles) - ctx.CheckbuildFile(outputFile) + ctx.CheckbuildFile(j.implementationJarFile) + ctx.CheckbuildFile(j.headerJarFile) android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ HeaderJars: android.PathsIfNonNil(j.headerJarFile), @@ -1951,6 +1956,8 @@ func (j *Module) compileJavaHeader(ctx android.ModuleContext, srcFiles, srcJars TransformJarsToJar(ctx, combinedHeaderJarOutputPath, "for turbine", jars, android.OptionalPath{}, false, nil, []string{"META-INF/TRANSITIVE"}) + ctx.CheckbuildFile(combinedHeaderJarOutputPath) + return headerJar, combinedHeaderJarOutputPath } diff --git a/java/dexpreopt.go b/java/dexpreopt.go index f949b123a..1c63e3f24 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -489,6 +489,7 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, libName string, dexJa d.configPath = android.PathForModuleOut(ctx, "dexpreopt", dexJarStem, "dexpreopt.config") dexpreopt.WriteModuleConfig(ctx, dexpreoptConfig, d.configPath) + ctx.CheckbuildFile(d.configPath) if d.dexpreoptDisabled(ctx, libName) { return @@ -592,7 +593,8 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, libName string, dexJa } } else if !d.preventInstall { - ctx.InstallFile(installPath, installBase, install.From) + // Install without adding to checkbuild to match behavior of previous Make-based checkbuild rules + ctx.InstallFileWithoutCheckbuild(installPath, installBase, install.From) } } diff --git a/java/java.go b/java/java.go index 55c878eb3..f8e9909bc 100644 --- a/java/java.go +++ b/java/java.go @@ -2735,6 +2735,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs) + ctx.CheckbuildFile(outputFile) + if ctx.Device() { // If this is a variant created for a prebuilt_apex then use the dex implementation jar // obtained from the associated deapexer module. @@ -2801,6 +2803,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { if ctx.Failed() { return } + ctx.CheckbuildFile(dexOutputFile) // Initialize the hiddenapi structure. j.initHiddenAPI(ctx, makeDexJarPathFromPath(dexOutputFile), outputFile, j.dexProperties.Uncompress_dex) diff --git a/java/sdk_library.go b/java/sdk_library.go index a7a254af8..98b65dd55 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1595,6 +1595,11 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) module.hostdexInstallFile = module.implLibraryModule.hostdexInstallFile } + if installFilesInfo, ok := android.OtherModuleProvider(ctx, module.implLibraryModule, android.InstallFilesProvider); ok { + if installFilesInfo.CheckbuildTarget != nil { + ctx.CheckbuildFile(installFilesInfo.CheckbuildTarget) + } + } android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: module.implLibraryModule.uniqueSrcFiles.Strings()}) } diff --git a/rust/rust.go b/rust/rust.go index 5a973c4e7..240c22178 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -947,6 +947,7 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { sourceLib := sourceMod.(*Module).compiler.(*libraryDecorator) mod.sourceProvider.setOutputFiles(sourceLib.sourceProvider.Srcs()) } + ctx.CheckbuildFile(mod.sourceProvider.Srcs()...) android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: mod.sourceProvider.Srcs().Strings()}) } @@ -957,15 +958,13 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { return } mod.outputFile = android.OptionalPathForPath(buildOutput.outputFile) + ctx.CheckbuildFile(buildOutput.outputFile) if buildOutput.kytheFile != nil { mod.kytheFiles = append(mod.kytheFiles, buildOutput.kytheFile) } bloaty.MeasureSizeForPaths(ctx, mod.compiler.strippedOutputFilePath(), android.OptionalPathForPath(mod.compiler.unstrippedOutputFilePath())) mod.docTimestampFile = mod.compiler.rustdoc(ctx, flags, deps) - if mod.docTimestampFile.Valid() { - ctx.CheckbuildFile(mod.docTimestampFile.Path()) - } apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider) if !proptools.BoolDefault(mod.Installable(), mod.EverInstallable()) && !mod.ProcMacro() { diff --git a/sdk/sdk.go b/sdk/sdk.go index 5b644fd85..2fb3a3f30 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -211,6 +211,11 @@ func (s *sdk) AndroidMkEntries() []android.AndroidMkEntries { OutputFile: s.snapshotFile, DistFiles: android.MakeDefaultDistFiles(s.snapshotFile.Path(), s.infoFile.Path()), Include: "$(BUILD_PHONY_PACKAGE)", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { + entries.SetBool("LOCAL_DONT_CHECK_MODULE", true) + }, + }, ExtraFooters: []android.AndroidMkExtraFootersFunc{ func(w io.Writer, name, prefix, moduleDir string) { // Allow the sdk to be built by simply passing its name on the command line. diff --git a/sdk/update.go b/sdk/update.go index a4b1967af..e1b363a89 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -563,11 +563,11 @@ be unnecessary as every module in the sdk already has its own licenses property. } builder.infoContents = string(output) android.WriteFileRuleVerbatim(ctx, info, builder.infoContents) - installedInfo := ctx.InstallFile(android.PathForMainlineSdksInstall(ctx), info.Base(), info) + installedInfo := ctx.InstallFileWithoutCheckbuild(android.PathForMainlineSdksInstall(ctx), info.Base(), info) s.infoFile = android.OptionalPathForPath(installedInfo) // Install the zip, making sure that the info file has been installed as well. - installedZip := ctx.InstallFile(android.PathForMainlineSdksInstall(ctx), outputZipFile.Base(), outputZipFile, installedInfo) + installedZip := ctx.InstallFileWithoutCheckbuild(android.PathForMainlineSdksInstall(ctx), outputZipFile.Base(), outputZipFile, installedInfo) s.snapshotFile = android.OptionalPathForPath(installedZip) }