Loading android/sdk.go +2 −0 Original line number Diff line number Diff line Loading @@ -359,6 +359,8 @@ type SdkMemberTypeDependencyTag interface { // SdkMemberType returns the SdkMemberType that will be used to automatically add the child module // to the sdk. // // Returning nil will prevent the module being added to the sdk. SdkMemberType(child Module) SdkMemberType // ExportMember determines whether a module added to the sdk through this tag will be exported Loading apex/bootclasspath_fragment_test.go +487 −10 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import ( "android/soong/android" "android/soong/java" "github.com/google/blueprint/proptools" ) // Contains tests for bootclasspath_fragment logic from java/bootclasspath_fragment.go as the ART Loading Loading @@ -216,9 +217,9 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { `, ) checkSdkKindStubs := func(message string, info java.HiddenAPIInfo, kind android.SdkKind, expectedPaths ...string) { checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) { t.Helper() android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, kind), expectedPaths, info.TransitiveStubDexJarsByKind[kind]) android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, info.TransitiveStubDexJarsByScope[apiScope]) } // Check stub dex paths exported by art. Loading @@ -229,10 +230,10 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { bazSystemStubs := "out/soong/.intermediates/baz.stubs.system/android_common/dex/baz.stubs.system.jar" bazTestStubs := "out/soong/.intermediates/baz.stubs.test/android_common/dex/baz.stubs.test.jar" checkSdkKindStubs("art", artInfo, android.SdkPublic, bazPublicStubs) checkSdkKindStubs("art", artInfo, android.SdkSystem, bazSystemStubs) checkSdkKindStubs("art", artInfo, android.SdkTest, bazTestStubs) checkSdkKindStubs("art", artInfo, android.SdkCorePlatform) checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs) checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs) checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs) checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope) // Check stub dex paths exported by other. otherFragment := result.Module("other-bootclasspath-fragment", "android_common") Loading @@ -241,10 +242,10 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { fooPublicStubs := "out/soong/.intermediates/foo.stubs/android_common/dex/foo.stubs.jar" fooSystemStubs := "out/soong/.intermediates/foo.stubs.system/android_common/dex/foo.stubs.system.jar" checkSdkKindStubs("other", otherInfo, android.SdkPublic, bazPublicStubs, fooPublicStubs) checkSdkKindStubs("other", otherInfo, android.SdkSystem, bazSystemStubs, fooSystemStubs) checkSdkKindStubs("other", otherInfo, android.SdkTest, bazTestStubs, fooSystemStubs) checkSdkKindStubs("other", otherInfo, android.SdkCorePlatform) checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs) checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs) checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs) checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope) } func checkBootclasspathFragment(t *testing.T, result *android.TestResult, moduleName, variantName string, expectedConfiguredModules string, expectedBootclasspathFragmentFiles string) { Loading Loading @@ -718,4 +719,480 @@ func TestBootclasspathFragmentContentsNoName(t *testing.T) { checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar") } func getDexJarPath(result *android.TestResult, name string) string { module := result.Module(name, "android_common") return module.(java.UsesLibraryDependency).DexJarBuildPath().RelativeToTop().String() } // TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are // passed to the hiddenapi list tool. func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, prepareForTestWithArtApex, prepareForTestWithMyapex, // Configure bootclasspath jars to ensure that hidden API encoding is performed on them. java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"), java.FixtureConfigureUpdatableBootJars("myapex:foo", "myapex:bar"), // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding // is disabled. android.FixtureAddTextFile("frameworks/base/Android.bp", ""), java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithLastReleaseApis("foo", "quuz"), ).RunTestWithBp(t, ` apex { name: "com.android.art", key: "com.android.art.key", bootclasspath_fragments: ["art-bootclasspath-fragment"], updatable: false, } apex_key { name: "com.android.art.key", public_key: "com.android.art.avbpubkey", private_key: "com.android.art.pem", } java_library { name: "baz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } java_sdk_library { name: "quuz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, public: {enabled: true}, system: {enabled: true}, test: {enabled: true}, module_lib: {enabled: true}, } bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above. contents: ["baz", "quuz"], apex_available: [ "com.android.art", ], } apex { name: "myapex", key: "myapex.key", bootclasspath_fragments: [ "mybootclasspathfragment", ], updatable: false, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } java_sdk_library { name: "foo", srcs: ["b.java"], shared_library: false, public: {enabled: true}, apex_available: [ "myapex", ], } java_library { name: "bar", srcs: ["b.java"], installable: true, apex_available: [ "myapex", ], } bootclasspath_fragment { name: "mybootclasspathfragment", contents: [ "foo", "bar", ], apex_available: [ "myapex", ], fragments: [ { apex: "com.android.art", module: "art-bootclasspath-fragment", }, ], } `) java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{ "art-bootclasspath-fragment", "bar", "dex2oatd", "foo", }) fooStubs := getDexJarPath(result, "foo.stubs") quuzPublicStubs := getDexJarPath(result, "quuz.stubs") quuzSystemStubs := getDexJarPath(result, "quuz.stubs.system") quuzTestStubs := getDexJarPath(result, "quuz.stubs.test") quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.module_lib") // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags. fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list") // Make sure that the quuz stubs are available for resolving references from the implementation // boot dex jars provided by this module. android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs) // Make sure that the quuz stubs are available for resolving references from the different API // stubs provided by this module. android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs) android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs) android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs) } // TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting // additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be // added to the hiddenapi list tool. func TestBootclasspathFragment_AndroidNonUpdatable(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, prepareForTestWithArtApex, prepareForTestWithMyapex, // Configure bootclasspath jars to ensure that hidden API encoding is performed on them. java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "myapex:foo", "myapex:bar"), // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding // is disabled. android.FixtureAddTextFile("frameworks/base/Android.bp", ""), java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithLastReleaseApis("foo", "android-non-updatable"), ).RunTestWithBp(t, ` java_sdk_library { name: "android-non-updatable", srcs: ["b.java"], compile_dex: true, public: { enabled: true, }, system: { enabled: true, }, test: { enabled: true, }, module_lib: { enabled: true, }, } apex { name: "com.android.art", key: "com.android.art.key", bootclasspath_fragments: ["art-bootclasspath-fragment"], java_libs: [ "baz", "quuz", ], updatable: false, } apex_key { name: "com.android.art.key", public_key: "com.android.art.avbpubkey", private_key: "com.android.art.pem", } java_library { name: "baz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } java_library { name: "quuz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above. contents: ["baz", "quuz"], apex_available: [ "com.android.art", ], } apex { name: "myapex", key: "myapex.key", bootclasspath_fragments: [ "mybootclasspathfragment", ], updatable: false, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } java_sdk_library { name: "foo", srcs: ["b.java"], shared_library: false, public: {enabled: true}, apex_available: [ "myapex", ], } java_library { name: "bar", srcs: ["b.java"], installable: true, apex_available: [ "myapex", ], } bootclasspath_fragment { name: "mybootclasspathfragment", contents: [ "foo", "bar", ], apex_available: [ "myapex", ], additional_stubs: ["android-non-updatable"], fragments: [ { apex: "com.android.art", module: "art-bootclasspath-fragment", }, ], } `) java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{ "android-non-updatable.stubs", "android-non-updatable.stubs.module_lib", "android-non-updatable.stubs.system", "android-non-updatable.stubs.test", "art-bootclasspath-fragment", "bar", "dex2oatd", "foo", }) nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs") nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system") nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test") nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib") // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list") // Make sure that the module_lib non-updatable stubs are available for resolving references from // the implementation boot dex jars provided by this module. android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs) // Make sure that the appropriate non-updatable stubs are available for resolving references from // the different API stubs provided by this module. android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs) android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs) android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs) } // TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that // setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable // modules to be added to the hiddenapi list tool. func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, java.PrepareForTestWithJavaDefaultModules, prepareForTestWithArtApex, prepareForTestWithMyapex, // Configure bootclasspath jars to ensure that hidden API encoding is performed on them. java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "myapex:foo", "myapex:bar"), // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding // is disabled. android.FixtureAddTextFile("frameworks/base/Android.bp", ""), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) }), java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithPrebuiltApis(map[string][]string{ "current": {"android-non-updatable"}, "30": {"foo"}, }), ).RunTestWithBp(t, ` apex { name: "com.android.art", key: "com.android.art.key", bootclasspath_fragments: ["art-bootclasspath-fragment"], java_libs: [ "baz", "quuz", ], updatable: false, } apex_key { name: "com.android.art.key", public_key: "com.android.art.avbpubkey", private_key: "com.android.art.pem", } java_library { name: "baz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } java_library { name: "quuz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above. contents: ["baz", "quuz"], apex_available: [ "com.android.art", ], } apex { name: "myapex", key: "myapex.key", bootclasspath_fragments: [ "mybootclasspathfragment", ], updatable: false, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } java_sdk_library { name: "foo", srcs: ["b.java"], shared_library: false, public: {enabled: true}, apex_available: [ "myapex", ], } java_library { name: "bar", srcs: ["b.java"], installable: true, apex_available: [ "myapex", ], } bootclasspath_fragment { name: "mybootclasspathfragment", contents: [ "foo", "bar", ], apex_available: [ "myapex", ], additional_stubs: ["android-non-updatable"], fragments: [ { apex: "com.android.art", module: "art-bootclasspath-fragment", }, ], } `) java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{ "art-bootclasspath-fragment", "bar", "dex2oatd", "foo", "prebuilt_sdk_module-lib_current_android-non-updatable", "prebuilt_sdk_public_current_android-non-updatable", "prebuilt_sdk_system_current_android-non-updatable", "prebuilt_sdk_test_current_android-non-updatable", }) nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable") nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable") nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable") nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable") // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list") // Make sure that the module_lib non-updatable stubs are available for resolving references from // the implementation boot dex jars provided by this module. android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs) // Make sure that the appropriate non-updatable stubs are available for resolving references from // the different API stubs provided by this module. android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs) android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs) android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs) } // TODO(b/177892522) - add test for host apex. java/bootclasspath.go +6 −6 Original line number Diff line number Diff line Loading @@ -225,13 +225,13 @@ type BootclasspathAPIProperties struct { Core_platform_api BootclasspathNestedAPIProperties } // sdkKindToStubLibs calculates the stub library modules for each relevant android.SdkKind from the // apiScopeToStubLibs calculates the stub library modules for each relevant *HiddenAPIScope from the // Stub_libs properties. func (p BootclasspathAPIProperties) sdkKindToStubLibs() map[android.SdkKind][]string { m := map[android.SdkKind][]string{} for _, kind := range []android.SdkKind{android.SdkPublic, android.SdkSystem, android.SdkTest} { m[kind] = p.Api.Stub_libs func (p BootclasspathAPIProperties) apiScopeToStubLibs() map[*HiddenAPIScope][]string { m := map[*HiddenAPIScope][]string{} for _, apiScope := range hiddenAPISdkLibrarySupportedScopes { m[apiScope] = p.Api.Stub_libs } m[android.SdkCorePlatform] = p.Core_platform_api.Stub_libs m[CorePlatformHiddenAPIScope] = p.Core_platform_api.Stub_libs return m } java/bootclasspath_fragment.go +23 −4 Original line number Diff line number Diff line Loading @@ -121,8 +121,18 @@ type bootclasspathFragmentProperties struct { BootclasspathFragmentCoverageAffectedProperties Coverage BootclasspathFragmentCoverageAffectedProperties // Hidden API related properties. Hidden_api HiddenAPIFlagFileProperties // The list of additional stub libraries which this fragment's contents use but which are not // provided by another bootclasspath_fragment. // // Note, "android-non-updatable" is treated specially. While no such module exists it is treated // as if it was a java_sdk_library. So, when public API stubs are needed then it will be replaced // with "android-non-updatable.stubs", with "androidn-non-updatable.system.stubs" when the system // stubs are needed and so on. Additional_stubs []string // Properties that allow a fragment to depend on other fragments. This is needed for hidden API // processing as it needs access to all the classes used by a fragment including those provided // by other fragments. Loading Loading @@ -375,7 +385,16 @@ func (b *BootclasspathFragmentModule) ComponentDepsMutator(ctx android.BottomUpM func (b *BootclasspathFragmentModule) DepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies onto all the modules that provide the API stubs for classes on this // bootclasspath fragment. hiddenAPIAddStubLibDependencies(ctx, b.properties.sdkKindToStubLibs()) hiddenAPIAddStubLibDependencies(ctx, b.properties.apiScopeToStubLibs()) for _, additionalStubModule := range b.properties.Additional_stubs { for _, apiScope := range hiddenAPISdkLibrarySupportedScopes { // Add a dependency onto a possibly scope specific stub library. scopeSpecificDependency := apiScope.scopeSpecificStubModule(ctx, additionalStubModule) tag := hiddenAPIStubsDependencyTag{apiScope: apiScope, fromAdditionalDependency: true} ctx.AddVariationDependencies(nil, tag, scopeSpecificDependency) } } if SkipDexpreoptBootJars(ctx) { return Loading Loading @@ -588,7 +607,7 @@ func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android. // Other bootclasspath_fragments that depend on this need the transitive set of stub dex jars // from this to resolve any references from their code to classes provided by this fragment // and the fragments this depends upon. TransitiveStubDexJarsByKind: input.transitiveStubDexJarsByKind(), TransitiveStubDexJarsByScope: input.transitiveStubDexJarsByScope(), } // The monolithic hidden API processing also needs access to all the output files produced by Loading Loading @@ -632,8 +651,8 @@ func (b *BootclasspathFragmentModule) createHiddenAPIFlagInput(ctx android.Modul // Populate with flag file paths from the properties. input.extractFlagFilesFromProperties(ctx, &b.properties.Hidden_api) // Store the stub dex jars from this module's fragment dependencies. input.DependencyStubDexJarsByKind = dependencyHiddenApiInfo.TransitiveStubDexJarsByKind // Add the stub dex jars from this module's fragment dependencies. input.DependencyStubDexJarsByScope.append(dependencyHiddenApiInfo.TransitiveStubDexJarsByScope) return input } Loading java/bootclasspath_fragment_test.go +4 −4 Original line number Diff line number Diff line Loading @@ -245,17 +245,17 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs/android_common/dex/myothersdklibrary.stubs.jar" // Check that SdkPublic uses public stubs for all sdk libraries. android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByKind[android.SdkPublic]) android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[PublicHiddenAPIScope]) // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary // as it does not provide system stubs. android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByKind[android.SdkSystem]) android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[SystemHiddenAPIScope]) // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs // and public stubs for myothersdklibrary as it does not provide test stubs either. android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByKind[android.SdkTest]) android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[TestHiddenAPIScope]) // Check that SdkCorePlatform uses public stubs from the mycoreplatform library. corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar" android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByKind[android.SdkCorePlatform]) android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope[CorePlatformHiddenAPIScope]) } Loading
android/sdk.go +2 −0 Original line number Diff line number Diff line Loading @@ -359,6 +359,8 @@ type SdkMemberTypeDependencyTag interface { // SdkMemberType returns the SdkMemberType that will be used to automatically add the child module // to the sdk. // // Returning nil will prevent the module being added to the sdk. SdkMemberType(child Module) SdkMemberType // ExportMember determines whether a module added to the sdk through this tag will be exported Loading
apex/bootclasspath_fragment_test.go +487 −10 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import ( "android/soong/android" "android/soong/java" "github.com/google/blueprint/proptools" ) // Contains tests for bootclasspath_fragment logic from java/bootclasspath_fragment.go as the ART Loading Loading @@ -216,9 +217,9 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { `, ) checkSdkKindStubs := func(message string, info java.HiddenAPIInfo, kind android.SdkKind, expectedPaths ...string) { checkAPIScopeStubs := func(message string, info java.HiddenAPIInfo, apiScope *java.HiddenAPIScope, expectedPaths ...string) { t.Helper() android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, kind), expectedPaths, info.TransitiveStubDexJarsByKind[kind]) android.AssertPathsRelativeToTopEquals(t, fmt.Sprintf("%s %s", message, apiScope), expectedPaths, info.TransitiveStubDexJarsByScope[apiScope]) } // Check stub dex paths exported by art. Loading @@ -229,10 +230,10 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { bazSystemStubs := "out/soong/.intermediates/baz.stubs.system/android_common/dex/baz.stubs.system.jar" bazTestStubs := "out/soong/.intermediates/baz.stubs.test/android_common/dex/baz.stubs.test.jar" checkSdkKindStubs("art", artInfo, android.SdkPublic, bazPublicStubs) checkSdkKindStubs("art", artInfo, android.SdkSystem, bazSystemStubs) checkSdkKindStubs("art", artInfo, android.SdkTest, bazTestStubs) checkSdkKindStubs("art", artInfo, android.SdkCorePlatform) checkAPIScopeStubs("art", artInfo, java.PublicHiddenAPIScope, bazPublicStubs) checkAPIScopeStubs("art", artInfo, java.SystemHiddenAPIScope, bazSystemStubs) checkAPIScopeStubs("art", artInfo, java.TestHiddenAPIScope, bazTestStubs) checkAPIScopeStubs("art", artInfo, java.CorePlatformHiddenAPIScope) // Check stub dex paths exported by other. otherFragment := result.Module("other-bootclasspath-fragment", "android_common") Loading @@ -241,10 +242,10 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { fooPublicStubs := "out/soong/.intermediates/foo.stubs/android_common/dex/foo.stubs.jar" fooSystemStubs := "out/soong/.intermediates/foo.stubs.system/android_common/dex/foo.stubs.system.jar" checkSdkKindStubs("other", otherInfo, android.SdkPublic, bazPublicStubs, fooPublicStubs) checkSdkKindStubs("other", otherInfo, android.SdkSystem, bazSystemStubs, fooSystemStubs) checkSdkKindStubs("other", otherInfo, android.SdkTest, bazTestStubs, fooSystemStubs) checkSdkKindStubs("other", otherInfo, android.SdkCorePlatform) checkAPIScopeStubs("other", otherInfo, java.PublicHiddenAPIScope, bazPublicStubs, fooPublicStubs) checkAPIScopeStubs("other", otherInfo, java.SystemHiddenAPIScope, bazSystemStubs, fooSystemStubs) checkAPIScopeStubs("other", otherInfo, java.TestHiddenAPIScope, bazTestStubs, fooSystemStubs) checkAPIScopeStubs("other", otherInfo, java.CorePlatformHiddenAPIScope) } func checkBootclasspathFragment(t *testing.T, result *android.TestResult, moduleName, variantName string, expectedConfiguredModules string, expectedBootclasspathFragmentFiles string) { Loading Loading @@ -718,4 +719,480 @@ func TestBootclasspathFragmentContentsNoName(t *testing.T) { checkFragmentExportedDexJar("bar", "out/soong/.intermediates/mybootclasspathfragment/android_common_apex10000/hiddenapi-modular/encoded/bar.jar") } func getDexJarPath(result *android.TestResult, name string) string { module := result.Module(name, "android_common") return module.(java.UsesLibraryDependency).DexJarBuildPath().RelativeToTop().String() } // TestBootclasspathFragment_HiddenAPIList checks to make sure that the correct parameters are // passed to the hiddenapi list tool. func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, prepareForTestWithArtApex, prepareForTestWithMyapex, // Configure bootclasspath jars to ensure that hidden API encoding is performed on them. java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz"), java.FixtureConfigureUpdatableBootJars("myapex:foo", "myapex:bar"), // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding // is disabled. android.FixtureAddTextFile("frameworks/base/Android.bp", ""), java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithLastReleaseApis("foo", "quuz"), ).RunTestWithBp(t, ` apex { name: "com.android.art", key: "com.android.art.key", bootclasspath_fragments: ["art-bootclasspath-fragment"], updatable: false, } apex_key { name: "com.android.art.key", public_key: "com.android.art.avbpubkey", private_key: "com.android.art.pem", } java_library { name: "baz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } java_sdk_library { name: "quuz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, public: {enabled: true}, system: {enabled: true}, test: {enabled: true}, module_lib: {enabled: true}, } bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above. contents: ["baz", "quuz"], apex_available: [ "com.android.art", ], } apex { name: "myapex", key: "myapex.key", bootclasspath_fragments: [ "mybootclasspathfragment", ], updatable: false, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } java_sdk_library { name: "foo", srcs: ["b.java"], shared_library: false, public: {enabled: true}, apex_available: [ "myapex", ], } java_library { name: "bar", srcs: ["b.java"], installable: true, apex_available: [ "myapex", ], } bootclasspath_fragment { name: "mybootclasspathfragment", contents: [ "foo", "bar", ], apex_available: [ "myapex", ], fragments: [ { apex: "com.android.art", module: "art-bootclasspath-fragment", }, ], } `) java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{ "art-bootclasspath-fragment", "bar", "dex2oatd", "foo", }) fooStubs := getDexJarPath(result, "foo.stubs") quuzPublicStubs := getDexJarPath(result, "quuz.stubs") quuzSystemStubs := getDexJarPath(result, "quuz.stubs.system") quuzTestStubs := getDexJarPath(result, "quuz.stubs.test") quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.module_lib") // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags. fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list") // Make sure that the quuz stubs are available for resolving references from the implementation // boot dex jars provided by this module. android.AssertStringDoesContain(t, "quuz widest", command, "--dependency-stub-dex="+quuzModuleLibStubs) // Make sure that the quuz stubs are available for resolving references from the different API // stubs provided by this module. android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+quuzPublicStubs+":"+fooStubs) android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+quuzSystemStubs+":"+fooStubs) android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+quuzTestStubs+":"+fooStubs) } // TestBootclasspathFragment_AndroidNonUpdatable checks to make sure that setting // additional_stubs: ["android-non-updatable"] causes the source android-non-updatable modules to be // added to the hiddenapi list tool. func TestBootclasspathFragment_AndroidNonUpdatable(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, prepareForTestWithArtApex, prepareForTestWithMyapex, // Configure bootclasspath jars to ensure that hidden API encoding is performed on them. java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "myapex:foo", "myapex:bar"), // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding // is disabled. android.FixtureAddTextFile("frameworks/base/Android.bp", ""), java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithLastReleaseApis("foo", "android-non-updatable"), ).RunTestWithBp(t, ` java_sdk_library { name: "android-non-updatable", srcs: ["b.java"], compile_dex: true, public: { enabled: true, }, system: { enabled: true, }, test: { enabled: true, }, module_lib: { enabled: true, }, } apex { name: "com.android.art", key: "com.android.art.key", bootclasspath_fragments: ["art-bootclasspath-fragment"], java_libs: [ "baz", "quuz", ], updatable: false, } apex_key { name: "com.android.art.key", public_key: "com.android.art.avbpubkey", private_key: "com.android.art.pem", } java_library { name: "baz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } java_library { name: "quuz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above. contents: ["baz", "quuz"], apex_available: [ "com.android.art", ], } apex { name: "myapex", key: "myapex.key", bootclasspath_fragments: [ "mybootclasspathfragment", ], updatable: false, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } java_sdk_library { name: "foo", srcs: ["b.java"], shared_library: false, public: {enabled: true}, apex_available: [ "myapex", ], } java_library { name: "bar", srcs: ["b.java"], installable: true, apex_available: [ "myapex", ], } bootclasspath_fragment { name: "mybootclasspathfragment", contents: [ "foo", "bar", ], apex_available: [ "myapex", ], additional_stubs: ["android-non-updatable"], fragments: [ { apex: "com.android.art", module: "art-bootclasspath-fragment", }, ], } `) java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{ "android-non-updatable.stubs", "android-non-updatable.stubs.module_lib", "android-non-updatable.stubs.system", "android-non-updatable.stubs.test", "art-bootclasspath-fragment", "bar", "dex2oatd", "foo", }) nonUpdatablePublicStubs := getDexJarPath(result, "android-non-updatable.stubs") nonUpdatableSystemStubs := getDexJarPath(result, "android-non-updatable.stubs.system") nonUpdatableTestStubs := getDexJarPath(result, "android-non-updatable.stubs.test") nonUpdatableModuleLibStubs := getDexJarPath(result, "android-non-updatable.stubs.module_lib") // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list") // Make sure that the module_lib non-updatable stubs are available for resolving references from // the implementation boot dex jars provided by this module. android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs) // Make sure that the appropriate non-updatable stubs are available for resolving references from // the different API stubs provided by this module. android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs) android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs) android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs) } // TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks checks to make sure that // setting additional_stubs: ["android-non-updatable"] causes the prebuilt android-non-updatable // modules to be added to the hiddenapi list tool. func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, java.PrepareForTestWithJavaDefaultModules, prepareForTestWithArtApex, prepareForTestWithMyapex, // Configure bootclasspath jars to ensure that hidden API encoding is performed on them. java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "myapex:foo", "myapex:bar"), // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding // is disabled. android.FixtureAddTextFile("frameworks/base/Android.bp", ""), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) }), java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithPrebuiltApis(map[string][]string{ "current": {"android-non-updatable"}, "30": {"foo"}, }), ).RunTestWithBp(t, ` apex { name: "com.android.art", key: "com.android.art.key", bootclasspath_fragments: ["art-bootclasspath-fragment"], java_libs: [ "baz", "quuz", ], updatable: false, } apex_key { name: "com.android.art.key", public_key: "com.android.art.avbpubkey", private_key: "com.android.art.pem", } java_library { name: "baz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } java_library { name: "quuz", apex_available: [ "com.android.art", ], srcs: ["b.java"], compile_dex: true, } bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", // Must match the "com.android.art:" entries passed to FixtureConfigureBootJars above. contents: ["baz", "quuz"], apex_available: [ "com.android.art", ], } apex { name: "myapex", key: "myapex.key", bootclasspath_fragments: [ "mybootclasspathfragment", ], updatable: false, } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } java_sdk_library { name: "foo", srcs: ["b.java"], shared_library: false, public: {enabled: true}, apex_available: [ "myapex", ], } java_library { name: "bar", srcs: ["b.java"], installable: true, apex_available: [ "myapex", ], } bootclasspath_fragment { name: "mybootclasspathfragment", contents: [ "foo", "bar", ], apex_available: [ "myapex", ], additional_stubs: ["android-non-updatable"], fragments: [ { apex: "com.android.art", module: "art-bootclasspath-fragment", }, ], } `) java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_apex10000", []string{ "art-bootclasspath-fragment", "bar", "dex2oatd", "foo", "prebuilt_sdk_module-lib_current_android-non-updatable", "prebuilt_sdk_public_current_android-non-updatable", "prebuilt_sdk_system_current_android-non-updatable", "prebuilt_sdk_test_current_android-non-updatable", }) nonUpdatablePublicStubs := getDexJarPath(result, "sdk_public_current_android-non-updatable") nonUpdatableSystemStubs := getDexJarPath(result, "sdk_system_current_android-non-updatable") nonUpdatableTestStubs := getDexJarPath(result, "sdk_test_current_android-non-updatable") nonUpdatableModuleLibStubs := getDexJarPath(result, "sdk_module-lib_current_android-non-updatable") // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_apex10000") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command android.AssertStringDoesContain(t, "check correct rule", command, "hiddenapi list") // Make sure that the module_lib non-updatable stubs are available for resolving references from // the implementation boot dex jars provided by this module. android.AssertStringDoesContain(t, "android-non-updatable widest", command, "--dependency-stub-dex="+nonUpdatableModuleLibStubs) // Make sure that the appropriate non-updatable stubs are available for resolving references from // the different API stubs provided by this module. android.AssertStringDoesContain(t, "public", command, "--public-stub-classpath="+nonUpdatablePublicStubs) android.AssertStringDoesContain(t, "system", command, "--system-stub-classpath="+nonUpdatableSystemStubs) android.AssertStringDoesContain(t, "test", command, "--test-stub-classpath="+nonUpdatableTestStubs) } // TODO(b/177892522) - add test for host apex.
java/bootclasspath.go +6 −6 Original line number Diff line number Diff line Loading @@ -225,13 +225,13 @@ type BootclasspathAPIProperties struct { Core_platform_api BootclasspathNestedAPIProperties } // sdkKindToStubLibs calculates the stub library modules for each relevant android.SdkKind from the // apiScopeToStubLibs calculates the stub library modules for each relevant *HiddenAPIScope from the // Stub_libs properties. func (p BootclasspathAPIProperties) sdkKindToStubLibs() map[android.SdkKind][]string { m := map[android.SdkKind][]string{} for _, kind := range []android.SdkKind{android.SdkPublic, android.SdkSystem, android.SdkTest} { m[kind] = p.Api.Stub_libs func (p BootclasspathAPIProperties) apiScopeToStubLibs() map[*HiddenAPIScope][]string { m := map[*HiddenAPIScope][]string{} for _, apiScope := range hiddenAPISdkLibrarySupportedScopes { m[apiScope] = p.Api.Stub_libs } m[android.SdkCorePlatform] = p.Core_platform_api.Stub_libs m[CorePlatformHiddenAPIScope] = p.Core_platform_api.Stub_libs return m }
java/bootclasspath_fragment.go +23 −4 Original line number Diff line number Diff line Loading @@ -121,8 +121,18 @@ type bootclasspathFragmentProperties struct { BootclasspathFragmentCoverageAffectedProperties Coverage BootclasspathFragmentCoverageAffectedProperties // Hidden API related properties. Hidden_api HiddenAPIFlagFileProperties // The list of additional stub libraries which this fragment's contents use but which are not // provided by another bootclasspath_fragment. // // Note, "android-non-updatable" is treated specially. While no such module exists it is treated // as if it was a java_sdk_library. So, when public API stubs are needed then it will be replaced // with "android-non-updatable.stubs", with "androidn-non-updatable.system.stubs" when the system // stubs are needed and so on. Additional_stubs []string // Properties that allow a fragment to depend on other fragments. This is needed for hidden API // processing as it needs access to all the classes used by a fragment including those provided // by other fragments. Loading Loading @@ -375,7 +385,16 @@ func (b *BootclasspathFragmentModule) ComponentDepsMutator(ctx android.BottomUpM func (b *BootclasspathFragmentModule) DepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies onto all the modules that provide the API stubs for classes on this // bootclasspath fragment. hiddenAPIAddStubLibDependencies(ctx, b.properties.sdkKindToStubLibs()) hiddenAPIAddStubLibDependencies(ctx, b.properties.apiScopeToStubLibs()) for _, additionalStubModule := range b.properties.Additional_stubs { for _, apiScope := range hiddenAPISdkLibrarySupportedScopes { // Add a dependency onto a possibly scope specific stub library. scopeSpecificDependency := apiScope.scopeSpecificStubModule(ctx, additionalStubModule) tag := hiddenAPIStubsDependencyTag{apiScope: apiScope, fromAdditionalDependency: true} ctx.AddVariationDependencies(nil, tag, scopeSpecificDependency) } } if SkipDexpreoptBootJars(ctx) { return Loading Loading @@ -588,7 +607,7 @@ func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android. // Other bootclasspath_fragments that depend on this need the transitive set of stub dex jars // from this to resolve any references from their code to classes provided by this fragment // and the fragments this depends upon. TransitiveStubDexJarsByKind: input.transitiveStubDexJarsByKind(), TransitiveStubDexJarsByScope: input.transitiveStubDexJarsByScope(), } // The monolithic hidden API processing also needs access to all the output files produced by Loading Loading @@ -632,8 +651,8 @@ func (b *BootclasspathFragmentModule) createHiddenAPIFlagInput(ctx android.Modul // Populate with flag file paths from the properties. input.extractFlagFilesFromProperties(ctx, &b.properties.Hidden_api) // Store the stub dex jars from this module's fragment dependencies. input.DependencyStubDexJarsByKind = dependencyHiddenApiInfo.TransitiveStubDexJarsByKind // Add the stub dex jars from this module's fragment dependencies. input.DependencyStubDexJarsByScope.append(dependencyHiddenApiInfo.TransitiveStubDexJarsByScope) return input } Loading
java/bootclasspath_fragment_test.go +4 −4 Original line number Diff line number Diff line Loading @@ -245,17 +245,17 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs/android_common/dex/myothersdklibrary.stubs.jar" // Check that SdkPublic uses public stubs for all sdk libraries. android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByKind[android.SdkPublic]) android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[PublicHiddenAPIScope]) // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary // as it does not provide system stubs. android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByKind[android.SdkSystem]) android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[SystemHiddenAPIScope]) // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs // and public stubs for myothersdklibrary as it does not provide test stubs either. android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByKind[android.SdkTest]) android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[TestHiddenAPIScope]) // Check that SdkCorePlatform uses public stubs from the mycoreplatform library. corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar" android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByKind[android.SdkCorePlatform]) android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope[CorePlatformHiddenAPIScope]) }