// Copyright 2019 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package android // ImageInterface is implemented by modules that need to be split by the imageMutator. type ImageInterface interface { // ImageMutatorBegin is called before any other method in the ImageInterface. ImageMutatorBegin(ctx BaseModuleContext) // CoreVariantNeeded should return true if the module needs a core variant (installed on the system image). CoreVariantNeeded(ctx BaseModuleContext) bool // RamdiskVariantNeeded should return true if the module needs a ramdisk variant (installed on the // ramdisk partition). RamdiskVariantNeeded(ctx BaseModuleContext) bool // VendorRamdiskVariantNeeded should return true if the module needs a vendor ramdisk variant (installed on the // vendor ramdisk partition). VendorRamdiskVariantNeeded(ctx BaseModuleContext) bool // DebugRamdiskVariantNeeded should return true if the module needs a debug ramdisk variant (installed on the // debug ramdisk partition: $(PRODUCT_OUT)/debug_ramdisk). DebugRamdiskVariantNeeded(ctx BaseModuleContext) bool // RecoveryVariantNeeded should return true if the module needs a recovery variant (installed on the // recovery partition). RecoveryVariantNeeded(ctx BaseModuleContext) bool // ExtraImageVariations should return a list of the additional variations needed for the module. After the // variants are created the SetImageVariation method will be called on each newly created variant with the // its variation. ExtraImageVariations(ctx BaseModuleContext) []string // SetImageVariation is called for each newly created image variant. The receiver is the original // module, "variation" is the name of the newly created variant and "module" is the newly created // variant itself. SetImageVariation(ctx BaseModuleContext, variation string, module Module) } const ( // CoreVariation is the variant used for framework-private libraries, or // SDK libraries. (which framework-private libraries can use), which // will be installed to the system image. CoreVariation string = "" // RecoveryVariation means a module to be installed to recovery image. RecoveryVariation string = "recovery" // RamdiskVariation means a module to be installed to ramdisk image. RamdiskVariation string = "ramdisk" // VendorRamdiskVariation means a module to be installed to vendor ramdisk image. VendorRamdiskVariation string = "vendor_ramdisk" // DebugRamdiskVariation means a module to be installed to debug ramdisk image. DebugRamdiskVariation string = "debug_ramdisk" ) // imageMutator creates variants for modules that implement the ImageInterface that // allow them to build differently for each partition (recovery, core, vendor, etc.). func imageMutator(ctx BottomUpMutatorContext) { if ctx.Os() != Android { return } if m, ok := ctx.Module().(ImageInterface); ok { m.ImageMutatorBegin(ctx) var variations []string if m.CoreVariantNeeded(ctx) { variations = append(variations, CoreVariation) } if m.RamdiskVariantNeeded(ctx) { variations = append(variations, RamdiskVariation) } if m.VendorRamdiskVariantNeeded(ctx) { variations = append(variations, VendorRamdiskVariation) } if m.DebugRamdiskVariantNeeded(ctx) { variations = append(variations, DebugRamdiskVariation) } if m.RecoveryVariantNeeded(ctx) { variations = append(variations, RecoveryVariation) } extraVariations := m.ExtraImageVariations(ctx) variations = append(variations, extraVariations...) if len(variations) == 0 { return } mod := ctx.CreateVariations(variations...) for i, v := range variations { mod[i].base().setImageVariation(v) m.SetImageVariation(ctx, v, mod[i]) } } }