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. "variation" is set on the receiver. 48 SetImageVariation(ctx BaseModuleContext, variation string) 49} 50 51const ( 52 // CoreVariation is the variant used for framework-private libraries, or 53 // SDK libraries. (which framework-private libraries can use), which 54 // will be installed to the system image. 55 CoreVariation string = "" 56 57 // RecoveryVariation means a module to be installed to recovery image. 58 RecoveryVariation string = "recovery" 59 60 // RamdiskVariation means a module to be installed to ramdisk image. 61 RamdiskVariation string = "ramdisk" 62 63 // VendorRamdiskVariation means a module to be installed to vendor ramdisk image. 64 VendorRamdiskVariation string = "vendor_ramdisk" 65 66 // DebugRamdiskVariation means a module to be installed to debug ramdisk image. 67 DebugRamdiskVariation string = "debug_ramdisk" 68) 69 70// imageMutator creates variants for modules that implement the ImageInterface that 71// allow them to build differently for each partition (recovery, core, vendor, etc.). 72func imageMutator(ctx BottomUpMutatorContext) { 73 if ctx.Os() != Android { 74 return 75 } 76 77 if m, ok := ctx.Module().(ImageInterface); ok { 78 m.ImageMutatorBegin(ctx) 79 80 var variations []string 81 82 if m.CoreVariantNeeded(ctx) { 83 variations = append(variations, CoreVariation) 84 } 85 if m.RamdiskVariantNeeded(ctx) { 86 variations = append(variations, RamdiskVariation) 87 } 88 if m.VendorRamdiskVariantNeeded(ctx) { 89 variations = append(variations, VendorRamdiskVariation) 90 } 91 if m.DebugRamdiskVariantNeeded(ctx) { 92 variations = append(variations, DebugRamdiskVariation) 93 } 94 if m.RecoveryVariantNeeded(ctx) { 95 variations = append(variations, RecoveryVariation) 96 } 97 98 extraVariations := m.ExtraImageVariations(ctx) 99 variations = append(variations, extraVariations...) 100 101 if len(variations) == 0 { 102 return 103 } 104 105 mod := ctx.CreateVariations(variations...) 106 for i, v := range variations { 107 mod[i].base().setImageVariation(v) 108 mod[i].(ImageInterface).SetImageVariation(ctx, v) 109 } 110 } 111} 112