Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 045e11ad authored by Ulya Trafimovich's avatar Ulya Trafimovich
Browse files

Be more strict about unknown install <uses-library> paths.

Allow default install paths only for compatibility libraries. For other
libraries that are explicitly specified in `uses_libs` and
`optional_uses_libs` unknown install path should be an error.

Bug: 132357300
Test: lunch cf_x86_phone-userdebug && m
Change-Id: I2209c90a939a8aa46c42e13bb42d09c07e4d0895
parent bb3467d2
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -130,14 +130,20 @@ func (libPaths LibraryPaths) addLibraryPath(ctx android.PathContext, lib string,

// Add a new library path to the map. Ensure that the build path to the library exists.
func (libPaths LibraryPaths) AddLibraryPath(ctx android.PathContext, lib string, hostPath, installPath android.Path) {
	if hostPath != nil {
		// Add a library only if the build path to it is known.
	if hostPath != nil && installPath != nil {
		// Add a library only if the build and install path to it is known.
		libPaths.addLibraryPath(ctx, lib, hostPath, installPath)
	} else if !ctx.Config().AllowMissingDependencies() {
		// Error on libraries with unknown build paths, unless missing dependencies are allowed.
	} else if ctx.Config().AllowMissingDependencies() {
		// If missing dependencies are allowed, the build shouldn't fail when a <uses-library> is
		// not found. However, this is likely to result is disabling dexpreopt, as it won't be
		// possible to construct class loader context without on-host and on-device library paths.
	} else {
		// Error on libraries with unknown paths.
		if hostPath == nil {
			android.ReportPathErrorf(ctx, "unknown build path to <uses-library> '%s'", lib)
		} else {
		// Not adding a library to the map will likely result in disabling dexpreopt.
			android.ReportPathErrorf(ctx, "unknown install path to <uses-library> '%s'", lib)
		}
	}
}

+20 −23
Original line number Diff line number Diff line
@@ -1915,11 +1915,11 @@ func (u *usesLibrary) deps(ctx android.BottomUpMutatorContext, hasFrameworkLibs
		if hasFrameworkLibs {
			// Dexpreopt needs paths to the dex jars of these libraries in order to construct
			// class loader context for dex2oat. Add them as a dependency with a special tag.
			ctx.AddVariationDependencies(nil, usesLibTag,
			ctx.AddVariationDependencies(nil, usesLibCompatTag,
				"org.apache.http.legacy",
				"android.hidl.base-V1.0-java",
				"android.hidl.manager-V1.0-java")
			ctx.AddVariationDependencies(nil, usesLibTag, optionalUsesLibs...)
			ctx.AddVariationDependencies(nil, usesLibCompatTag, optionalUsesLibs...)
		}
	}
}
@@ -1937,31 +1937,28 @@ func (u *usesLibrary) usesLibraryPaths(ctx android.ModuleContext) dexpreopt.Libr
	usesLibPaths := make(dexpreopt.LibraryPaths)

	if !ctx.Config().UnbundledBuild() {
		ctx.VisitDirectDepsWithTag(usesLibTag, func(m android.Module) {
		ctx.VisitDirectDeps(func(m android.Module) {
			tag := ctx.OtherModuleDependencyTag(m)
			if tag == usesLibTag || tag == usesLibCompatTag {
				dep := ctx.OtherModuleName(m)

				if lib, ok := m.(Dependency); ok {
					buildPath := lib.DexJarBuildPath()
				if buildPath == nil {
					ctx.ModuleErrorf("module %q in uses_libs or optional_uses_libs must"+
						" produce a dex jar, does it have installable: true?", dep)
					return
				}

				var devicePath string
					installPath := lib.DexJarInstallPath()
				if installPath == nil {
					devicePath = filepath.Join("/system/framework", dep+".jar")
				} else {
					devicePath = android.InstallPathToOnDevicePath(ctx, installPath.(android.InstallPath))
					if installPath == nil && tag == usesLibCompatTag {
						// assume that compatibility libraries are in /system/framework
						installPath = android.PathForModuleInstall(ctx, "framework", dep+".jar")
					}
					usesLibPaths.AddLibraryPath(ctx, dep, buildPath, installPath)

				usesLibPaths[dep] = &dexpreopt.LibraryPath{buildPath, devicePath}
				} else if ctx.Config().AllowMissingDependencies() {
					ctx.AddMissingDependencies([]string{dep})

				} else {
					ctx.ModuleErrorf("module %q in uses_libs or optional_uses_libs must be "+
						"a java library", dep)
				}
			}
		})
	}

+1 −0
Original line number Diff line number Diff line
@@ -566,6 +566,7 @@ var (
	certificateTag        = dependencyTag{name: "certificate"}
	instrumentationForTag = dependencyTag{name: "instrumentation_for"}
	usesLibTag            = dependencyTag{name: "uses-library"}
	usesLibCompatTag      = dependencyTag{name: "uses-library-compat"}
	extraLintCheckTag     = dependencyTag{name: "extra-lint-check"}
)