Disable installation for sdk snapshot versioned prebuilts

The sdk snapshot creates two prebuilts for each member one that is
versioned and one that is not. If they are both installed then they
lead to duplicate rules in make for creating the same installed file.

This change adds an installable property to cc modules that will
prevent the installation of the file and then adds installable: false
on the versioned prebuilt for cc modules.

Bug: 142935992
Test: m nothing
Change-Id: I4cb294c2b0c8a3f411eea569775835d9e41726d6
diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go
index 11bc902..2b0fd3c 100644
--- a/sdk/cc_sdk_test.go
+++ b/sdk/cc_sdk_test.go
@@ -297,6 +297,7 @@
 cc_prebuilt_library_shared {
     name: "mysdk_mynativelib@current",
     sdk_member_name: "mynativelib",
+    installable: false,
     export_include_dirs: ["include/include"],
     arch: {
         arm64: {
@@ -366,6 +367,7 @@
 cc_prebuilt_binary {
     name: "mymodule_exports_mynativebinary@current",
     sdk_member_name: "mynativebinary",
+    installable: false,
     compile_multilib: "both",
     arch: {
         arm64: {
@@ -447,6 +449,7 @@
     sdk_member_name: "mynativebinary",
     device_supported: false,
     host_supported: true,
+    installable: false,
     target: {
         linux_glibc: {
             compile_multilib: "both",
@@ -539,6 +542,7 @@
         "apex1",
         "apex2",
     ],
+    installable: false,
     export_include_dirs: ["include/include"],
     arch: {
         arm64: {
@@ -634,6 +638,7 @@
     sdk_member_name: "mynativelib",
     device_supported: false,
     host_supported: true,
+    installable: false,
     sdk_version: "minimum",
     export_include_dirs: ["include/include"],
     arch: {
@@ -735,6 +740,7 @@
     sdk_member_name: "mynativelib",
     device_supported: false,
     host_supported: true,
+    installable: false,
     target: {
         linux_glibc_x86_64: {
             srcs: ["linux_glibc/x86_64/lib/mynativelib.so"],
@@ -814,6 +820,7 @@
 cc_prebuilt_library_static {
     name: "myexports_mynativelib@current",
     sdk_member_name: "mynativelib",
+    installable: false,
     export_include_dirs: ["include/include"],
     arch: {
         arm64: {
@@ -904,6 +911,7 @@
     sdk_member_name: "mynativelib",
     device_supported: false,
     host_supported: true,
+    installable: false,
     export_include_dirs: ["include/include"],
     arch: {
         x86_64: {
@@ -1003,6 +1011,7 @@
     sdk_member_name: "mynativelib",
     device_supported: false,
     host_supported: true,
+    installable: false,
     export_include_dirs: ["include/include"],
     arch: {
         x86_64: {
diff --git a/sdk/update.go b/sdk/update.go
index a43a14b..27a7003 100644
--- a/sdk/update.go
+++ b/sdk/update.go
@@ -409,8 +409,19 @@
 	name string
 }
 
+// A BpPropertyTag to add to a property that contains references to other sdk members.
+//
+// This will cause the references to be rewritten to a versioned reference in the version
+// specific instance of a snapshot module.
 var sdkMemberReferencePropertyTag = propertyTag{"sdkMemberReferencePropertyTag"}
 
+// A BpPropertyTag that indicates the property should only be present in the versioned
+// module.
+//
+// This will cause the property to be removed from the unversioned instance of a
+// snapshot module.
+var sdkVersionedOnlyPropertyTag = propertyTag{"sdkVersionedOnlyPropertyTag"}
+
 type unversionedToVersionedTransformation struct {
 	identityTransformation
 	builder *snapshotBuilder
@@ -452,6 +463,9 @@
 func (t unversionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
 	if tag == sdkMemberReferencePropertyTag {
 		return t.builder.unversionedSdkMemberNames(value.([]string)), tag
+	} else if tag == sdkVersionedOnlyPropertyTag {
+		// The property is not allowed in the unversioned module so remove it.
+		return nil, nil
 	} else {
 		return value, tag
 	}
@@ -631,6 +645,13 @@
 		}
 	}
 
+	// Disable installation in the versioned module of those modules that are ever installable.
+	if installable, ok := variant.(interface{ EverInstallable() bool }); ok {
+		if installable.EverInstallable() {
+			m.AddPropertyWithTag("installable", false, sdkVersionedOnlyPropertyTag)
+		}
+	}
+
 	s.prebuiltModules[name] = m
 	s.prebuiltOrder = append(s.prebuiltOrder, m)
 	return m