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:
parent
c89fe6253f
commit
03b68ddd10
|
@ -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
|
||||
|
|
16
apex/apex.go
16
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 "":
|
||||
|
|
Loading…
Reference in New Issue