1// Copyright 2019 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package android 16 17// ImageInterface is implemented by modules that need to be split by the imageMutator. 18type ImageInterface interface { 19 // ImageMutatorBegin is called before any other method in the ImageInterface. 20 ImageMutatorBegin(ctx BaseModuleContext) 21 22 // CoreVariantNeeded should return true if the module needs a core variant (installed on the system image). 23 CoreVariantNeeded(ctx BaseModuleContext) bool 24 25 // RamdiskVariantNeeded should return true if the module needs a ramdisk variant (installed on the 26 // ramdisk partition). 27 RamdiskVariantNeeded(ctx BaseModuleContext) bool 28 29 // VendorRamdiskVariantNeeded should return true if the module needs a vendor ramdisk variant (installed on the 30 // vendor ramdisk partition). 31 VendorRamdiskVariantNeeded(ctx BaseModuleContext) bool 32 33 // DebugRamdiskVariantNeeded should return true if the module needs a debug ramdisk variant (installed on the 34 // debug ramdisk partition: $(PRODUCT_OUT)/debug_ramdisk). 35 DebugRamdiskVariantNeeded(ctx BaseModuleContext) bool 36 37 // RecoveryVariantNeeded should return true if the module needs a recovery variant (installed on the 38 // recovery partition). 39 RecoveryVariantNeeded(ctx BaseModuleContext) bool 40 41 // ExtraImageVariations should return a list of the additional variations needed for the module. After the 42 // variants are created the SetImageVariation method will be called on each newly created variant with the 43 // its variation. 44 ExtraImageVariations(ctx BaseModuleContext) []string 45 46 // SetImageVariation is called for each newly created image variant. The receiver is the original 47 // module, "variation" is the name of the newly created variant and "module" is the newly created 48 // variant itself. 49 SetImageVariation(ctx BaseModuleContext, variation string, module Module) 50} 51 52const ( 53 // CoreVariation is the variant used for framework-private libraries, or 54 // SDK libraries. (which framework-private libraries can use), which 55 // will be installed to the system image. 56 CoreVariation string = "" 57 58 // RecoveryVariation means a module to be installed to recovery image. 59 RecoveryVariation string = "recovery" 60 61 // RamdiskVariation means a module to be installed to ramdisk image. 62 RamdiskVariation string = "ramdisk" 63 64 // VendorRamdiskVariation means a module to be installed to vendor ramdisk image. 65 VendorRamdiskVariation string = "vendor_ramdisk" 66 67 // DebugRamdiskVariation means a module to be installed to debug ramdisk image. 68 DebugRamdiskVariation string = "debug_ramdisk" 69) 70 71// imageMutator creates variants for modules that implement the ImageInterface that 72// allow them to build differently for each partition (recovery, core, vendor, etc.). 73func imageMutator(ctx BottomUpMutatorContext) { 74 if ctx.Os() != Android { 75 return 76 } 77 78 if m, ok := ctx.Module().(ImageInterface); ok { 79 m.ImageMutatorBegin(ctx) 80 81 var variations []string 82 83 if m.CoreVariantNeeded(ctx) { 84 variations = append(variations, CoreVariation) 85 } 86 if m.RamdiskVariantNeeded(ctx) { 87 variations = append(variations, RamdiskVariation) 88 } 89 if m.VendorRamdiskVariantNeeded(ctx) { 90 variations = append(variations, VendorRamdiskVariation) 91 } 92 if m.DebugRamdiskVariantNeeded(ctx) { 93 variations = append(variations, DebugRamdiskVariation) 94 } 95 if m.RecoveryVariantNeeded(ctx) { 96 variations = append(variations, RecoveryVariation) 97 } 98 99 extraVariations := m.ExtraImageVariations(ctx) 100 variations = append(variations, extraVariations...) 101 102 if len(variations) == 0 { 103 return 104 } 105 106 mod := ctx.CreateVariations(variations...) 107 for i, v := range variations { 108 mod[i].base().setImageVariation(v) 109 m.SetImageVariation(ctx, v, mod[i]) 110 } 111 } 112} 113