diff --git a/dexpreopt/class_loader_context.go b/dexpreopt/class_loader_context.go index b910a70e8..22f712c0e 100644 --- a/dexpreopt/class_loader_context.go +++ b/dexpreopt/class_loader_context.go @@ -71,10 +71,6 @@ type ClassLoaderContext struct { // Nested class loader subcontexts for dependencies. Subcontexts []*ClassLoaderContext - - // If the library is a shared library. This affects which elements of class loader context are - // added as tags by the manifest_fixer (dependencies of shared libraries aren't). - IsSharedLibrary bool } // ClassLoaderContextMap is a map from SDK version to a class loader context. @@ -85,7 +81,7 @@ type ClassLoaderContextMap map[int][]*ClassLoaderContext // Add class loader context for the given library to the map entry for the given SDK version. func (clcMap ClassLoaderContextMap) addContext(ctx android.ModuleInstallPathContext, sdkVer int, lib string, - shared bool, hostPath, installPath android.Path, strict bool, nestedClcMap ClassLoaderContextMap) error { + hostPath, installPath android.Path, strict bool, nestedClcMap ClassLoaderContextMap) error { // If missing dependencies are allowed, the build shouldn't fail when a is // not found. However, this is likely to result is disabling dexpreopt, as it won't be @@ -132,20 +128,19 @@ func (clcMap ClassLoaderContextMap) addContext(ctx android.ModuleInstallPathCont } clcMap[sdkVer] = append(clcMap[sdkVer], &ClassLoaderContext{ - Name: lib, - Host: hostPath, - Device: devicePath, - Subcontexts: subcontexts, - IsSharedLibrary: shared, + Name: lib, + Host: hostPath, + Device: devicePath, + Subcontexts: subcontexts, }) return nil } // Wrapper around addContext that reports errors. func (clcMap ClassLoaderContextMap) addContextOrReportError(ctx android.ModuleInstallPathContext, sdkVer int, lib string, - shared bool, hostPath, installPath android.Path, strict bool, nestedClcMap ClassLoaderContextMap) { + hostPath, installPath android.Path, strict bool, nestedClcMap ClassLoaderContextMap) { - err := clcMap.addContext(ctx, sdkVer, lib, shared, hostPath, installPath, strict, nestedClcMap) + err := clcMap.addContext(ctx, sdkVer, lib, hostPath, installPath, strict, nestedClcMap) if err != nil { ctx.ModuleErrorf(err.Error()) } @@ -153,25 +148,25 @@ func (clcMap ClassLoaderContextMap) addContextOrReportError(ctx android.ModuleIn // Add class loader context. Fail on unknown build/install paths. func (clcMap ClassLoaderContextMap) AddContext(ctx android.ModuleInstallPathContext, lib string, - shared bool, hostPath, installPath android.Path) { + hostPath, installPath android.Path) { - clcMap.addContextOrReportError(ctx, AnySdkVersion, lib, shared, hostPath, installPath, true, nil) + clcMap.addContextOrReportError(ctx, AnySdkVersion, lib, hostPath, installPath, true, nil) } // Add class loader context if the library exists. Don't fail on unknown build/install paths. func (clcMap ClassLoaderContextMap) MaybeAddContext(ctx android.ModuleInstallPathContext, lib *string, - shared bool, hostPath, installPath android.Path) { + hostPath, installPath android.Path) { if lib != nil { - clcMap.addContextOrReportError(ctx, AnySdkVersion, *lib, shared, hostPath, installPath, false, nil) + clcMap.addContextOrReportError(ctx, AnySdkVersion, *lib, hostPath, installPath, false, nil) } } // Add class loader context for the given SDK version. Fail on unknown build/install paths. func (clcMap ClassLoaderContextMap) AddContextForSdk(ctx android.ModuleInstallPathContext, sdkVer int, - lib string, shared bool, hostPath, installPath android.Path, nestedClcMap ClassLoaderContextMap) { + lib string, hostPath, installPath android.Path, nestedClcMap ClassLoaderContextMap) { - clcMap.addContextOrReportError(ctx, sdkVer, lib, shared, hostPath, installPath, true, nestedClcMap) + clcMap.addContextOrReportError(ctx, sdkVer, lib, hostPath, installPath, true, nestedClcMap) } // Merge the other class loader context map into this one, do not override existing entries. @@ -208,26 +203,15 @@ func (clcMap ClassLoaderContextMap) AddContextMap(otherClcMap ClassLoaderContext } } -// List of libraries in the unconditional class loader context, excluding dependencies of shared -// libraries. These libraries should be in the tags in the manifest. Some of them may -// be present in the original manifest, others are added by the manifest_fixer. +// Returns top-level libraries in the CLC (conditional CLC, i.e. compatibility libraries are not +// included). This is the list of libraries that should be in the tags in the +// manifest. Some of them may be present in the source manifest, others are added by manifest_fixer. func (clcMap ClassLoaderContextMap) UsesLibs() (ulibs []string) { if clcMap != nil { - // compatibility libraries (those in conditional context) are not added to tags - ulibs = usesLibsRec(clcMap[AnySdkVersion]) - ulibs = android.FirstUniqueStrings(ulibs) - } - return ulibs -} - -func usesLibsRec(clcs []*ClassLoaderContext) (ulibs []string) { - for _, clc := range clcs { - ulibs = append(ulibs, clc.Name) - // tags in the manifest should not include dependencies of shared libraries, - // because PackageManager already tracks all such dependencies and automatically adds their - // class loader contexts as subcontext of the shared library. - if !clc.IsSharedLibrary { - ulibs = append(ulibs, usesLibsRec(clc.Subcontexts)...) + clcs := clcMap[AnySdkVersion] + ulibs = make([]string, 0, len(clcs)) + for _, clc := range clcs { + ulibs = append(ulibs, clc.Name) } } return ulibs diff --git a/dexpreopt/class_loader_context_test.go b/dexpreopt/class_loader_context_test.go index abfca2759..df6856390 100644 --- a/dexpreopt/class_loader_context_test.go +++ b/dexpreopt/class_loader_context_test.go @@ -25,11 +25,6 @@ import ( "android/soong/android" ) -const ( - shared = true // dependencies are not added to uses libs - nonshared = false // dependencies are added to uses libs -) - func TestCLC(t *testing.T) { // Construct class loader context with the following structure: // . @@ -55,36 +50,36 @@ func TestCLC(t *testing.T) { m := make(ClassLoaderContextMap) - m.AddContext(ctx, "a", nonshared, buildPath(ctx, "a"), installPath(ctx, "a")) - m.AddContext(ctx, "b", shared, buildPath(ctx, "b"), installPath(ctx, "b")) + m.AddContext(ctx, "a", buildPath(ctx, "a"), installPath(ctx, "a")) + m.AddContext(ctx, "b", buildPath(ctx, "b"), installPath(ctx, "b")) // "Maybe" variant in the good case: add as usual. c := "c" - m.MaybeAddContext(ctx, &c, nonshared, buildPath(ctx, "c"), installPath(ctx, "c")) + m.MaybeAddContext(ctx, &c, buildPath(ctx, "c"), installPath(ctx, "c")) // "Maybe" variant in the bad case: don't add library with unknown name, keep going. - m.MaybeAddContext(ctx, nil, nonshared, nil, nil) + m.MaybeAddContext(ctx, nil, nil, nil) // Add some libraries with nested subcontexts. m1 := make(ClassLoaderContextMap) - m1.AddContext(ctx, "a1", nonshared, buildPath(ctx, "a1"), installPath(ctx, "a1")) - m1.AddContext(ctx, "b1", shared, buildPath(ctx, "b1"), installPath(ctx, "b1")) + m1.AddContext(ctx, "a1", buildPath(ctx, "a1"), installPath(ctx, "a1")) + m1.AddContext(ctx, "b1", buildPath(ctx, "b1"), installPath(ctx, "b1")) m2 := make(ClassLoaderContextMap) - m2.AddContext(ctx, "a2", nonshared, buildPath(ctx, "a2"), installPath(ctx, "a2")) - m2.AddContext(ctx, "b2", shared, buildPath(ctx, "b2"), installPath(ctx, "b2")) - m2.AddContextForSdk(ctx, AnySdkVersion, "c2", shared, buildPath(ctx, "c2"), installPath(ctx, "c2"), m1) + m2.AddContext(ctx, "a2", buildPath(ctx, "a2"), installPath(ctx, "a2")) + m2.AddContext(ctx, "b2", buildPath(ctx, "b2"), installPath(ctx, "b2")) + m2.AddContextForSdk(ctx, AnySdkVersion, "c2", buildPath(ctx, "c2"), installPath(ctx, "c2"), m1) m3 := make(ClassLoaderContextMap) - m3.AddContext(ctx, "a3", nonshared, buildPath(ctx, "a3"), installPath(ctx, "a3")) - m3.AddContext(ctx, "b3", shared, buildPath(ctx, "b3"), installPath(ctx, "b3")) + m3.AddContext(ctx, "a3", buildPath(ctx, "a3"), installPath(ctx, "a3")) + m3.AddContext(ctx, "b3", buildPath(ctx, "b3"), installPath(ctx, "b3")) - m.AddContextForSdk(ctx, AnySdkVersion, "d", nonshared, buildPath(ctx, "d"), installPath(ctx, "d"), m2) + m.AddContextForSdk(ctx, AnySdkVersion, "d", buildPath(ctx, "d"), installPath(ctx, "d"), m2) // When the same library is both in conditional and unconditional context, it should be removed // from conditional context. - m.AddContextForSdk(ctx, 42, "f", nonshared, buildPath(ctx, "f"), installPath(ctx, "f"), nil) - m.AddContextForSdk(ctx, AnySdkVersion, "f", nonshared, buildPath(ctx, "f"), installPath(ctx, "f"), nil) + m.AddContextForSdk(ctx, 42, "f", buildPath(ctx, "f"), installPath(ctx, "f"), nil) + m.AddContextForSdk(ctx, AnySdkVersion, "f", buildPath(ctx, "f"), installPath(ctx, "f"), nil) // Merge map with implicit root library that is among toplevel contexts => does nothing. m.AddContextMap(m1, "c") @@ -93,12 +88,12 @@ func TestCLC(t *testing.T) { m.AddContextMap(m3, "m_g") // Compatibility libraries with unknown install paths get default paths. - m.AddContextForSdk(ctx, 29, AndroidHidlManager, nonshared, buildPath(ctx, AndroidHidlManager), nil, nil) - m.AddContextForSdk(ctx, 29, AndroidHidlBase, nonshared, buildPath(ctx, AndroidHidlBase), nil, nil) + m.AddContextForSdk(ctx, 29, AndroidHidlManager, buildPath(ctx, AndroidHidlManager), nil, nil) + m.AddContextForSdk(ctx, 29, AndroidHidlBase, buildPath(ctx, AndroidHidlBase), nil, nil) // Add "android.test.mock" to conditional CLC, observe that is gets removed because it is only // needed as a compatibility library if "android.test.runner" is in CLC as well. - m.AddContextForSdk(ctx, 30, AndroidTestMock, nonshared, buildPath(ctx, AndroidTestMock), nil, nil) + m.AddContextForSdk(ctx, 30, AndroidTestMock, buildPath(ctx, AndroidTestMock), nil, nil) valid, validationError := validateClassLoaderContext(m) @@ -158,7 +153,7 @@ func TestCLC(t *testing.T) { // Test for libraries that are added by the manifest_fixer. t.Run("uses libs", func(t *testing.T) { - wantUsesLibs := []string{"a", "b", "c", "d", "a2", "b2", "c2", "f", "a3", "b3"} + wantUsesLibs := []string{"a", "b", "c", "d", "f", "a3", "b3"} if !reflect.DeepEqual(wantUsesLibs, haveUsesLibs) { t.Errorf("\nwant uses libs: %s\nhave uses libs: %s", wantUsesLibs, haveUsesLibs) } @@ -169,7 +164,7 @@ func TestCLC(t *testing.T) { func TestCLCUnknownBuildPath(t *testing.T) { ctx := testContext() m := make(ClassLoaderContextMap) - err := m.addContext(ctx, AnySdkVersion, "a", nonshared, nil, nil, true, nil) + err := m.addContext(ctx, AnySdkVersion, "a", nil, nil, true, nil) checkError(t, err, "unknown build path to \"a\"") } @@ -177,7 +172,7 @@ func TestCLCUnknownBuildPath(t *testing.T) { func TestCLCUnknownInstallPath(t *testing.T) { ctx := testContext() m := make(ClassLoaderContextMap) - err := m.addContext(ctx, AnySdkVersion, "a", nonshared, buildPath(ctx, "a"), nil, true, nil) + err := m.addContext(ctx, AnySdkVersion, "a", buildPath(ctx, "a"), nil, true, nil) checkError(t, err, "unknown install path to \"a\"") } @@ -186,7 +181,7 @@ func TestCLCMaybeAdd(t *testing.T) { m := make(ClassLoaderContextMap) a := "a" - m.MaybeAddContext(ctx, &a, nonshared, nil, nil) + m.MaybeAddContext(ctx, &a, nil, nil) // The library should be added to tags by the manifest_fixer. t.Run("maybe add", func(t *testing.T) { @@ -208,9 +203,9 @@ func TestCLCMaybeAdd(t *testing.T) { func TestCLCNestedConditional(t *testing.T) { ctx := testContext() m1 := make(ClassLoaderContextMap) - m1.AddContextForSdk(ctx, 42, "a", nonshared, buildPath(ctx, "a"), installPath(ctx, "a"), nil) + m1.AddContextForSdk(ctx, 42, "a", buildPath(ctx, "a"), installPath(ctx, "a"), nil) m := make(ClassLoaderContextMap) - err := m.addContext(ctx, AnySdkVersion, "b", nonshared, buildPath(ctx, "b"), installPath(ctx, "b"), true, m1) + err := m.addContext(ctx, AnySdkVersion, "b", buildPath(ctx, "b"), installPath(ctx, "b"), true, m1) checkError(t, err, "nested class loader context shouldn't have conditional part") } diff --git a/java/aar.go b/java/aar.go index 799e763ac..1940d7f7b 100644 --- a/java/aar.go +++ b/java/aar.go @@ -426,7 +426,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext, classLoaderConte // (including the java_sdk_library) itself then append any implicit sdk library // names to the list of sdk libraries to be added to the manifest. if component, ok := module.(SdkLibraryComponentDependency); ok { - classLoaderContexts.MaybeAddContext(ctx, component.OptionalImplicitSdkLibrary(), true, + classLoaderContexts.MaybeAddContext(ctx, component.OptionalImplicitSdkLibrary(), component.DexJarBuildPath(), component.DexJarInstallPath()) } diff --git a/java/app.go b/java/app.go index 3446739f3..3384bbd39 100755 --- a/java/app.go +++ b/java/app.go @@ -1981,7 +1981,7 @@ func (u *usesLibrary) classLoaderContextForUsesLibDeps(ctx android.ModuleContext if tag, ok := ctx.OtherModuleDependencyTag(m).(usesLibraryDependencyTag); ok { dep := ctx.OtherModuleName(m) if lib, ok := m.(Dependency); ok { - clcMap.AddContextForSdk(ctx, tag.sdkVersion, dep, isSharedSdkLibrary(m), + clcMap.AddContextForSdk(ctx, tag.sdkVersion, dep, lib.DexJarBuildPath(), lib.DexJarInstallPath(), lib.ClassLoaderContexts()) } else if ctx.Config().AllowMissingDependencies() { ctx.AddMissingDependencies([]string{dep}) @@ -1995,11 +1995,6 @@ func (u *usesLibrary) classLoaderContextForUsesLibDeps(ctx android.ModuleContext return clcMap } -func isSharedSdkLibrary(m android.Module) bool { - lib, ok := m.(SdkLibraryDependency) - return ok && lib.IsSharedLibrary() -} - // enforceUsesLibraries returns true of tags should be checked against uses_libs and optional_uses_libs // properties. Defaults to true if either of uses_libs or optional_uses_libs is specified. Will default to true // unconditionally in the future. diff --git a/java/java.go b/java/java.go index 501227911..bf139a80b 100644 --- a/java/java.go +++ b/java/java.go @@ -1051,7 +1051,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { case libTag: deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...) // names of sdk libs that are directly depended are exported - j.classLoaderContexts.MaybeAddContext(ctx, dep.OptionalImplicitSdkLibrary(), true, + j.classLoaderContexts.MaybeAddContext(ctx, dep.OptionalImplicitSdkLibrary(), dep.DexJarBuildPath(), dep.DexJarInstallPath()) case staticLibTag: ctx.ModuleErrorf("dependency on java_sdk_library %q can only be in libs", otherName) @@ -2105,12 +2105,12 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a element for that java_sdk_library is // added to the Android manifest. - j.classLoaderContexts.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(), true, + j.classLoaderContexts.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(), j.DexJarBuildPath(), j.DexJarInstallPath()) // A non-SDK library may provide a (the name may be different from the module name). if lib := proptools.String(j.usesLibraryProperties.Provides_uses_lib); lib != "" { - j.classLoaderContexts.AddContext(ctx, lib, true, j.DexJarBuildPath(), j.DexJarInstallPath()) + j.classLoaderContexts.AddContext(ctx, lib, j.DexJarBuildPath(), j.DexJarInstallPath()) } j.distFiles = j.GenerateTaggedDistFiles(ctx) @@ -2793,8 +2793,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { case libTag: flags.classpath = append(flags.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...) // names of sdk libs that are directly depended are exported - j.classLoaderContexts.AddContext(ctx, otherName, dep.IsSharedLibrary(), - dep.DexJarBuildPath(), dep.DexJarInstallPath()) + j.classLoaderContexts.AddContext(ctx, otherName, dep.DexJarBuildPath(), dep.DexJarInstallPath()) } } }) @@ -2809,7 +2808,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a element for that java_sdk_library is // added to the Android manifest. - j.classLoaderContexts.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(), true, + j.classLoaderContexts.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(), outputFile, installFile) j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs) diff --git a/java/sdk_library.go b/java/sdk_library.go index 603c80854..b83267865 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -688,11 +688,6 @@ func (c *commonToSdkLibraryAndImport) apiModuleName(apiScope *apiScope) string { return c.namingScheme.apiModuleName(apiScope, c.moduleBase.BaseModuleName()) } -// If the SDK library is a shared library. -func (c *commonToSdkLibraryAndImport) IsSharedLibrary() bool { - return c.sharedLibrary() -} - // The component names for different outputs of the java_sdk_library. // // They are similar to the names used for the child modules it creates @@ -938,9 +933,6 @@ type SdkLibraryDependency interface { // jars for the stubs. The latter should only be needed when generating JavaDoc as otherwise // they are identical to the corresponding header jars. SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths - - // If the SDK library is a shared library. - IsSharedLibrary() bool } type SdkLibrary struct {