blob: f1e31ca03ad6969a04d6f841ba3b9fd330f70919 [file] [log] [blame]
Kiyoung Kim48f37782021-07-07 12:42:39 +09001// Copyright 2021 The Android Open Source Project
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.
14package snapshot
15
16import "android/soong/android"
17
18// Interface for modules which can be captured in the recovery snapshot.
19type RecoverySnapshotModuleInterface interface {
20 SnapshotModuleInterfaceBase
21 InRecovery() bool
22 ExcludeFromRecoverySnapshot() bool
23}
24
25var recoverySnapshotSingleton = SnapshotSingleton{
26 "recovery", // name
27 "SOONG_RECOVERY_SNAPSHOT_ZIP", // makeVar
28 android.OptionalPath{}, // snapshotZipFile
29 RecoverySnapshotImageSingleton, // Image
30 false, // Fake
31}
32
33func RecoverySnapshotSingleton() android.Singleton {
34 return &recoverySnapshotSingleton
35}
36
37// Determine if a dir under source tree is an SoC-owned proprietary directory based
38// on recovery snapshot configuration
39// Examples: device/, vendor/
40func isRecoveryProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool {
41 return RecoverySnapshotSingleton().(*SnapshotSingleton).Image.IsProprietaryPath(dir, deviceConfig)
42}
43
44func IsRecoveryProprietaryModule(ctx android.BaseModuleContext) bool {
45
46 // Any module in a recovery proprietary path is a recovery proprietary
47 // module.
48 if isRecoveryProprietaryPath(ctx.ModuleDir(), ctx.DeviceConfig()) {
49 return true
50 }
51
52 // However if the module is not in a recovery proprietary path, it may
53 // still be a recovery proprietary module. This happens for cc modules
54 // that are excluded from the recovery snapshot, and it means that the
55 // vendor has assumed control of the framework-provided module.
56
57 if c, ok := ctx.Module().(RecoverySnapshotModuleInterface); ok {
58 if c.ExcludeFromRecoverySnapshot() {
59 return true
60 }
61 }
62
63 return false
64}
65
66var RecoverySnapshotImageName = "recovery"
67
68type RecoverySnapshotImage struct{}
69
70func (RecoverySnapshotImage) Init(ctx android.RegistrationContext) {
71 ctx.RegisterSingletonType("recovery-snapshot", RecoverySnapshotSingleton)
72}
73
Jose Galmesd7d99be2021-11-05 14:04:54 -070074func (RecoverySnapshotImage) RegisterAdditionalModule(ctx android.RegistrationContext, name string, factory android.ModuleFactory) {
75 ctx.RegisterModuleType(name, factory)
76}
77
Kiyoung Kim48f37782021-07-07 12:42:39 +090078func (RecoverySnapshotImage) shouldGenerateSnapshot(ctx android.SingletonContext) bool {
79 // RECOVERY_SNAPSHOT_VERSION must be set to 'current' in order to generate a
80 // snapshot.
81 return ctx.DeviceConfig().RecoverySnapshotVersion() == "current"
82}
83
84func (RecoverySnapshotImage) InImage(m SnapshotModuleInterfaceBase) func() bool {
85 r, ok := m.(RecoverySnapshotModuleInterface)
86
87 if !ok {
88 // This module does not support recovery snapshot
89 return func() bool { return false }
90 }
91 return r.InRecovery
92}
93
94func (RecoverySnapshotImage) IsProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool {
95 return isDirectoryExcluded(dir, deviceConfig.RecoverySnapshotDirsExcludedMap(), deviceConfig.RecoverySnapshotDirsIncludedMap())
96}
97
98func (RecoverySnapshotImage) ExcludeFromSnapshot(m SnapshotModuleInterfaceBase) bool {
99 r, ok := m.(RecoverySnapshotModuleInterface)
100
101 if !ok {
102 // This module does not support recovery snapshot
103 return true
104 }
105 return r.ExcludeFromRecoverySnapshot()
106}
107
108func (RecoverySnapshotImage) IsUsingSnapshot(cfg android.DeviceConfig) bool {
109 recoverySnapshotVersion := cfg.RecoverySnapshotVersion()
110 return recoverySnapshotVersion != "current" && recoverySnapshotVersion != ""
111}
112
113func (RecoverySnapshotImage) TargetSnapshotVersion(cfg android.DeviceConfig) string {
114 return cfg.RecoverySnapshotVersion()
115}
116
117func (RecoverySnapshotImage) ExcludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool {
118 // If we're using full snapshot, not directed snapshot, capture every module
119 if !cfg.DirectedRecoverySnapshot() {
120 return false
121 }
122 // Else, checks if name is in RECOVERY_SNAPSHOT_MODULES.
123 return !cfg.RecoverySnapshotModules()[name]
124}
125
126func (RecoverySnapshotImage) ImageName() string {
127 return RecoverySnapshotImageName
128}
129
130var RecoverySnapshotImageSingleton RecoverySnapshotImage
131
132func init() {
133 RecoverySnapshotImageSingleton.Init(android.InitRegistrationContext)
134}