diff --git a/java/lint.go b/java/lint.go
index c79f6e7..7c06312 100644
--- a/java/lint.go
+++ b/java/lint.go
@@ -62,6 +62,10 @@
 		// If true, baselining updatability lint checks (e.g. NewApi) is prohibited. Defaults to false.
 		Strict_updatability_linting *bool
 
+		// The reverse dependency that had strict_updatability_linting set that caused this module to
+		// have it enabled, for use in error messages.
+		Strict_updatability_parents []string
+
 		// Treat the code in this module as test code for @VisibleForTesting enforcement.
 		// This will be true by default for test module types, false otherwise.
 		// If soong gets support for testonly, this flag should be replaced with that.
@@ -117,8 +121,8 @@
 	LintDepSets() LintDepSets
 
 	// Methods used to propagate strict_updatability_linting values.
-	GetStrictUpdatabilityLinting() bool
-	SetStrictUpdatabilityLinting(bool)
+	GetStrictUpdatabilityLinting(ctx android.BaseModuleContext) []string
+	SetStrictUpdatabilityLinting([]string)
 }
 
 type LintDepSets struct {
@@ -213,12 +217,22 @@
 	return l.outputs.depSets
 }
 
-func (l *linter) GetStrictUpdatabilityLinting() bool {
-	return BoolDefault(l.properties.Lint.Strict_updatability_linting, false)
+// GetStrictUpdatabilityLinting returns a list of names of modules
+// that set strict_updatability_linting: true and affect the current module.
+// Strict updatability linting should be enabled if the result is non-empty.
+func (l *linter) GetStrictUpdatabilityLinting(ctx android.BaseModuleContext) []string {
+	result := l.properties.Lint.Strict_updatability_parents
+	if proptools.Bool(l.properties.Lint.Strict_updatability_linting) {
+		result = append(result, ctx.ModuleName())
+	}
+	return result
 }
 
-func (l *linter) SetStrictUpdatabilityLinting(strictLinting bool) {
-	l.properties.Lint.Strict_updatability_linting = &strictLinting
+// SetStrictUpdatabilityLinting adds the given list of modules to this module's
+// list of "strict updatable parent" modules. If then given list is non-empty,
+// it causes strict updatability linting to be enabled on this module.
+func (l *linter) SetStrictUpdatabilityLinting(parents []string) {
+	l.properties.Lint.Strict_updatability_parents = android.SortedUniqueStrings(append(l.properties.Lint.Strict_updatability_parents, parents...))
 }
 
 var _ LintDepSetsIntf = (*linter)(nil)
@@ -325,9 +339,10 @@
 	cmd.FlagForEachArg("--error_check ", l.properties.Lint.Error_checks)
 	cmd.FlagForEachArg("--fatal_check ", l.properties.Lint.Fatal_checks)
 
-	if l.GetStrictUpdatabilityLinting() {
+	if strict_mods := l.GetStrictUpdatabilityLinting(ctx); len(strict_mods) > 0 {
 		// Verify the module does not baseline issues that endanger safe updatability.
 		if l.properties.Lint.Baseline_filename != nil {
+			cmd.FlagWithArg("--strict_updatability_parents ", proptools.ShellEscape(strings.Join(strict_mods, ",")))
 			cmd.FlagWithInput("--baseline ", android.PathForModuleSrc(ctx, *l.properties.Lint.Baseline_filename))
 			cmd.FlagForEachArg("--disallowed_issues ", updatabilityChecks)
 		}
@@ -733,11 +748,13 @@
 // Enforce the strict updatability linting to all applicable transitive dependencies.
 func enforceStrictUpdatabilityLintingMutator(ctx android.TopDownMutatorContext) {
 	m := ctx.Module()
-	if d, ok := m.(LintDepSetsIntf); ok && d.GetStrictUpdatabilityLinting() {
-		ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
-			if a, ok := d.(LintDepSetsIntf); ok {
-				a.SetStrictUpdatabilityLinting(true)
-			}
-		})
+	if d, ok := m.(LintDepSetsIntf); ok {
+		if strict_mods := d.GetStrictUpdatabilityLinting(ctx); len(strict_mods) > 0 {
+			ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
+				if a, ok := d.(LintDepSetsIntf); ok {
+					a.SetStrictUpdatabilityLinting(strict_mods)
+				}
+			})
+		}
 	}
 }
diff --git a/java/lint_test.go b/java/lint_test.go
index b51753f..6b24daa 100644
--- a/java/lint_test.go
+++ b/java/lint_test.go
@@ -202,6 +202,71 @@
 	}
 }
 
+func TestJavaLintStrictUpdatabilityLintingMultipleParents(t *testing.T) {
+	bp := `
+		java_library {
+			name: "a",
+			srcs: ["a.java"],
+			static_libs: ["b"],
+			min_sdk_version: "29",
+			sdk_version: "current",
+			lint: {
+				strict_updatability_linting: true,
+				baseline_filename: "lint-baseline.xml",
+			},
+		}
+
+		java_library {
+			name: "b",
+			srcs: ["b.java"],
+			static_libs: ["c"],
+			min_sdk_version: "29",
+			sdk_version: "current",
+			lint: {
+				strict_updatability_linting: true,
+			},
+		}
+
+		java_library {
+			name: "d",
+			srcs: ["d.java"],
+			static_libs: ["c"],
+			min_sdk_version: "29",
+			sdk_version: "current",
+			lint: {
+				strict_updatability_linting: true,
+			},
+		}
+
+		java_library {
+			name: "c",
+			srcs: ["c.java"],
+			min_sdk_version: "29",
+			sdk_version: "current",
+			lint: {
+				baseline_filename: "lint-baseline.xml",
+			}
+		}
+	`
+	fs := android.MockFS{
+		"lint-baseline.xml": nil,
+	}
+
+	result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, fs.AddToFixture()).
+		RunTestWithBp(t, bp)
+
+	c := result.ModuleForTests("c", "android_common")
+	sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, c.Output("lint.sbox.textproto"))
+	if !strings.Contains(*sboxProto.Commands[0].Command,
+		"--baseline lint-baseline.xml --disallowed_issues NewApi") {
+		t.Error("did not restrict baselining NewApi")
+	}
+	if !strings.Contains(*sboxProto.Commands[0].Command,
+		"--strict_updatability_parents a,b,d") {
+		t.Errorf("Did not find correct strict_updatability_parents in command %q", *sboxProto.Commands[0].Command)
+	}
+}
+
 func TestJavaLintDatabaseSelectionFull(t *testing.T) {
 	testCases := []struct {
 		sdk_version   string
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 49e6727..570248e 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -2968,17 +2968,17 @@
 	}
 }
 
-func (module *SdkLibraryImport) GetStrictUpdatabilityLinting() bool {
+func (module *SdkLibraryImport) GetStrictUpdatabilityLinting(ctx android.BaseModuleContext) []string {
 	if module.implLibraryModule == nil {
-		return false
+		return nil
 	} else {
-		return module.implLibraryModule.GetStrictUpdatabilityLinting()
+		return module.implLibraryModule.GetStrictUpdatabilityLinting(ctx)
 	}
 }
 
-func (module *SdkLibraryImport) SetStrictUpdatabilityLinting(strictLinting bool) {
+func (module *SdkLibraryImport) SetStrictUpdatabilityLinting(parents []string) {
 	if module.implLibraryModule != nil {
-		module.implLibraryModule.SetStrictUpdatabilityLinting(strictLinting)
+		module.implLibraryModule.SetStrictUpdatabilityLinting(parents)
 	}
 }
 
