• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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
74func (RecoverySnapshotImage) RegisterAdditionalModule(ctx android.RegistrationContext, name string, factory android.ModuleFactory) {
75	ctx.RegisterModuleType(name, factory)
76}
77
78func (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}
135