Move verify_uses_libraries.sh out of dexpreopt
Verifying the <uses-library> tags in the manifest does not need to be part of dexpreopt, move it out to a separate rule. Bug: 132357300 Test: m checkbuild Change-Id: I9d37872953b46f37ae77804819dc4eb8e2da0657
This commit is contained in:
@@ -95,14 +95,14 @@ type GlobalConfig struct {
|
||||
// Tools contains paths to tools possibly used by the generated commands. If you add a new tool here you MUST add it
|
||||
// to the order-only dependency list in DEXPREOPT_GEN_DEPS.
|
||||
type Tools struct {
|
||||
Profman android.Path
|
||||
Dex2oat android.Path
|
||||
Aapt android.Path
|
||||
SoongZip android.Path
|
||||
Zip2zip android.Path
|
||||
Profman android.Path
|
||||
Dex2oat android.Path
|
||||
Aapt android.Path
|
||||
SoongZip android.Path
|
||||
Zip2zip android.Path
|
||||
ManifestCheck android.Path
|
||||
|
||||
VerifyUsesLibraries android.Path
|
||||
ConstructContext android.Path
|
||||
ConstructContext android.Path
|
||||
}
|
||||
|
||||
type ModuleConfig struct {
|
||||
@@ -110,6 +110,7 @@ type ModuleConfig struct {
|
||||
DexLocation string // dex location on device
|
||||
BuildPath android.OutputPath
|
||||
DexPath android.Path
|
||||
ManifestPath android.Path
|
||||
UncompressedDex bool
|
||||
HasApkLibraries bool
|
||||
PreoptFlags []string
|
||||
@@ -187,14 +188,14 @@ func LoadGlobalConfig(ctx android.PathContext, path string) (GlobalConfig, []byt
|
||||
BootImageProfiles []string
|
||||
|
||||
Tools struct {
|
||||
Profman string
|
||||
Dex2oat string
|
||||
Aapt string
|
||||
SoongZip string
|
||||
Zip2zip string
|
||||
Profman string
|
||||
Dex2oat string
|
||||
Aapt string
|
||||
SoongZip string
|
||||
Zip2zip string
|
||||
ManifestCheck string
|
||||
|
||||
VerifyUsesLibraries string
|
||||
ConstructContext string
|
||||
ConstructContext string
|
||||
}
|
||||
}
|
||||
|
||||
@@ -214,7 +215,7 @@ func LoadGlobalConfig(ctx android.PathContext, path string) (GlobalConfig, []byt
|
||||
config.GlobalConfig.Tools.Aapt = constructPath(ctx, config.Tools.Aapt)
|
||||
config.GlobalConfig.Tools.SoongZip = constructPath(ctx, config.Tools.SoongZip)
|
||||
config.GlobalConfig.Tools.Zip2zip = constructPath(ctx, config.Tools.Zip2zip)
|
||||
config.GlobalConfig.Tools.VerifyUsesLibraries = constructPath(ctx, config.Tools.VerifyUsesLibraries)
|
||||
config.GlobalConfig.Tools.ManifestCheck = constructPath(ctx, config.Tools.ManifestCheck)
|
||||
config.GlobalConfig.Tools.ConstructContext = constructPath(ctx, config.Tools.ConstructContext)
|
||||
|
||||
return config.GlobalConfig, data, nil
|
||||
@@ -231,6 +232,7 @@ func LoadModuleConfig(ctx android.PathContext, path string) (ModuleConfig, error
|
||||
// used to construct the real value manually below.
|
||||
BuildPath string
|
||||
DexPath string
|
||||
ManifestPath string
|
||||
ProfileClassListing string
|
||||
LibraryPaths map[string]string
|
||||
DexPreoptImages []string
|
||||
@@ -249,6 +251,7 @@ func LoadModuleConfig(ctx android.PathContext, path string) (ModuleConfig, error
|
||||
// Construct paths that require a PathContext.
|
||||
config.ModuleConfig.BuildPath = constructPath(ctx, config.BuildPath).(android.OutputPath)
|
||||
config.ModuleConfig.DexPath = constructPath(ctx, config.DexPath)
|
||||
config.ModuleConfig.ManifestPath = constructPath(ctx, config.ManifestPath)
|
||||
config.ModuleConfig.ProfileClassListing = android.OptionalPathForPath(constructPath(ctx, config.ProfileClassListing))
|
||||
config.ModuleConfig.LibraryPaths = constructPathMap(ctx, config.LibraryPaths)
|
||||
config.ModuleConfig.DexPreoptImages = constructPaths(ctx, config.DexPreoptImages)
|
||||
@@ -324,13 +327,13 @@ func GlobalConfigForTests(ctx android.PathContext) GlobalConfig {
|
||||
Dex2oatImageXmx: "",
|
||||
Dex2oatImageXms: "",
|
||||
Tools: Tools{
|
||||
Profman: android.PathForTesting("profman"),
|
||||
Dex2oat: android.PathForTesting("dex2oat"),
|
||||
Aapt: android.PathForTesting("aapt"),
|
||||
SoongZip: android.PathForTesting("soong_zip"),
|
||||
Zip2zip: android.PathForTesting("zip2zip"),
|
||||
VerifyUsesLibraries: android.PathForTesting("verify_uses_libraries.sh"),
|
||||
ConstructContext: android.PathForTesting("construct_context.sh"),
|
||||
Profman: android.PathForTesting("profman"),
|
||||
Dex2oat: android.PathForTesting("dex2oat"),
|
||||
Aapt: android.PathForTesting("aapt"),
|
||||
SoongZip: android.PathForTesting("soong_zip"),
|
||||
Zip2zip: android.PathForTesting("zip2zip"),
|
||||
ManifestCheck: android.PathForTesting("manifest_check"),
|
||||
ConstructContext: android.PathForTesting("construct_context.sh"),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@@ -226,10 +226,6 @@ func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module Modul
|
||||
bootImageLocation = PathToLocation(bootImage, arch)
|
||||
}
|
||||
|
||||
// Lists of used and optional libraries from the build config to be verified against the manifest in the APK
|
||||
var verifyUsesLibs []string
|
||||
var verifyOptionalUsesLibs []string
|
||||
|
||||
// Lists of used and optional libraries from the build config, with optional libraries that are known to not
|
||||
// be present in the current product removed.
|
||||
var filteredUsesLibs []string
|
||||
@@ -252,9 +248,6 @@ func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module Modul
|
||||
var classLoaderContextHostString string
|
||||
|
||||
if module.EnforceUsesLibraries {
|
||||
verifyUsesLibs = copyOf(module.UsesLibraries)
|
||||
verifyOptionalUsesLibs = copyOf(module.OptionalUsesLibraries)
|
||||
|
||||
filteredOptionalUsesLibs = filterOut(global.MissingUsesLibraries, module.OptionalUsesLibraries)
|
||||
filteredUsesLibs = append(copyOf(module.UsesLibraries), filteredOptionalUsesLibs...)
|
||||
|
||||
@@ -270,11 +263,11 @@ func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module Modul
|
||||
const httpLegacy = "org.apache.http.legacy"
|
||||
const httpLegacyImpl = "org.apache.http.legacy.impl"
|
||||
|
||||
// Fix up org.apache.http.legacy.impl since it should be org.apache.http.legacy in the manifest.
|
||||
replace(verifyUsesLibs, httpLegacyImpl, httpLegacy)
|
||||
replace(verifyOptionalUsesLibs, httpLegacyImpl, httpLegacy)
|
||||
|
||||
if !contains(verifyUsesLibs, httpLegacy) && !contains(verifyOptionalUsesLibs, httpLegacy) {
|
||||
// org.apache.http.legacy contains classes that were in the default classpath until API 28. If the
|
||||
// targetSdkVersion in the manifest or APK is < 28, and the module does not explicitly depend on
|
||||
// org.apache.http.legacy, then implicitly add the classes to the classpath for dexpreopt. One the
|
||||
// device the classes will be in a file called org.apache.http.legacy.impl.jar.
|
||||
if !contains(module.UsesLibraries, httpLegacy) && !contains(module.OptionalUsesLibraries, httpLegacy) {
|
||||
conditionalClassLoaderContextHost28 = append(conditionalClassLoaderContextHost28,
|
||||
pathForLibrary(module, httpLegacyImpl))
|
||||
conditionalClassLoaderContextTarget28 = append(conditionalClassLoaderContextTarget28,
|
||||
@@ -284,6 +277,9 @@ func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module Modul
|
||||
const hidlBase = "android.hidl.base-V1.0-java"
|
||||
const hidlManager = "android.hidl.manager-V1.0-java"
|
||||
|
||||
// android.hidl.base-V1.0-java and android.hidl.manager-V1.0 contain classes that were in the default
|
||||
// classpath until API 29. If the targetSdkVersion in the manifest or APK is < 29 then implicitly add
|
||||
// the classes to the classpath for dexpreopt.
|
||||
conditionalClassLoaderContextHost29 = append(conditionalClassLoaderContextHost29,
|
||||
pathForLibrary(module, hidlManager))
|
||||
conditionalClassLoaderContextTarget29 = append(conditionalClassLoaderContextTarget29,
|
||||
@@ -309,9 +305,21 @@ func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module Modul
|
||||
rule.Command().Text(`stored_class_loader_context_arg=""`)
|
||||
|
||||
if module.EnforceUsesLibraries {
|
||||
rule.Command().Textf(`uses_library_names="%s"`, strings.Join(verifyUsesLibs, " "))
|
||||
rule.Command().Textf(`optional_uses_library_names="%s"`, strings.Join(verifyOptionalUsesLibs, " "))
|
||||
rule.Command().Textf(`aapt_binary="%s"`, global.Tools.Aapt)
|
||||
if module.ManifestPath != nil {
|
||||
rule.Command().Text(`target_sdk_version="$(`).
|
||||
Tool(global.Tools.ManifestCheck).
|
||||
Flag("--extract-target-sdk-version").
|
||||
Input(module.ManifestPath).
|
||||
Text(`)"`)
|
||||
} else {
|
||||
// No manifest to extract targetSdkVersion from, hope that DexJar is an APK
|
||||
rule.Command().Text(`target_sdk_version="$(`).
|
||||
Tool(global.Tools.Aapt).
|
||||
Flag("dump badging").
|
||||
Input(module.DexPath).
|
||||
Text(`| grep "targetSdkVersion" | sed -n "s/targetSdkVersion:'\(.*\)'/\1/p"`).
|
||||
Text(`)"`)
|
||||
}
|
||||
rule.Command().Textf(`dex_preopt_host_libraries="%s"`,
|
||||
strings.Join(classLoaderContextHost.Strings(), " ")).
|
||||
Implicits(classLoaderContextHost)
|
||||
@@ -327,8 +335,7 @@ func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module Modul
|
||||
Implicits(conditionalClassLoaderContextHost29)
|
||||
rule.Command().Textf(`conditional_target_libs_29="%s"`,
|
||||
strings.Join(conditionalClassLoaderContextTarget29, " "))
|
||||
rule.Command().Text("source").Tool(global.Tools.VerifyUsesLibraries).Input(module.DexPath)
|
||||
rule.Command().Text("source").Tool(global.Tools.ConstructContext)
|
||||
rule.Command().Text("source").Tool(global.Tools.ConstructContext).Input(module.DexPath)
|
||||
}
|
||||
|
||||
// Devices that do not have a product partition use a symlink from /product to /system/product.
|
||||
|
Reference in New Issue
Block a user