add exclude_shared_libs for vendor_available:true libs

Adding a mechanism to conditionally exclude some shared library
dependencies when a lib is built for vendors.

Without this, some libraries cannot be earily marked as vendor_available
if they are depending on shared libs can shouldn't be marked as
vendor_available.

By using exclude_shared_libs with exclude_srcs (or __ANDROID_VNDK__
macro), we can eliminate the unnecessary dependency for vendors.

Bug: 62471389
Test: build

Change-Id: If94277b45c3769223cea371d0028e75277640356
diff --git a/cc/linker.go b/cc/linker.go
index 5a3b478..2c39132 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -87,6 +87,14 @@
 	// group static libraries.  This can resolve missing symbols issues with interdependencies
 	// between static libraries, but it is generally better to order them correctly instead.
 	Group_static_libs *bool `android:"arch_variant"`
+
+	Target struct {
+		Vendor struct {
+			// list of shared libs that should not be used to build
+			// the vendor variant of the C/C++ module.
+			Exclude_shared_libs []string
+		}
+	}
 }
 
 func NewBaseLinker() *baseLinker {
@@ -123,6 +131,10 @@
 	deps.StaticLibs = append(deps.StaticLibs, linker.Properties.Static_libs...)
 	deps.SharedLibs = append(deps.SharedLibs, linker.Properties.Shared_libs...)
 
+	if ctx.vndk() {
+		deps.SharedLibs = removeListFromList(deps.SharedLibs, linker.Properties.Target.Vendor.Exclude_shared_libs)
+	}
+
 	deps.ReexportHeaderLibHeaders = append(deps.ReexportHeaderLibHeaders, linker.Properties.Export_header_lib_headers...)
 	deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, linker.Properties.Export_static_lib_headers...)
 	deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, linker.Properties.Export_shared_lib_headers...)
diff --git a/cc/util.go b/cc/util.go
index d9cd6f7..eeb64eb 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -66,6 +66,16 @@
 	return
 }
 
+func removeListFromList(list []string, filter_out []string) (result []string) {
+	result = make([]string, 0, len(list))
+	for _, l := range list {
+		if !inList(l, filter_out) {
+			result = append(result, l)
+		}
+	}
+	return
+}
+
 func removeFromList(s string, list []string) (bool, []string) {
 	i := indexList(s, list)
 	if i != -1 {