| // Copyright 2021 The Android Open Source Project |
| // |
| // 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 snapshot |
| |
| import "android/soong/android" |
| |
| // Interface for modules which can be captured in the recovery snapshot. |
| type RecoverySnapshotModuleInterface interface { |
| SnapshotModuleInterfaceBase |
| InRecovery() bool |
| ExcludeFromRecoverySnapshot() bool |
| } |
| |
| var recoverySnapshotSingleton = SnapshotSingleton{ |
| "recovery", // name |
| "SOONG_RECOVERY_SNAPSHOT_ZIP", // makeVar |
| android.OptionalPath{}, // snapshotZipFile |
| RecoverySnapshotImageSingleton, // Image |
| false, // Fake |
| } |
| |
| func RecoverySnapshotSingleton() android.Singleton { |
| return &recoverySnapshotSingleton |
| } |
| |
| // Determine if a dir under source tree is an SoC-owned proprietary directory based |
| // on recovery snapshot configuration |
| // Examples: device/, vendor/ |
| func isRecoveryProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool { |
| return RecoverySnapshotSingleton().(*SnapshotSingleton).Image.IsProprietaryPath(dir, deviceConfig) |
| } |
| |
| func IsRecoveryProprietaryModule(ctx android.BaseModuleContext) bool { |
| |
| // Any module in a recovery proprietary path is a recovery proprietary |
| // module. |
| if isRecoveryProprietaryPath(ctx.ModuleDir(), ctx.DeviceConfig()) { |
| return true |
| } |
| |
| // However if the module is not in a recovery proprietary path, it may |
| // still be a recovery proprietary module. This happens for cc modules |
| // that are excluded from the recovery snapshot, and it means that the |
| // vendor has assumed control of the framework-provided module. |
| |
| if c, ok := ctx.Module().(RecoverySnapshotModuleInterface); ok { |
| if c.ExcludeFromRecoverySnapshot() { |
| return true |
| } |
| } |
| |
| return false |
| } |
| |
| var RecoverySnapshotImageName = "recovery" |
| |
| type RecoverySnapshotImage struct{} |
| |
| func (RecoverySnapshotImage) Init(ctx android.RegistrationContext) { |
| ctx.RegisterParallelSingletonType("recovery-snapshot", RecoverySnapshotSingleton) |
| } |
| |
| func (RecoverySnapshotImage) RegisterAdditionalModule(ctx android.RegistrationContext, name string, factory android.ModuleFactory) { |
| ctx.RegisterModuleType(name, factory) |
| } |
| |
| func (RecoverySnapshotImage) shouldGenerateSnapshot(ctx android.SingletonContext) bool { |
| // RECOVERY_SNAPSHOT_VERSION must be set to 'current' in order to generate a |
| // snapshot. |
| return ctx.DeviceConfig().RecoverySnapshotVersion() == "current" |
| } |
| |
| func (RecoverySnapshotImage) InImage(m SnapshotModuleInterfaceBase) func() bool { |
| r, ok := m.(RecoverySnapshotModuleInterface) |
| |
| if !ok { |
| // This module does not support recovery snapshot |
| return func() bool { return false } |
| } |
| return r.InRecovery |
| } |
| |
| func (RecoverySnapshotImage) IsProprietaryPath(dir string, deviceConfig android.DeviceConfig) bool { |
| return isDirectoryExcluded(dir, deviceConfig.RecoverySnapshotDirsExcludedMap(), deviceConfig.RecoverySnapshotDirsIncludedMap()) |
| } |
| |
| func (RecoverySnapshotImage) ExcludeFromSnapshot(m SnapshotModuleInterfaceBase) bool { |
| r, ok := m.(RecoverySnapshotModuleInterface) |
| |
| if !ok { |
| // This module does not support recovery snapshot |
| return true |
| } |
| return r.ExcludeFromRecoverySnapshot() |
| } |
| |
| func (RecoverySnapshotImage) IsUsingSnapshot(cfg android.DeviceConfig) bool { |
| recoverySnapshotVersion := cfg.RecoverySnapshotVersion() |
| return recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" |
| } |
| |
| func (RecoverySnapshotImage) TargetSnapshotVersion(cfg android.DeviceConfig) string { |
| return cfg.RecoverySnapshotVersion() |
| } |
| |
| func (RecoverySnapshotImage) ExcludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool { |
| // If we're using full snapshot, not directed snapshot, capture every module |
| if !cfg.DirectedRecoverySnapshot() { |
| return false |
| } |
| // Else, checks if name is in RECOVERY_SNAPSHOT_MODULES. |
| return !cfg.RecoverySnapshotModules()[name] |
| } |
| |
| func (RecoverySnapshotImage) ImageName() string { |
| return RecoverySnapshotImageName |
| } |
| |
| var RecoverySnapshotImageSingleton RecoverySnapshotImage |
| |
| func init() { |
| RecoverySnapshotImageSingleton.Init(android.InitRegistrationContext) |
| } |