summaryrefslogtreecommitdiff
path: root/android/image.go
diff options
context:
space:
mode:
Diffstat (limited to 'android/image.go')
-rw-r--r--android/image.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/android/image.go b/android/image.go
new file mode 100644
index 000000000..5ec1b16f5
--- /dev/null
+++ b/android/image.go
@@ -0,0 +1,83 @@
+// 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
+
+ // 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 will be passed a newly created recovery variant of the module. ModuleBase implements
+ // SetImageVariation, most module types will not need to override it, and those that do must call the
+ // overridden method. Implementors of SetImageVariation must be careful to modify the module argument
+ // and not the receiver.
+ 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 = "core"
+
+ // RecoveryVariation means a module to be installed to recovery image.
+ RecoveryVariation string = "recovery"
+)
+
+// 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.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])
+ }
+ }
+}