| // Copyright 2019 Google Inc. All rights reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | package sdk | 
 |  | 
 | import ( | 
 | 	"log" | 
 | 	"os" | 
 | 	"runtime" | 
 | 	"testing" | 
 |  | 
 | 	"android/soong/android" | 
 | 	"android/soong/java" | 
 |  | 
 | 	"github.com/google/blueprint/proptools" | 
 | ) | 
 |  | 
 | // Needed in an _test.go file in this package to ensure tests run correctly, particularly in IDE. | 
 | func TestMain(m *testing.M) { | 
 | 	if runtime.GOOS != "linux" { | 
 | 		// b/145598135 - Generating host snapshots for anything other than linux is not supported. | 
 | 		log.Printf("Skipping as sdk snapshot generation is only supported on linux not %s", runtime.GOOS) | 
 | 		os.Exit(0) | 
 | 	} | 
 |  | 
 | 	os.Exit(m.Run()) | 
 | } | 
 |  | 
 | // Ensure that prebuilt modules have the same effective visibility as the source | 
 | // modules. | 
 | func TestSnapshotVisibility(t *testing.T) { | 
 | 	packageBp := ` | 
 | 		package { | 
 | 			default_visibility: ["//other/foo"], | 
 | 		} | 
 |  | 
 | 		sdk { | 
 | 			name: "mysdk", | 
 | 			visibility: [ | 
 | 				"//other/foo", | 
 | 				// This short form will be replaced with //package:__subpackages__ in the | 
 | 				// generated sdk_snapshot. | 
 | 				":__subpackages__", | 
 | 			], | 
 | 			java_header_libs: [ | 
 | 				"myjavalib", | 
 | 				"mypublicjavalib", | 
 | 				"mydefaultedjavalib", | 
 | 				"myprivatejavalib", | 
 | 			], | 
 | 		} | 
 |  | 
 | 		java_library { | 
 | 			name: "myjavalib", | 
 | 			// Uses package default visibility | 
 | 			srcs: ["Test.java"], | 
 | 			system_modules: "none", | 
 | 			sdk_version: "none", | 
 | 		} | 
 |  | 
 | 		java_defaults { | 
 | 			name: "java-defaults", | 
 | 			visibility: ["//other/bar"], | 
 | 		} | 
 |  | 
 | 		java_library { | 
 | 			name: "mypublicjavalib", | 
 | 			defaults: ["java-defaults"], | 
 |       visibility: ["//visibility:public"], | 
 | 			srcs: ["Test.java"], | 
 | 			system_modules: "none", | 
 | 			sdk_version: "none", | 
 | 		} | 
 |  | 
 | 		java_defaults { | 
 | 			name: "myjavadefaults", | 
 | 			visibility: ["//other/bar"], | 
 | 		} | 
 |  | 
 | 		java_library { | 
 | 			name: "mydefaultedjavalib", | 
 | 			defaults: ["myjavadefaults"], | 
 | 			srcs: ["Test.java"], | 
 | 			system_modules: "none", | 
 | 			sdk_version: "none", | 
 | 		} | 
 |  | 
 | 		java_library { | 
 | 			name: "myprivatejavalib", | 
 | 			srcs: ["Test.java"], | 
 | 			visibility: ["//visibility:private"], | 
 | 			system_modules: "none", | 
 | 			sdk_version: "none", | 
 | 		} | 
 | 	` | 
 |  | 
 | 	result := testSdkWithFs(t, ``, | 
 | 		map[string][]byte{ | 
 | 			"package/Test.java":  nil, | 
 | 			"package/Android.bp": []byte(packageBp), | 
 | 		}) | 
 |  | 
 | 	CheckSnapshot(t, result, "mysdk", "package", | 
 | 		checkAndroidBpContents(` | 
 | // This is auto-generated. DO NOT EDIT. | 
 |  | 
 | apex_contributions_defaults { | 
 |     name: "mysdk.contributions", | 
 |     contents: [ | 
 |         "prebuilt_myjavalib", | 
 |         "prebuilt_mypublicjavalib", | 
 |         "prebuilt_mydefaultedjavalib", | 
 |         "prebuilt_myprivatejavalib", | 
 |     ], | 
 | } | 
 |  | 
 | java_import { | 
 |     name: "myjavalib", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     jars: ["java/myjavalib.jar"], | 
 | } | 
 |  | 
 | java_import { | 
 |     name: "mypublicjavalib", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     jars: ["java/mypublicjavalib.jar"], | 
 | } | 
 |  | 
 | java_import { | 
 |     name: "mydefaultedjavalib", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     jars: ["java/mydefaultedjavalib.jar"], | 
 | } | 
 |  | 
 | java_import { | 
 |     name: "myprivatejavalib", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     jars: ["java/myprivatejavalib.jar"], | 
 | } | 
 | `)) | 
 | } | 
 |  | 
 | func TestSdkInstall(t *testing.T) { | 
 | 	sdk := ` | 
 | 		sdk { | 
 | 			name: "mysdk", | 
 | 		} | 
 | 	` | 
 | 	result := testSdkWithFs(t, sdk, nil) | 
 |  | 
 | 	CheckSnapshot(t, result, "mysdk", "", | 
 | 		checkAllOtherCopyRules(` | 
 | .intermediates/mysdk/common_os/mysdk-current.info -> mysdk-current.info | 
 | .intermediates/mysdk/common_os/mysdk-current.zip -> mysdk-current.zip | 
 | `)) | 
 | } | 
 |  | 
 | type EmbeddedPropertiesStruct struct { | 
 | 	S_Embedded_Common    string `android:"arch_variant"` | 
 | 	S_Embedded_Different string `android:"arch_variant"` | 
 | } | 
 |  | 
 | type testPropertiesStruct struct { | 
 | 	name          string | 
 | 	private       string | 
 | 	Public_Ignore string `sdk:"ignore"` | 
 | 	Public_Keep   string `sdk:"keep"` | 
 | 	S_Common      string | 
 | 	S_Different   string `android:"arch_variant"` | 
 | 	A_Common      []string | 
 | 	A_Different   []string `android:"arch_variant"` | 
 | 	F_Common      *bool | 
 | 	F_Different   *bool `android:"arch_variant"` | 
 | 	EmbeddedPropertiesStruct | 
 | } | 
 |  | 
 | func (p *testPropertiesStruct) optimizableProperties() interface{} { | 
 | 	return p | 
 | } | 
 |  | 
 | func (p *testPropertiesStruct) String() string { | 
 | 	return p.name | 
 | } | 
 |  | 
 | var _ propertiesContainer = (*testPropertiesStruct)(nil) | 
 |  | 
 | func TestCommonValueOptimization(t *testing.T) { | 
 | 	common := &testPropertiesStruct{name: "common"} | 
 | 	structs := []propertiesContainer{ | 
 | 		&testPropertiesStruct{ | 
 | 			name:          "struct-0", | 
 | 			private:       "common", | 
 | 			Public_Ignore: "common", | 
 | 			Public_Keep:   "keep", | 
 | 			S_Common:      "common", | 
 | 			S_Different:   "upper", | 
 | 			A_Common:      []string{"first", "second"}, | 
 | 			A_Different:   []string{"alpha", "beta"}, | 
 | 			F_Common:      proptools.BoolPtr(false), | 
 | 			F_Different:   proptools.BoolPtr(false), | 
 | 			EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{ | 
 | 				S_Embedded_Common:    "embedded_common", | 
 | 				S_Embedded_Different: "embedded_upper", | 
 | 			}, | 
 | 		}, | 
 | 		&testPropertiesStruct{ | 
 | 			name:          "struct-1", | 
 | 			private:       "common", | 
 | 			Public_Ignore: "common", | 
 | 			Public_Keep:   "keep", | 
 | 			S_Common:      "common", | 
 | 			S_Different:   "lower", | 
 | 			A_Common:      []string{"first", "second"}, | 
 | 			A_Different:   []string{"alpha", "delta"}, | 
 | 			F_Common:      proptools.BoolPtr(false), | 
 | 			F_Different:   proptools.BoolPtr(true), | 
 | 			EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{ | 
 | 				S_Embedded_Common:    "embedded_common", | 
 | 				S_Embedded_Different: "embedded_lower", | 
 | 			}, | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	extractor := newCommonValueExtractor(common) | 
 |  | 
 | 	err := extractor.extractCommonProperties(common, structs) | 
 | 	android.AssertDeepEquals(t, "unexpected error", nil, err) | 
 |  | 
 | 	android.AssertDeepEquals(t, "common properties not correct", | 
 | 		&testPropertiesStruct{ | 
 | 			name:          "common", | 
 | 			private:       "", | 
 | 			Public_Ignore: "", | 
 | 			Public_Keep:   "keep", | 
 | 			S_Common:      "common", | 
 | 			S_Different:   "", | 
 | 			A_Common:      []string{"first", "second"}, | 
 | 			A_Different:   []string(nil), | 
 | 			F_Common:      proptools.BoolPtr(false), | 
 | 			F_Different:   nil, | 
 | 			EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{ | 
 | 				S_Embedded_Common:    "embedded_common", | 
 | 				S_Embedded_Different: "", | 
 | 			}, | 
 | 		}, | 
 | 		common) | 
 |  | 
 | 	android.AssertDeepEquals(t, "updated properties[0] not correct", | 
 | 		&testPropertiesStruct{ | 
 | 			name:          "struct-0", | 
 | 			private:       "common", | 
 | 			Public_Ignore: "common", | 
 | 			Public_Keep:   "keep", | 
 | 			S_Common:      "", | 
 | 			S_Different:   "upper", | 
 | 			A_Common:      nil, | 
 | 			A_Different:   []string{"alpha", "beta"}, | 
 | 			F_Common:      nil, | 
 | 			F_Different:   proptools.BoolPtr(false), | 
 | 			EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{ | 
 | 				S_Embedded_Common:    "", | 
 | 				S_Embedded_Different: "embedded_upper", | 
 | 			}, | 
 | 		}, | 
 | 		structs[0]) | 
 |  | 
 | 	android.AssertDeepEquals(t, "updated properties[1] not correct", | 
 | 		&testPropertiesStruct{ | 
 | 			name:          "struct-1", | 
 | 			private:       "common", | 
 | 			Public_Ignore: "common", | 
 | 			Public_Keep:   "keep", | 
 | 			S_Common:      "", | 
 | 			S_Different:   "lower", | 
 | 			A_Common:      nil, | 
 | 			A_Different:   []string{"alpha", "delta"}, | 
 | 			F_Common:      nil, | 
 | 			F_Different:   proptools.BoolPtr(true), | 
 | 			EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{ | 
 | 				S_Embedded_Common:    "", | 
 | 				S_Embedded_Different: "embedded_lower", | 
 | 			}, | 
 | 		}, | 
 | 		structs[1]) | 
 | } | 
 |  | 
 | func TestCommonValueOptimization_InvalidArchSpecificVariants(t *testing.T) { | 
 | 	common := &testPropertiesStruct{name: "common"} | 
 | 	structs := []propertiesContainer{ | 
 | 		&testPropertiesStruct{ | 
 | 			name:     "struct-0", | 
 | 			S_Common: "should-be-but-is-not-common0", | 
 | 		}, | 
 | 		&testPropertiesStruct{ | 
 | 			name:     "struct-1", | 
 | 			S_Common: "should-be-but-is-not-common1", | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	extractor := newCommonValueExtractor(common) | 
 |  | 
 | 	err := extractor.extractCommonProperties(common, structs) | 
 | 	android.AssertErrorMessageEquals(t, "unexpected error", `field "S_Common" is not tagged as "arch_variant" but has arch specific properties: | 
 |     "struct-0" has value "should-be-but-is-not-common0" | 
 |     "struct-1" has value "should-be-but-is-not-common1"`, err) | 
 | } | 
 |  | 
 | // Ensure that sdk snapshot related environment variables work correctly. | 
 | func TestSnapshot_EnvConfiguration(t *testing.T) { | 
 | 	bp := ` | 
 | 		sdk { | 
 | 			name: "mysdk", | 
 | 			java_header_libs: ["myjavalib"], | 
 | 		} | 
 |  | 
 | 		java_library { | 
 | 			name: "myjavalib", | 
 | 			srcs: ["Test.java"], | 
 | 			system_modules: "none", | 
 | 			sdk_version: "none", | 
 | 			compile_dex: true, | 
 | 			host_supported: true, | 
 | 		} | 
 | 	` | 
 | 	preparer := android.GroupFixturePreparers( | 
 | 		prepareForSdkTestWithJava, | 
 | 		android.FixtureWithRootAndroidBp(bp), | 
 | 	) | 
 |  | 
 | 	checkZipFile := func(t *testing.T, result *android.TestResult, expected string) { | 
 | 		zipRule := result.ModuleForTests("mysdk", "common_os").Rule("SnapshotZipFiles") | 
 | 		android.AssertStringEquals(t, "snapshot zip file", expected, zipRule.Output.String()) | 
 | 	} | 
 |  | 
 | 	t.Run("no env variables", func(t *testing.T) { | 
 | 		result := preparer.RunTest(t) | 
 |  | 
 | 		checkZipFile(t, result, "out/soong/.intermediates/mysdk/common_os/mysdk-current.zip") | 
 |  | 
 | 		CheckSnapshot(t, result, "mysdk", "", | 
 | 			checkAndroidBpContents(` | 
 | // This is auto-generated. DO NOT EDIT. | 
 |  | 
 | apex_contributions_defaults { | 
 |     name: "mysdk.contributions", | 
 |     contents: ["prebuilt_myjavalib"], | 
 | } | 
 |  | 
 | java_import { | 
 |     name: "myjavalib", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     jars: ["java/myjavalib.jar"], | 
 | } | 
 | 			`), | 
 | 		) | 
 | 	}) | 
 |  | 
 | 	t.Run("SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE=S", func(t *testing.T) { | 
 | 		result := android.GroupFixturePreparers( | 
 | 			prepareForSdkTestWithJava, | 
 | 			java.PrepareForTestWithJavaDefaultModules, | 
 | 			java.PrepareForTestWithJavaSdkLibraryFiles, | 
 | 			java.FixtureWithLastReleaseApis("mysdklibrary"), | 
 | 			android.FixtureWithRootAndroidBp(` | 
 | 			sdk { | 
 | 				name: "mysdk", | 
 | 				bootclasspath_fragments: ["mybootclasspathfragment"], | 
 | 			} | 
 |  | 
 | 			bootclasspath_fragment { | 
 | 				name: "mybootclasspathfragment", | 
 | 				apex_available: ["myapex"], | 
 | 				contents: ["mysdklibrary"], | 
 | 				hidden_api: { | 
 | 					split_packages: ["*"], | 
 | 				}, | 
 | 			} | 
 |  | 
 | 			java_sdk_library { | 
 | 				name: "mysdklibrary", | 
 | 				srcs: ["Test.java"], | 
 | 				compile_dex: true, | 
 | 				sdk_version: "S", | 
 | 				public: {enabled: true}, | 
 | 				permitted_packages: ["mysdklibrary"], | 
 | 			} | 
 | 		`), | 
 | 			android.FixtureMergeEnv(map[string]string{ | 
 | 				"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S", | 
 | 			}), | 
 | 			android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), | 
 | 		).RunTest(t) | 
 |  | 
 | 		CheckSnapshot(t, result, "mysdk", "", | 
 | 			checkAndroidBpContents(` | 
 | // This is auto-generated. DO NOT EDIT. | 
 |  | 
 | apex_contributions_defaults { | 
 |     name: "mysdk.contributions", | 
 |     contents: ["prebuilt_mysdklibrary"], | 
 | } | 
 |  | 
 | prebuilt_bootclasspath_fragment { | 
 |     name: "mybootclasspathfragment", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["myapex"], | 
 |     contents: ["mysdklibrary"], | 
 |     hidden_api: { | 
 |         annotation_flags: "hiddenapi/annotation-flags.csv", | 
 |         metadata: "hiddenapi/metadata.csv", | 
 |         index: "hiddenapi/index.csv", | 
 |         stub_flags: "hiddenapi/stub-flags.csv", | 
 |         all_flags: "hiddenapi/all-flags.csv", | 
 |     }, | 
 | } | 
 |  | 
 | java_sdk_library_import { | 
 |     name: "mysdklibrary", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     shared_library: true, | 
 |     compile_dex: true, | 
 |     permitted_packages: ["mysdklibrary"], | 
 |     public: { | 
 |         jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
 |         stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
 |         current_api: "sdk_library/public/mysdklibrary.txt", | 
 |         removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
 |         sdk_version: "current", | 
 |     }, | 
 | } | 
 | `), | 
 |  | 
 | 			checkAllCopyRules(` | 
 | .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv | 
 | .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv | 
 | .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv | 
 | .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/stub-flags.csv -> hiddenapi/stub-flags.csv | 
 | .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/all-flags.csv -> hiddenapi/all-flags.csv | 
 | .intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar | 
 | .intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt | 
 | .intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt | 
 | `), | 
 | 		) | 
 | 	}) | 
 |  | 
 | 	t.Run("test replacing exportable module", func(t *testing.T) { | 
 | 		result := android.GroupFixturePreparers( | 
 | 			prepareForSdkTestWithJava, | 
 | 			java.PrepareForTestWithJavaDefaultModules, | 
 | 			java.PrepareForTestWithJavaSdkLibraryFiles, | 
 | 			java.FixtureWithLastReleaseApis("mysdklibrary", "anothersdklibrary"), | 
 | 			android.FixtureWithRootAndroidBp(` | 
 | 			sdk { | 
 | 				name: "mysdk", | 
 | 				bootclasspath_fragments: ["mybootclasspathfragment"], | 
 | 			} | 
 |  | 
 | 			bootclasspath_fragment { | 
 | 				name: "mybootclasspathfragment", | 
 | 				apex_available: ["myapex"], | 
 | 				contents: ["mysdklibrary"], | 
 | 				hidden_api: { | 
 | 					split_packages: ["*"], | 
 | 				}, | 
 | 				core_platform_api: { | 
 | 					stub_libs: [ | 
 | 						"anothersdklibrary.stubs.exportable", | 
 | 					], | 
 | 				}, | 
 | 				api: { | 
 | 					stub_libs: [ | 
 | 						"anothersdklibrary", | 
 | 					], | 
 | 				}, | 
 | 			} | 
 |  | 
 | 			java_sdk_library { | 
 | 				name: "mysdklibrary", | 
 | 				srcs: ["Test.java"], | 
 | 				compile_dex: true, | 
 | 				min_sdk_version: "S", | 
 | 				public: {enabled: true}, | 
 | 				permitted_packages: ["mysdklibrary"], | 
 | 			} | 
 |  | 
 | 			java_sdk_library { | 
 | 				name: "anothersdklibrary", | 
 | 				srcs: ["Test.java"], | 
 | 				compile_dex: true, | 
 | 				min_sdk_version: "S", | 
 | 				public: {enabled: true}, | 
 | 				system: {enabled: true}, | 
 | 				module_lib: {enabled: true}, | 
 | 			} | 
 | 		`), | 
 | 			android.FixtureMergeEnv(map[string]string{ | 
 | 				"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S", | 
 | 			}), | 
 | 			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { | 
 | 				variables.Platform_version_active_codenames = []string{"UpsideDownCake", "Tiramisu", "S-V2"} | 
 | 			}), | 
 | 			android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), | 
 | 		).RunTest(t) | 
 |  | 
 | 		CheckSnapshot(t, result, "mysdk", "", | 
 | 			checkAndroidBpContents(` | 
 | // This is auto-generated. DO NOT EDIT. | 
 |  | 
 | prebuilt_bootclasspath_fragment { | 
 |     name: "mybootclasspathfragment", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["myapex"], | 
 |     contents: ["mysdklibrary"], | 
 |     api: { | 
 |         stub_libs: ["anothersdklibrary"], | 
 |     }, | 
 |     core_platform_api: { | 
 |         stub_libs: ["anothersdklibrary.stubs"], | 
 |     }, | 
 |     hidden_api: { | 
 |         annotation_flags: "hiddenapi/annotation-flags.csv", | 
 |         metadata: "hiddenapi/metadata.csv", | 
 |         index: "hiddenapi/index.csv", | 
 |         stub_flags: "hiddenapi/stub-flags.csv", | 
 |         all_flags: "hiddenapi/all-flags.csv", | 
 |     }, | 
 | } | 
 |  | 
 | java_sdk_library_import { | 
 |     name: "mysdklibrary", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     shared_library: true, | 
 |     compile_dex: true, | 
 |     permitted_packages: ["mysdklibrary"], | 
 |     public: { | 
 |         jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
 |         stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
 |         current_api: "sdk_library/public/mysdklibrary.txt", | 
 |         removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
 |         sdk_version: "current", | 
 |     }, | 
 | } | 
 |  | 
 | java_sdk_library_import { | 
 |     name: "anothersdklibrary", | 
 |     prefer: false, | 
 |     visibility: ["//visibility:public"], | 
 |     apex_available: ["//apex_available:platform"], | 
 |     shared_library: true, | 
 |     compile_dex: true, | 
 |     public: { | 
 |         jars: ["sdk_library/public/anothersdklibrary-stubs.jar"], | 
 |         stub_srcs: ["sdk_library/public/anothersdklibrary_stub_sources"], | 
 |         current_api: "sdk_library/public/anothersdklibrary.txt", | 
 |         removed_api: "sdk_library/public/anothersdklibrary-removed.txt", | 
 |         sdk_version: "current", | 
 |     }, | 
 |     system: { | 
 |         jars: ["sdk_library/system/anothersdklibrary-stubs.jar"], | 
 |         stub_srcs: ["sdk_library/system/anothersdklibrary_stub_sources"], | 
 |         current_api: "sdk_library/system/anothersdklibrary.txt", | 
 |         removed_api: "sdk_library/system/anothersdklibrary-removed.txt", | 
 |         sdk_version: "system_current", | 
 |     }, | 
 |     module_lib: { | 
 |         jars: ["sdk_library/module-lib/anothersdklibrary-stubs.jar"], | 
 |         stub_srcs: ["sdk_library/module-lib/anothersdklibrary_stub_sources"], | 
 |         current_api: "sdk_library/module-lib/anothersdklibrary.txt", | 
 |         removed_api: "sdk_library/module-lib/anothersdklibrary-removed.txt", | 
 |         sdk_version: "module_current", | 
 |     }, | 
 | } | 
 | `), | 
 | 		) | 
 | 	}) | 
 |  | 
 | } |