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
This commit is contained in:
Jiyong Park 2019-07-26 23:20:40 +09:00
parent c89fe6253f
commit 03b68ddd10
2 changed files with 19 additions and 3 deletions

View File

@ -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

View File

@ -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 "":