From f84e9c05e2103149162e4a78a68f20c164fbbba2 Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Thu, 8 Apr 2021 21:13:22 +0900 Subject: [PATCH] Add debug ramdisk variant A module will be installed to debug_ramdisk (or debug_ramdisk/first_stage_ramdisk if recovery as boot is true) if debug_ramdisk is set to true. Bug: 184004542 Test: soong test Change-Id: Ic5a4d27407e506fffa462de2149e0785f11b2ac7 --- android/arch.go | 2 +- android/image.go | 11 +++++++++++ android/module.go | 17 +++++++++++++++++ android/paths.go | 16 ++++++++++++++++ android/paths_test.go | 26 ++++++++++++++++++++++++++ cc/genrule.go | 4 ++++ cc/image.go | 4 ++++ cc/snapshot_prebuilt.go | 4 ++++ etc/prebuilt_etc.go | 28 +++++++++++++++++++++++++++- genrule/genrule.go | 1 + rust/image.go | 4 ++++ sh/sh_binary.go | 4 ++++ 12 files changed, 119 insertions(+), 2 deletions(-) diff --git a/android/arch.go b/android/arch.go index 6826f3b0b..e40b6f528 100644 --- a/android/arch.go +++ b/android/arch.go @@ -618,7 +618,7 @@ func archMutator(bpctx blueprint.BottomUpMutatorContext) { } // only the primary arch in the ramdisk / vendor_ramdisk / recovery partition - if os == Android && (module.InstallInRecovery() || module.InstallInRamdisk() || module.InstallInVendorRamdisk()) { + if os == Android && (module.InstallInRecovery() || module.InstallInRamdisk() || module.InstallInVendorRamdisk() || module.InstallInDebugRamdisk()) { osTargets = []Target{osTargets[0]} } diff --git a/android/image.go b/android/image.go index 1a1a423e2..bdb9be04d 100644 --- a/android/image.go +++ b/android/image.go @@ -30,6 +30,11 @@ type ImageInterface interface { // vendor ramdisk partition). VendorRamdiskVariantNeeded(ctx BaseModuleContext) bool + // DebugRamdiskVariantNeeded should return true if the module needs a debug ramdisk variant (installed on the + // debug ramdisk partition: $(PRODUCT_OUT)/debug_ramdisk/first_stage_ramdisk if BOARD_USES_RECOVERY_AS_ROOT is + // true, $(PRODUCT_OUT)/debug_ramdisk otherise). + DebugRamdiskVariantNeeded(ctx BaseModuleContext) bool + // RecoveryVariantNeeded should return true if the module needs a recovery variant (installed on the // recovery partition). RecoveryVariantNeeded(ctx BaseModuleContext) bool @@ -60,6 +65,9 @@ const ( // VendorRamdiskVariation means a module to be installed to vendor ramdisk image. VendorRamdiskVariation string = "vendor_ramdisk" + + // DebugRamdiskVariation means a module to be installed to debug ramdisk image. + DebugRamdiskVariation string = "debug_ramdisk" ) // imageMutator creates variants for modules that implement the ImageInterface that @@ -83,6 +91,9 @@ func imageMutator(ctx BottomUpMutatorContext) { if m.VendorRamdiskVariantNeeded(ctx) { variations = append(variations, VendorRamdiskVariation) } + if m.DebugRamdiskVariantNeeded(ctx) { + variations = append(variations, DebugRamdiskVariation) + } if m.RecoveryVariantNeeded(ctx) { variations = append(variations, RecoveryVariation) } diff --git a/android/module.go b/android/module.go index 9f923e2d0..942e07193 100644 --- a/android/module.go +++ b/android/module.go @@ -393,6 +393,7 @@ type ModuleContext interface { InstallInSanitizerDir() bool InstallInRamdisk() bool InstallInVendorRamdisk() bool + InstallInDebugRamdisk() bool InstallInRecovery() bool InstallInRoot() bool InstallBypassMake() bool @@ -450,6 +451,7 @@ type Module interface { InstallInSanitizerDir() bool InstallInRamdisk() bool InstallInVendorRamdisk() bool + InstallInDebugRamdisk() bool InstallInRecovery() bool InstallInRoot() bool InstallBypassMake() bool @@ -753,6 +755,9 @@ type commonProperties struct { // Whether this module is installed to vendor ramdisk Vendor_ramdisk *bool + // Whether this module is installed to debug ramdisk + Debug_ramdisk *bool + // Whether this module is built for non-native architectures (also known as native bridge binary) Native_bridge_supported *bool `android:"arch_variant"` @@ -1540,6 +1545,10 @@ func (m *ModuleBase) InstallInVendorRamdisk() bool { return Bool(m.commonProperties.Vendor_ramdisk) } +func (m *ModuleBase) InstallInDebugRamdisk() bool { + return Bool(m.commonProperties.Debug_ramdisk) +} + func (m *ModuleBase) InstallInRecovery() bool { return Bool(m.commonProperties.Recovery) } @@ -1593,6 +1602,10 @@ func (m *ModuleBase) InVendorRamdisk() bool { return m.base().commonProperties.ImageVariation == VendorRamdiskVariation } +func (m *ModuleBase) InDebugRamdisk() bool { + return m.base().commonProperties.ImageVariation == DebugRamdiskVariation +} + func (m *ModuleBase) InRecovery() bool { return m.base().commonProperties.ImageVariation == RecoveryVariation } @@ -2548,6 +2561,10 @@ func (m *moduleContext) InstallInVendorRamdisk() bool { return m.module.InstallInVendorRamdisk() } +func (m *moduleContext) InstallInDebugRamdisk() bool { + return m.module.InstallInDebugRamdisk() +} + func (m *moduleContext) InstallInRecovery() bool { return m.module.InstallInRecovery() } diff --git a/android/paths.go b/android/paths.go index df1222870..9d4b6eca3 100644 --- a/android/paths.go +++ b/android/paths.go @@ -107,6 +107,7 @@ type ModuleInstallPathContext interface { InstallInSanitizerDir() bool InstallInRamdisk() bool InstallInVendorRamdisk() bool + InstallInDebugRamdisk() bool InstallInRecovery() bool InstallInRoot() bool InstallBypassMake() bool @@ -1849,6 +1850,16 @@ func modulePartition(ctx ModuleInstallPathContext, os OsType) string { if !ctx.InstallInRoot() { partition += "/system" } + } else if ctx.InstallInDebugRamdisk() { + // The module is only available after switching root into + // /first_stage_ramdisk. To expose the module before switching root + // on a device without a dedicated recovery partition, install the + // recovery variant. + if ctx.DeviceConfig().BoardUsesRecoveryAsBoot() { + partition = "debug_ramdisk/first_stage_ramdisk" + } else { + partition = "debug_ramdisk" + } } else if ctx.InstallInRecovery() { if ctx.InstallInRoot() { partition = "recovery/root" @@ -2019,6 +2030,7 @@ type testModuleInstallPathContext struct { inSanitizerDir bool inRamdisk bool inVendorRamdisk bool + inDebugRamdisk bool inRecovery bool inRoot bool forceOS *OsType @@ -2051,6 +2063,10 @@ func (m testModuleInstallPathContext) InstallInVendorRamdisk() bool { return m.inVendorRamdisk } +func (m testModuleInstallPathContext) InstallInDebugRamdisk() bool { + return m.inDebugRamdisk +} + func (m testModuleInstallPathContext) InstallInRecovery() bool { return m.inRecovery } diff --git a/android/paths_test.go b/android/paths_test.go index 6ec75b42b..cb9138b98 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -394,6 +394,19 @@ func TestPathForModuleInstall(t *testing.T) { out: "target/product/test_device/vendor_ramdisk/my_test", partitionDir: "target/product/test_device/vendor_ramdisk", }, + { + name: "debug_ramdisk binary", + ctx: &testModuleInstallPathContext{ + baseModuleContext: baseModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, + inDebugRamdisk: true, + }, + in: []string{"my_test"}, + out: "target/product/test_device/debug_ramdisk/my_test", + partitionDir: "target/product/test_device/debug_ramdisk", + }, { name: "system native test binary", ctx: &testModuleInstallPathContext{ @@ -733,6 +746,19 @@ func TestPathForModuleInstallRecoveryAsBoot(t *testing.T) { out: "target/product/test_device/vendor_ramdisk/first_stage_ramdisk/my_test", partitionDir: "target/product/test_device/vendor_ramdisk/first_stage_ramdisk", }, + { + name: "debug_ramdisk binary", + ctx: &testModuleInstallPathContext{ + baseModuleContext: baseModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, + inDebugRamdisk: true, + }, + in: []string{"my_test"}, + out: "target/product/test_device/debug_ramdisk/first_stage_ramdisk/my_test", + partitionDir: "target/product/test_device/debug_ramdisk/first_stage_ramdisk", + }, } for _, tc := range testCases { diff --git a/cc/genrule.go b/cc/genrule.go index ca4fda7e2..82d7205da 100644 --- a/cc/genrule.go +++ b/cc/genrule.go @@ -75,6 +75,10 @@ func (g *GenruleExtraProperties) VendorRamdiskVariantNeeded(ctx android.BaseModu return Bool(g.Vendor_ramdisk_available) } +func (g *GenruleExtraProperties) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { + return false +} + func (g *GenruleExtraProperties) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { // If the build is using a snapshot, the recovery variant under AOSP directories // is not needed. diff --git a/cc/image.go b/cc/image.go index ca00ac976..c331ae248 100644 --- a/cc/image.go +++ b/cc/image.go @@ -472,6 +472,10 @@ func (c *Module) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) bool return c.Properties.VendorRamdiskVariantNeeded } +func (c *Module) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { + return false +} + func (c *Module) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { return c.Properties.RecoveryVariantNeeded } diff --git a/cc/snapshot_prebuilt.go b/cc/snapshot_prebuilt.go index aa707689a..6d48aed64 100644 --- a/cc/snapshot_prebuilt.go +++ b/cc/snapshot_prebuilt.go @@ -308,6 +308,10 @@ func (s *snapshot) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) boo return false } +func (s *snapshot) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { + return false +} + func (s *snapshot) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { return false } diff --git a/etc/prebuilt_etc.go b/etc/prebuilt_etc.go index 6291325f4..a5c1a96f3 100644 --- a/etc/prebuilt_etc.go +++ b/etc/prebuilt_etc.go @@ -90,6 +90,13 @@ type prebuiltEtcProperties struct { // the recovery variant instead. Vendor_ramdisk_available *bool + // Make this module available when building for debug ramdisk. + // 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. + Debug_ramdisk_available *bool + // Make this module available when building for recovery. Recovery_available *bool @@ -154,6 +161,18 @@ func (p *PrebuiltEtc) InstallInVendorRamdisk() bool { return p.inVendorRamdisk() } +func (p *PrebuiltEtc) inDebugRamdisk() bool { + return p.ModuleBase.InDebugRamdisk() || p.ModuleBase.InstallInDebugRamdisk() +} + +func (p *PrebuiltEtc) onlyInDebugRamdisk() bool { + return p.ModuleBase.InstallInDebugRamdisk() +} + +func (p *PrebuiltEtc) InstallInDebugRamdisk() bool { + return p.inDebugRamdisk() +} + func (p *PrebuiltEtc) inRecovery() bool { return p.ModuleBase.InRecovery() || p.ModuleBase.InstallInRecovery() } @@ -172,7 +191,7 @@ func (p *PrebuiltEtc) ImageMutatorBegin(ctx android.BaseModuleContext) {} func (p *PrebuiltEtc) CoreVariantNeeded(ctx android.BaseModuleContext) bool { return !p.ModuleBase.InstallInRecovery() && !p.ModuleBase.InstallInRamdisk() && - !p.ModuleBase.InstallInVendorRamdisk() + !p.ModuleBase.InstallInVendorRamdisk() && !p.ModuleBase.InstallInDebugRamdisk() } func (p *PrebuiltEtc) RamdiskVariantNeeded(ctx android.BaseModuleContext) bool { @@ -183,6 +202,10 @@ func (p *PrebuiltEtc) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) return proptools.Bool(p.properties.Vendor_ramdisk_available) || p.ModuleBase.InstallInVendorRamdisk() } +func (p *PrebuiltEtc) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { + return proptools.Bool(p.properties.Debug_ramdisk_available) || p.ModuleBase.InstallInDebugRamdisk() +} + func (p *PrebuiltEtc) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { return proptools.Bool(p.properties.Recovery_available) || p.ModuleBase.InstallInRecovery() } @@ -303,6 +326,9 @@ func (p *PrebuiltEtc) AndroidMkEntries() []android.AndroidMkEntries { if p.inVendorRamdisk() && !p.onlyInVendorRamdisk() { nameSuffix = ".vendor_ramdisk" } + if p.inDebugRamdisk() && !p.onlyInDebugRamdisk() { + nameSuffix = ".debug_ramdisk" + } if p.inRecovery() && !p.onlyInRecovery() { nameSuffix = ".recovery" } diff --git a/genrule/genrule.go b/genrule/genrule.go index d07b00253..e6a5ab97a 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -626,6 +626,7 @@ func (x noopImageInterface) ImageMutatorBegin(android.BaseModuleContext) func (x noopImageInterface) CoreVariantNeeded(android.BaseModuleContext) bool { return false } func (x noopImageInterface) RamdiskVariantNeeded(android.BaseModuleContext) bool { return false } func (x noopImageInterface) VendorRamdiskVariantNeeded(android.BaseModuleContext) bool { return false } +func (x noopImageInterface) DebugRamdiskVariantNeeded(android.BaseModuleContext) bool { return false } func (x noopImageInterface) RecoveryVariantNeeded(android.BaseModuleContext) bool { return false } func (x noopImageInterface) ExtraImageVariations(ctx android.BaseModuleContext) []string { return nil } func (x noopImageInterface) SetImageVariation(ctx android.BaseModuleContext, variation string, module android.Module) { diff --git a/rust/image.go b/rust/image.go index 628aca3e4..3afb4a7d5 100644 --- a/rust/image.go +++ b/rust/image.go @@ -35,6 +35,10 @@ func (mod *Module) RamdiskVariantNeeded(android.BaseModuleContext) bool { return mod.InRamdisk() } +func (mod *Module) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { + return false +} + func (mod *Module) RecoveryVariantNeeded(android.BaseModuleContext) bool { return mod.InRecovery() } diff --git a/sh/sh_binary.go b/sh/sh_binary.go index 662338133..42d5680f1 100644 --- a/sh/sh_binary.go +++ b/sh/sh_binary.go @@ -210,6 +210,10 @@ func (s *ShBinary) VendorRamdiskVariantNeeded(ctx android.BaseModuleContext) boo return proptools.Bool(s.properties.Vendor_ramdisk_available) || s.ModuleBase.InstallInVendorRamdisk() } +func (s *ShBinary) DebugRamdiskVariantNeeded(ctx android.BaseModuleContext) bool { + return false +} + func (s *ShBinary) RecoveryVariantNeeded(ctx android.BaseModuleContext) bool { return proptools.Bool(s.properties.Recovery_available) || s.ModuleBase.InstallInRecovery() }