Support hidden API processing for modules that use platform APIs
Previously, hidden API processing could only be done by those bootclasspath_fragment modules that either did not depend on any other fragments (e.g. art-bootclasspath-fragment) or only depended on APIs provided by other fragments (e.g. i18n-bootclasspath-fragment). That meant that modules like com.android.os.statsd-bootclasspath-fragment that depended on APIs provided by parts of the platform which are not yet part of another bootclasspath_fragment could not perform hidden API processing. This change adds support for a bootclasspath_fragment to specify the additional stubs needed to perform hidden API processing. It adds a new additional_stubs property that can be used to specify the additional stub libraries. Most bootclasspath_fragments that need to use the property will need access to the APIs provided by the android-non-updatable.* libraries. Rather than have each fragment explicitly specify the correct module for each scope it treats "android-non-updatable" as if it was a java_sdk_library that can provide different jars for each scope. Soong will handle mapping that to the correct android-non-updatable.* module. Bug: 179354495 Test: m out/soong/hiddenapi/hiddenapi-flags.csv \ out/soong/hiddenapi/hiddenapi-index.csv \ out/soong/hiddenapi/hiddenapi-stub-flags.txt \ out/soong/hiddenapi/hiddenapi-unsupported.csv - make sure that this change does not change the contents. m TARGET_BUILD_APPS=Calendar nothing Change-Id: Ia8b79830ed0e6d42100de03d76b0c51b7f6c8ade
This commit is contained in:
@@ -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
|
||||
@@ -868,4 +869,330 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
|
||||
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.
|
||||
|
Reference in New Issue
Block a user