Merge "Fix apex_available"

This commit is contained in:
Jooyung Han 2020-03-10 23:53:41 +00:00 committed by Gerrit Code Review
commit 4c8e3509ee
5 changed files with 76 additions and 38 deletions

View file

@ -214,8 +214,11 @@ func makeApexAvailableWhitelist() map[string][]string {
"bluetooth-protos-lite", "bluetooth-protos-lite",
"bluetooth.mapsapi", "bluetooth.mapsapi",
"com.android.vcard", "com.android.vcard",
"dnsresolver_aidl_interface-V2-java",
"fmtlib", "fmtlib",
"guava", "guava",
"ipmemorystore-aidl-interfaces-V5-java",
"ipmemorystore-aidl-interfaces-java",
"internal_include_headers", "internal_include_headers",
"lib-bt-packets", "lib-bt-packets",
"lib-bt-packets-avrcp", "lib-bt-packets-avrcp",
@ -281,6 +284,12 @@ func makeApexAvailableWhitelist() map[string][]string {
"libutils_headers", "libutils_headers",
"libz", "libz",
"media_plugin_headers", "media_plugin_headers",
"net-utils-services-common",
"netd_aidl_interface-unstable-java",
"netd_event_listener_interface-java",
"netlink-client",
"networkstack-aidl-interfaces-unstable-java",
"networkstack-client",
"sap-api-java-static", "sap-api-java-static",
"services.net", "services.net",
} }
@ -298,6 +307,7 @@ func makeApexAvailableWhitelist() map[string][]string {
"libcrypto", "libcrypto",
"libnativehelper_header_only", "libnativehelper_header_only",
"libssl", "libssl",
"unsupportedappusage",
} }
// //
// Module separator // Module separator
@ -321,6 +331,7 @@ func makeApexAvailableWhitelist() map[string][]string {
"cronet_impl_platform_java", "cronet_impl_platform_java",
"libcronet.80.0.3986.0", "libcronet.80.0.3986.0",
"org.chromium.net.cronet", "org.chromium.net.cronet",
"org.chromium.net.cronet.xml",
"prebuilt_libcronet.80.0.3986.0", "prebuilt_libcronet.80.0.3986.0",
} }
// //
@ -559,6 +570,7 @@ func makeApexAvailableWhitelist() map[string][]string {
"libFLAC-config", "libFLAC-config",
"libFLAC-headers", "libFLAC-headers",
"libFraunhoferAAC", "libFraunhoferAAC",
"libLibGuiProperties",
"libarect", "libarect",
"libasync_safe", "libasync_safe",
"libaudio_system_headers", "libaudio_system_headers",
@ -574,6 +586,7 @@ func makeApexAvailableWhitelist() map[string][]string {
"libbase", "libbase",
"libbase_headers", "libbase_headers",
"libbinder_headers", "libbinder_headers",
"libbinderthreadstateutils",
"libbluetooth-types-header", "libbluetooth-types-header",
"libbufferhub_headers", "libbufferhub_headers",
"libc++", "libc++",
@ -776,6 +789,7 @@ func makeApexAvailableWhitelist() map[string][]string {
"libdexfile_external_headers", "libdexfile_external_headers",
"libdexfile_support", "libdexfile_support",
"libdexfile_support_static", "libdexfile_support_static",
"libdl_static",
"libgtest_prod", "libgtest_prod",
"libjemalloc5", "libjemalloc5",
"liblinker_main", "liblinker_main",
@ -867,6 +881,7 @@ func makeApexAvailableWhitelist() map[string][]string {
m["com.android.wifi"] = []string{ m["com.android.wifi"] = []string{
"PlatformProperties", "PlatformProperties",
"android.hardware.wifi-V1.0-java", "android.hardware.wifi-V1.0-java",
"android.hardware.wifi-V1.0-java-constants",
"android.hardware.wifi-V1.1-java", "android.hardware.wifi-V1.1-java",
"android.hardware.wifi-V1.2-java", "android.hardware.wifi-V1.2-java",
"android.hardware.wifi-V1.3-java", "android.hardware.wifi-V1.3-java",
@ -887,6 +902,8 @@ func makeApexAvailableWhitelist() map[string][]string {
"bouncycastle-unbundled", "bouncycastle-unbundled",
"dnsresolver_aidl_interface-V2-java", "dnsresolver_aidl_interface-V2-java",
"error_prone_annotations", "error_prone_annotations",
"framework-wifi-pre-jarjar",
"framework-wifi-util-lib",
"ipmemorystore-aidl-interfaces-V3-java", "ipmemorystore-aidl-interfaces-V3-java",
"ipmemorystore-aidl-interfaces-java", "ipmemorystore-aidl-interfaces-java",
"ksoap2", "ksoap2",
@ -1023,14 +1040,11 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
var directDep bool var directDep bool
if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex { if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex {
minSdkVersion := a.minSdkVersion(mctx) minSdkVersion := a.minSdkVersion(mctx)
apexBundles = []android.ApexInfo{android.ApexInfo{
apexBundles = []android.ApexInfo{ ApexName: mctx.ModuleName(),
android.ApexInfo{ LegacyAndroid10Support: proptools.Bool(a.properties.Legacy_android10_support),
ApexName: mctx.ModuleName(), MinSdkVersion: minSdkVersion,
LegacyAndroid10Support: proptools.Bool(a.properties.Legacy_android10_support), }}
MinSdkVersion: minSdkVersion,
},
}
directDep = true directDep = true
} else if am, ok := mctx.Module().(android.ApexModule); ok { } else if am, ok := mctx.Module().(android.ApexModule); ok {
apexBundles = am.ApexVariations() apexBundles = am.ApexVariations()
@ -1041,10 +1055,14 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
return return
} }
cur := mctx.Module().(interface {
DepIsInSameApex(android.BaseModuleContext, android.Module) bool
})
mctx.VisitDirectDeps(func(child android.Module) { mctx.VisitDirectDeps(func(child android.Module) {
depName := mctx.OtherModuleName(child) depName := mctx.OtherModuleName(child)
if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() && if am, ok := child.(android.ApexModule); ok && am.CanHaveApexVariants() &&
(directDep || am.DepIsInSameApex(mctx, child)) { cur.DepIsInSameApex(mctx, child) {
android.UpdateApexDependency(apexBundles, depName, directDep) android.UpdateApexDependency(apexBundles, depName, directDep)
am.BuildForApexes(apexBundles) am.BuildForApexes(apexBundles)
} }
@ -1957,7 +1975,7 @@ func (a *apexBundle) walkPayloadDeps(ctx android.ModuleContext,
} }
// Check for the indirect dependencies if it is considered as part of the APEX // Check for the indirect dependencies if it is considered as part of the APEX
if am.DepIsInSameApex(ctx, am) { if am.ApexName() != "" {
do(ctx, parent, am, false /* externalDep */) do(ctx, parent, am, false /* externalDep */)
return true return true
} }
@ -1990,10 +2008,12 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
a.walkPayloadDeps(ctx, func(ctx android.ModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) { a.walkPayloadDeps(ctx, func(ctx android.ModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) {
apexName := ctx.ModuleName() apexName := ctx.ModuleName()
if externalDep || to.AvailableFor(apexName) || whitelistedApexAvailable(apexName, to) { fromName := ctx.OtherModuleName(from)
toName := ctx.OtherModuleName(to)
if externalDep || to.AvailableFor(apexName) || whitelistedApexAvailable(apexName, toName) {
return return
} }
ctx.ModuleErrorf("%q requires %q that is not available for the APEX.", from.Name(), to.Name()) ctx.ModuleErrorf("%q requires %q that is not available for the APEX.", fromName, toName)
}) })
} }
@ -2370,13 +2390,12 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
a.buildApexDependencyInfo(ctx) a.buildApexDependencyInfo(ctx)
} }
func whitelistedApexAvailable(apex string, module android.Module) bool { func whitelistedApexAvailable(apex, moduleName string) bool {
key := apex key := apex
key = strings.Replace(key, "test_", "", 1) key = strings.Replace(key, "test_", "", 1)
key = strings.Replace(key, "com.android.art.debug", "com.android.art", 1) key = strings.Replace(key, "com.android.art.debug", "com.android.art", 1)
key = strings.Replace(key, "com.android.art.release", "com.android.art", 1) key = strings.Replace(key, "com.android.art.release", "com.android.art", 1)
moduleName := module.Name()
// Prebuilt modules (e.g. java_import, etc.) have "prebuilt_" prefix added by the build // Prebuilt modules (e.g. java_import, etc.) have "prebuilt_" prefix added by the build
// system. Trim the prefix for the check since they are confusing // system. Trim the prefix for the check since they are confusing
moduleName = strings.TrimPrefix(moduleName, "prebuilt_") moduleName = strings.TrimPrefix(moduleName, "prebuilt_")

View file

@ -3164,6 +3164,7 @@ func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
stl: "none", stl: "none",
system_shared_libs: [], system_shared_libs: [],
enabled: false, enabled: false,
apex_available: ["myapex"],
} }
`) `)
testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, ` testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
@ -3185,6 +3186,7 @@ func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
sdk_version: "none", sdk_version: "none",
system_modules: "none", system_modules: "none",
enabled: false, enabled: false,
apex_available: ["myapex"],
} }
`) `)
} }
@ -3345,7 +3347,7 @@ func TestApexWithTestHelperApp(t *testing.T) {
func TestApexPropertiesShouldBeDefaultable(t *testing.T) { func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
// libfoo's apex_available comes from cc_defaults // libfoo's apex_available comes from cc_defaults
testApexError(t, `"myapex" .*: "myapex" requires "libfoo" that is not available for the APEX`, ` testApexError(t, `requires "libfoo" that is not available for the APEX`, `
apex { apex {
name: "myapex", name: "myapex",
key: "myapex.key", key: "myapex.key",
@ -3411,8 +3413,8 @@ func TestApexAvailable(t *testing.T) {
apex_available: ["otherapex"], apex_available: ["otherapex"],
}`) }`)
// libbar is an indirect dep // libbbaz is an indirect dep
testApexError(t, "requires \"libbar\" that is not available for the APEX", ` testApexError(t, "requires \"libbaz\" that is not available for the APEX", `
apex { apex {
name: "myapex", name: "myapex",
key: "myapex.key", key: "myapex.key",
@ -3425,31 +3427,26 @@ func TestApexAvailable(t *testing.T) {
private_key: "testkey.pem", private_key: "testkey.pem",
} }
apex {
name: "otherapex",
key: "otherapex.key",
native_shared_libs: ["libfoo"],
}
apex_key {
name: "otherapex.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
}
cc_library { cc_library {
name: "libfoo", name: "libfoo",
stl: "none", stl: "none",
shared_libs: ["libbar"], shared_libs: ["libbar"],
system_shared_libs: [], system_shared_libs: [],
apex_available: ["myapex", "otherapex"], apex_available: ["myapex"],
} }
cc_library { cc_library {
name: "libbar", name: "libbar",
stl: "none", stl: "none",
shared_libs: ["libbaz"],
system_shared_libs: [],
apex_available: ["myapex"],
}
cc_library {
name: "libbaz",
stl: "none",
system_shared_libs: [], system_shared_libs: [],
apex_available: ["otherapex"],
}`) }`)
testApexError(t, "\"otherapex\" is not a valid module name", ` testApexError(t, "\"otherapex\" is not a valid module name", `
@ -3796,6 +3793,7 @@ func TestRejectNonInstallableJavaLibrary(t *testing.T) {
sdk_version: "none", sdk_version: "none",
system_modules: "none", system_modules: "none",
compile_dex: false, compile_dex: false,
apex_available: ["myapex"],
} }
`) `)
} }

View file

@ -1796,11 +1796,16 @@ func (j *Module) hasCode(ctx android.ModuleContext) bool {
} }
func (j *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { func (j *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
depTag := ctx.OtherModuleDependencyTag(dep)
// Dependencies other than the static linkage are all considered crossing APEX boundary // Dependencies other than the static linkage are all considered crossing APEX boundary
if staticLibTag == ctx.OtherModuleDependencyTag(dep) {
return true
}
// Also, a dependency to an sdk member is also considered as such. This is required because // Also, a dependency to an sdk member is also considered as such. This is required because
// sdk members should be mutated into APEXes. Refer to sdk.sdkDepsReplaceMutator. // sdk members should be mutated into APEXes. Refer to sdk.sdkDepsReplaceMutator.
return depTag == staticLibTag || j.IsInAnySdk() if sa, ok := dep.(android.SdkAware); ok && sa.IsInAnySdk() {
return true
}
return false
} }
func (j *Module) Stem() string { func (j *Module) Stem() string {
@ -2504,11 +2509,16 @@ func (j *Import) SrcJarArgs() ([]string, android.Paths) {
} }
func (j *Import) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { func (j *Import) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
depTag := ctx.OtherModuleDependencyTag(dep)
// dependencies other than the static linkage are all considered crossing APEX boundary // dependencies other than the static linkage are all considered crossing APEX boundary
if staticLibTag == ctx.OtherModuleDependencyTag(dep) {
return true
}
// Also, a dependency to an sdk member is also considered as such. This is required because // Also, a dependency to an sdk member is also considered as such. This is required because
// sdk members should be mutated into APEXes. Refer to sdk.sdkDepsReplaceMutator. // sdk members should be mutated into APEXes. Refer to sdk.sdkDepsReplaceMutator.
return depTag == staticLibTag || j.IsInAnySdk() if sa, ok := dep.(android.SdkAware); ok && sa.IsInAnySdk() {
return true
}
return false
} }
// Add compile time check for interface implementation // Add compile time check for interface implementation

View file

@ -581,6 +581,14 @@ func (module *SdkLibrary) createStubsSources(mctx android.LoadHookContext, apiSc
mctx.CreateModule(DroidstubsFactory, &props) mctx.CreateModule(DroidstubsFactory, &props)
} }
func (module *SdkLibrary) DepIsInSameApex(mctx android.BaseModuleContext, dep android.Module) bool {
depTag := mctx.OtherModuleDependencyTag(dep)
if depTag == xmlPermissionsFileTag {
return true
}
return module.Library.DepIsInSameApex(mctx, dep)
}
// Creates the xml file that publicizes the runtime library // Creates the xml file that publicizes the runtime library
func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) { func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) {
props := struct { props := struct {
@ -590,9 +598,11 @@ func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) {
Device_specific *bool Device_specific *bool
Product_specific *bool Product_specific *bool
System_ext_specific *bool System_ext_specific *bool
Apex_available []string
}{ }{
Name: proptools.StringPtr(module.xmlFileName()), Name: proptools.StringPtr(module.xmlFileName()),
Lib_name: proptools.StringPtr(module.BaseModuleName()), Lib_name: proptools.StringPtr(module.BaseModuleName()),
Apex_available: module.ApexProperties.Apex_available,
} }
if module.SocSpecific() { if module.SocSpecific() {

View file

@ -58,6 +58,7 @@ func TestDepNotInRequiredSdks(t *testing.T) {
sdk_version: "none", sdk_version: "none",
compile_dex: true, compile_dex: true,
host_supported: true, host_supported: true,
apex_available: ["myapex"],
} }
// this lib is no in mysdk // this lib is no in mysdk