diff --git a/android/apex.go b/android/apex.go index f6eca86ab..47d14cce1 100644 --- a/android/apex.go +++ b/android/apex.go @@ -253,6 +253,12 @@ type CopyDirectlyInAnyApexTag interface { CopyDirectlyInAnyApex() } +// Interface that identifies dependencies to skip Apex dependency check +type SkipApexAllowedDependenciesCheck interface { + // Returns true to skip the Apex dependency check, which limits the allowed dependency in build. + SkipApexAllowedDependenciesCheck() bool +} + // ApexModuleBase provides the default implementation for the ApexModule interface. APEX-aware // modules are expected to include this struct and call InitApexModule(). type ApexModuleBase struct { diff --git a/apex/builder.go b/apex/builder.go index 0e4ba1db3..106302beb 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -902,6 +902,12 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { return !externalDep } + depTag := ctx.OtherModuleDependencyTag(to) + if skipDepCheck, ok := depTag.(android.SkipApexAllowedDependenciesCheck); ok && skipDepCheck.SkipApexAllowedDependenciesCheck() { + // Check to see if dependency been marked to skip the dependency check + return !externalDep + } + if info, exists := depInfos[to.Name()]; exists { if !android.InList(from.Name(), info.From) { info.From = append(info.From, from.Name()) diff --git a/cc/cc.go b/cc/cc.go index ac6a2582c..b81526848 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -609,6 +609,9 @@ type libraryDependencyTag struct { makeSuffix string + // Whether or not this dependency should skip the apex dependency check + skipApexAllowedDependenciesCheck bool + // Whether or not this dependency has to be followed for the apex variants excludeInApex bool } diff --git a/cc/sanitize.go b/cc/sanitize.go index d7df5dc00..0e2d01a45 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -204,6 +204,13 @@ type sanitize struct { Properties SanitizeProperties } +// Mark this tag with a check to see if apex dependency check should be skipped +func (t libraryDependencyTag) SkipApexAllowedDependenciesCheck() bool { + return t.skipApexAllowedDependenciesCheck +} + +var _ android.SkipApexAllowedDependenciesCheck = (*libraryDependencyTag)(nil) + func init() { android.RegisterMakeVarsProvider(pctx, cfiMakeVarsProvider) android.RegisterMakeVarsProvider(pctx, hwasanMakeVarsProvider) @@ -1038,9 +1045,18 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { runtimeLibrary = lib } } - + // Skip apex dependency check for sharedLibraryDependency + // when sanitizer diags are enabled. Skipping the check will allow + // building with diag libraries without having to list the + // dependency in Apex's allowed_deps file. + diagEnabled := len(diagSanitizers) > 0 // dynamic executable and shared libs get shared runtime libs - depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: earlyLibraryDependency} + depTag := libraryDependencyTag{ + Kind: sharedLibraryDependency, + Order: earlyLibraryDependency, + + skipApexAllowedDependenciesCheck: diagEnabled, + } variations := append(mctx.Target().Variations(), blueprint.Variation{Mutator: "link", Variation: "shared"}) if c.Device() {