Add dependency on implementation <uses-library> for modules that depend on component libraries.
If a dexpreopted Java module depends on a component library (such as stubs), it must be dexpreopted against the implementation library, because that is what it will use at run time. Therefore dexpreopt needs to know about the implementation library. One of the subtests of TestUsesLibraries is removed. This is because the subtest was previosuly split in two variants with the only difference that the first variant had dependency on a stubs library, and the second one had dependency on the implementation. The latter caused dexpreopt to be disabled because Soong couldn't find the implementation (it had only the name, but no access to the module). Now that there is a dependency on the implementation, the problem goes away and the two subtest variants can be merged into one. Add a method for getting the name of the implementation library for the optional SDK library. Currently it is the same as the SDK library name, but it may change in future. Test: lunch aosp_cf_x86_phone-userdebug && m Bug: 132357300 Change-Id: I584df4b6db874c7ae3c478231fc51572a46929b1
This commit is contained in:
parent
1a1b885319
commit
39b437b25f
3 changed files with 23 additions and 21 deletions
|
@ -2757,19 +2757,6 @@ func TestUsesLibraries(t *testing.T) {
|
|||
android_app {
|
||||
name: "app",
|
||||
srcs: ["a.java"],
|
||||
libs: ["qux", "quuz"],
|
||||
static_libs: ["static-runtime-helper"],
|
||||
uses_libs: ["foo"],
|
||||
sdk_version: "current",
|
||||
optional_uses_libs: [
|
||||
"bar",
|
||||
"baz",
|
||||
],
|
||||
}
|
||||
|
||||
android_app {
|
||||
name: "app_with_stub_deps",
|
||||
srcs: ["a.java"],
|
||||
libs: ["qux", "quuz.stubs"],
|
||||
static_libs: ["static-runtime-helper"],
|
||||
uses_libs: ["foo"],
|
||||
|
@ -2800,7 +2787,6 @@ func TestUsesLibraries(t *testing.T) {
|
|||
run(t, ctx, config)
|
||||
|
||||
app := ctx.ModuleForTests("app", "android_common")
|
||||
appWithStubDeps := ctx.ModuleForTests("app_with_stub_deps", "android_common")
|
||||
prebuilt := ctx.ModuleForTests("prebuilt", "android_common")
|
||||
|
||||
// Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
|
||||
|
@ -2831,7 +2817,7 @@ func TestUsesLibraries(t *testing.T) {
|
|||
t.Errorf("wanted %q in %q", w, cmd)
|
||||
}
|
||||
|
||||
// Test that all present libraries are preopted, including implicit SDK dependencies
|
||||
// Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
|
||||
cmd = app.Rule("dexpreopt").RuleParams.Command
|
||||
w := `--target-classpath-for-sdk any` +
|
||||
` /system/framework/foo.jar` +
|
||||
|
@ -2843,11 +2829,6 @@ func TestUsesLibraries(t *testing.T) {
|
|||
t.Errorf("wanted %q in %q", w, cmd)
|
||||
}
|
||||
|
||||
// TODO(skvadrik) fix dexpreopt for stub libraries for which the implementation is present
|
||||
if appWithStubDeps.MaybeRule("dexpreopt").RuleParams.Command != "" {
|
||||
t.Errorf("dexpreopt should be disabled for apps with dependencies on stub libraries")
|
||||
}
|
||||
|
||||
cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
|
||||
if w := `--target-classpath-for-sdk any /system/framework/foo.jar:/system/framework/bar.jar`; !strings.Contains(cmd, w) {
|
||||
t.Errorf("wanted %q in %q", w, cmd)
|
||||
|
|
14
java/java.go
14
java/java.go
|
@ -735,9 +735,21 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) {
|
|||
return ret
|
||||
}
|
||||
|
||||
ctx.AddVariationDependencies(nil, libTag, rewriteSyspropLibs(j.properties.Libs, "libs")...)
|
||||
libDeps := ctx.AddVariationDependencies(nil, libTag, rewriteSyspropLibs(j.properties.Libs, "libs")...)
|
||||
ctx.AddVariationDependencies(nil, staticLibTag, rewriteSyspropLibs(j.properties.Static_libs, "static_libs")...)
|
||||
|
||||
// For library dependencies that are component libraries (like stubs), add the implementation
|
||||
// as a dependency (dexpreopt needs to be against the implementation library, not stubs).
|
||||
for _, dep := range libDeps {
|
||||
if dep != nil {
|
||||
if component, ok := dep.(SdkLibraryComponentDependency); ok {
|
||||
if lib := component.OptionalSdkLibraryImplementation(); lib != nil {
|
||||
ctx.AddVariationDependencies(nil, usesLibTag, *lib)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), pluginTag, j.properties.Plugins...)
|
||||
ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), exportedPluginTag, j.properties.Exported_plugins...)
|
||||
|
||||
|
|
|
@ -852,6 +852,12 @@ func (e *EmbeddableSdkLibraryComponent) OptionalImplicitSdkLibrary() *string {
|
|||
return e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack
|
||||
}
|
||||
|
||||
// to satisfy SdkLibraryComponentDependency
|
||||
func (e *EmbeddableSdkLibraryComponent) OptionalSdkLibraryImplementation() *string {
|
||||
// Currently implementation library name is the same as the SDK library name.
|
||||
return e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack
|
||||
}
|
||||
|
||||
// Implemented by modules that are (or possibly could be) a component of a java_sdk_library
|
||||
// (including the java_sdk_library) itself.
|
||||
type SdkLibraryComponentDependency interface {
|
||||
|
@ -862,6 +868,9 @@ type SdkLibraryComponentDependency interface {
|
|||
//
|
||||
// Returns the name of the optional implicit SDK library or nil, if there isn't one.
|
||||
OptionalImplicitSdkLibrary() *string
|
||||
|
||||
// The name of the implementation library for the optional SDK library or nil, if there isn't one.
|
||||
OptionalSdkLibraryImplementation() *string
|
||||
}
|
||||
|
||||
// Make sure that all the module types that are components of java_sdk_library/_import
|
||||
|
|
Loading…
Reference in a new issue