diff --git a/apex/apex.go b/apex/apex.go index 832188d81..70e685a25 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -435,6 +435,7 @@ type apexBundle struct { bundleModuleFile android.WritablePath outputFiles map[apexPackaging]android.WritablePath + flattenedOutput android.OutputPath installDir android.OutputPath prebuiltFileToDelete string @@ -639,6 +640,13 @@ func (a *apexBundle) OutputFiles(tag string) (android.Paths, error) { } else { return nil, nil } + case ".flattened": + if a.flattened { + flattenedApexPath := a.flattenedOutput + return android.Paths{flattenedApexPath}, nil + } else { + return nil, nil + } default: return nil, fmt.Errorf("unsupported module reference tag %q", tag) } @@ -784,6 +792,15 @@ func getCopyManifestForPrebuiltEtc(prebuilt *android.PrebuiltEtc) (fileToCopy an return } +// Context "decorator", overriding the InstallBypassMake method to always reply `true`. +type flattenedApexContext struct { + android.ModuleContext +} + +func (c *flattenedApexContext) InstallBypassMake() bool { + return true +} + func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { filesInfo := []apexFile{} @@ -1051,6 +1068,14 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { }, }) + // Temporarily wrap the original `ctx` into a `flattenedApexContext` to have it + // reply true to `InstallBypassMake()` (thus making the call + // `android.PathForModuleInstall` below use `android.pathForInstallInMakeDir` + // instead of `android.PathForOutput`) to return the correct path to the flattened + // APEX (as its contents is installed by Make, not Soong). + factx := flattenedApexContext{ctx} + a.flattenedOutput = android.PathForModuleInstall(&factx, "apex", factx.ModuleName()) + if a.apexTypes.zip() { a.buildUnflattenedApex(ctx, zipApex) } @@ -1451,6 +1476,8 @@ func (a *apexBundle) androidMkForType(apexType apexPackaging) android.AndroidMkD fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(moduleNames, " ")) } fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)") + fmt.Fprintln(w, "$(LOCAL_INSTALLED_MODULE): .KATI_IMPLICIT_OUTPUTS :=", a.flattenedOutput.String()) + } else { // zip-apex is the less common type so have the name refer to the image-apex // only and use {name}.zip if you want the zip-apex