Support Rust in Recovery
Bug: 178565008
Bug: 165791368
Test: Build and link a Rust library into a recovery binary
Change-Id: I1c76e6204019443c567082730a4cf680f4a2a74a
diff --git a/rust/image.go b/rust/image.go
index 3b54f12..6a83376 100644
--- a/rust/image.go
+++ b/rust/image.go
@@ -50,7 +50,7 @@
}
func (mod *Module) RecoveryAvailable() bool {
- return false
+ return Bool(mod.Properties.Recovery_available)
}
func (mod *Module) ExtraVariants() []string {
@@ -72,9 +72,7 @@
}
func (mod *Module) SetRecoveryVariantNeeded(b bool) {
- if b {
- panic("Setting recovery variant needed for Rust module is unsupported: " + mod.BaseModuleName())
- }
+ mod.Properties.RecoveryVariantNeeded = b
}
func (mod *Module) SetCoreVariantNeeded(b bool) {
@@ -107,7 +105,7 @@
}
func (mod *Module) RecoveryVariantNeeded(android.BaseModuleContext) bool {
- return mod.InRecovery()
+ return mod.Properties.RecoveryVariantNeeded
}
func (mod *Module) ExtraImageVariations(android.BaseModuleContext) []string {
@@ -144,8 +142,7 @@
}
func (mod *Module) InRecovery() bool {
- // TODO(b/165791368)
- return false
+ return mod.ModuleBase.InRecovery() || mod.ModuleBase.InstallInRecovery()
}
func (mod *Module) InVendorRamdisk() bool {
@@ -193,6 +190,8 @@
m := module.(*Module)
if variant == android.VendorRamdiskVariation {
m.MakeAsPlatform()
+ } else if variant == android.RecoveryVariation {
+ m.MakeAsPlatform()
} else if strings.HasPrefix(variant, cc.VendorVariationPrefix) {
m.Properties.ImageVariationPrefix = cc.VendorVariationPrefix
m.Properties.VndkVersion = strings.TrimPrefix(variant, cc.VendorVariationPrefix)
diff --git a/rust/rust.go b/rust/rust.go
index 4ceeef1..79a5feb 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -84,6 +84,7 @@
// Set by imageMutator
CoreVariantNeeded bool `blueprint:"mutated"`
VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
+ RecoveryVariantNeeded bool `blueprint:"mutated"`
ExtraVariants []string `blueprint:"mutated"`
// Allows this module to use non-APEX version of libraries. Useful
@@ -98,7 +99,7 @@
// On device without a dedicated recovery partition, the module is only
// available after switching root into
// /first_stage_ramdisk. To expose the module before switching root, install
- // the recovery variant instead (TODO(b/165791368) recovery not yet supported)
+ // the recovery variant instead
Vendor_ramdisk_available *bool
// Normally Soong uses the directory structure to decide which modules
@@ -115,6 +116,9 @@
// framework module from the recovery snapshot.
Exclude_from_recovery_snapshot *bool
+ // Make this module available when building for recovery
+ Recovery_available *bool
+
// Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
Min_sdk_version *string
@@ -807,6 +811,8 @@
mod.Properties.SubName += cc.VendorSuffix
} else if mod.InVendorRamdisk() && !mod.OnlyInVendorRamdisk() {
mod.Properties.SubName += cc.VendorRamdiskSuffix
+ } else if mod.InRecovery() && !mod.OnlyInRecovery() {
+ mod.Properties.SubName += cc.RecoverySuffix
}
if !toolchain.Supported() {