diff options
author | Colin Cross <ccross@android.com> | 2019-05-22 10:21:09 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2019-05-28 11:18:51 -0700 |
commit | 38b968555c04092302561369d0ed687ad1ccd15e (patch) | |
tree | 53fc8acabdb8c09874933db962ac1ff450829d05 | |
parent | 7211910fd0d158cd2a4e7d610f1e32b8c9d25817 (diff) | |
download | build_soong-38b968555c04092302561369d0ed687ad1ccd15e.tar.gz build_soong-38b968555c04092302561369d0ed687ad1ccd15e.tar.bz2 build_soong-38b968555c04092302561369d0ed687ad1ccd15e.zip |
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
-rw-r--r-- | dexpreopt/config.go | 51 | ||||
-rw-r--r-- | dexpreopt/dexpreopt.go | 41 |
2 files changed, 51 insertions, 41 deletions
diff --git a/dexpreopt/config.go b/dexpreopt/config.go index 1e0f862e..e11e33a1 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -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 - - VerifyUsesLibraries android.Path - ConstructContext android.Path + Profman android.Path + Dex2oat android.Path + Aapt android.Path + SoongZip android.Path + Zip2zip android.Path + ManifestCheck 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 - - VerifyUsesLibraries string - ConstructContext string + Profman string + Dex2oat string + Aapt string + SoongZip string + Zip2zip string + ManifestCheck 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"), }, } } diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go index 5b658d98..2d521dab 100644 --- a/dexpreopt/dexpreopt.go +++ b/dexpreopt/dexpreopt.go @@ -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. |