From 03b68ddd1027b4cd15080071071438ed1e9f8940 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 26 Jul 2019 23:20:40 +0900 Subject: [PATCH] Delete prebuilt APEXes when installing source-built APEXes To build the platform for ASAN, we do `m && SANITIZE_TARGET='addresss' m` However, at the end of the second build, the system partition could have conflicting APEXes; prebuilt APEXes from the first build and source-built APEXes from the second build. Since the file names for the prebuilt and the source-built are different (e.g. com.google.android.media.apex v.s. com.android.media.apex), we end up having two files for the same APEX. This is confusing apexd at runtime and the device fails to boot. To fix this, when building a non-prebuilt APEX, the prebuilt APEX might have been installed by the previous build is deleted. Bug: 138146044 Test: lunch aosp_cf_x86_pasan; m && SANITIZE_TARGET='address' m check that out/target/product/vsoc_x86/system/apex has com.android.*.apex only. Change-Id: Ib5a021a297cf0173ea5a3b50e9398b1cf295c558 --- android/prebuilt.go | 6 +++--- apex/apex.go | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/android/prebuilt.go b/android/prebuilt.go index b6741531d..8559df923 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -29,7 +29,7 @@ type prebuiltDependencyTag struct { blueprint.BaseDependencyTag } -var prebuiltDepTag prebuiltDependencyTag +var PrebuiltDepTag prebuiltDependencyTag type PrebuiltProperties struct { // When prefer is set to true the prebuilt will be used instead of any source module with @@ -127,7 +127,7 @@ func PrebuiltMutator(ctx BottomUpMutatorContext) { p := m.Prebuilt() name := m.base().BaseModuleName() if ctx.OtherModuleExists(name) { - ctx.AddReverseDependency(ctx.Module(), prebuiltDepTag, name) + ctx.AddReverseDependency(ctx.Module(), PrebuiltDepTag, name) p.properties.SourceExists = true } else { ctx.Rename(name) @@ -147,7 +147,7 @@ func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) { p.properties.UsePrebuilt = p.usePrebuilt(ctx, nil) } } else if s, ok := ctx.Module().(Module); ok { - ctx.VisitDirectDepsWithTag(prebuiltDepTag, func(m Module) { + ctx.VisitDirectDepsWithTag(PrebuiltDepTag, func(m Module) { p := m.(PrebuiltInterface).Prebuilt() if p.usePrebuilt(ctx, s) { p.properties.UsePrebuilt = true diff --git a/apex/apex.go b/apex/apex.go index 0466ccbe4..de9ce0d95 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -410,6 +410,8 @@ type apexBundle struct { outputFiles map[apexPackaging]android.WritablePath installDir android.OutputPath + prebuiltFileToDelete string + public_key_file android.Path private_key_file android.Path @@ -871,6 +873,12 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } else { ctx.ModuleErrorf("certificate dependency %q must be an android_app_certificate module", depName) } + case android.PrebuiltDepTag: + // If the prebuilt is force disabled, remember to delete the prebuilt file + // that might have been installed in the previous builds + if prebuilt, ok := child.(*Prebuilt); ok && prebuilt.isForceDisabled() { + a.prebuiltFileToDelete = prebuilt.InstallFilename() + } } } else { // indirect dependencies @@ -1355,6 +1363,10 @@ func (a *apexBundle) androidMkForType(apexType apexPackaging) android.AndroidMkD if len(a.externalDeps) > 0 { fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(a.externalDeps, " ")) } + if a.prebuiltFileToDelete != "" { + fmt.Fprintln(w, "LOCAL_POST_INSTALL_CMD :=", "rm -rf "+ + filepath.Join("$(OUT_DIR)", a.installDir.RelPathString(), a.prebuiltFileToDelete)) + } fmt.Fprintln(w, "include $(BUILD_PREBUILT)") if apexType == imageApex { @@ -1510,6 +1522,10 @@ func (p *Prebuilt) DepsMutator(ctx android.BottomUpMutatorContext) { p.properties.Source = src } +func (p *Prebuilt) isForceDisabled() bool { + return p.properties.ForceDisable +} + func (p *Prebuilt) OutputFiles(tag string) (android.Paths, error) { switch tag { case "":