From c04f3126f4fcb87e1465d447ba7457e51552a96e Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Tue, 18 Dec 2018 14:14:25 +0000 Subject: [PATCH] Fix build time preopt with shared library uses. - Handle hidl libraries. - Handle new shared library encoding. Test: no mismatch preopt during boot. bug: 117845483 bug: 111174995 Change-Id: Ie4bca653594c72df2eb2fdd827bc73cfcb76b1d7 --- core/construct_context.sh | 65 ++++++++++++++++++++------------- core/dex_preopt_odex_install.mk | 4 +- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/core/construct_context.sh b/core/construct_context.sh index b4ae51994..399c15d62 100755 --- a/core/construct_context.sh +++ b/core/construct_context.sh @@ -16,39 +16,54 @@ set -e -# inputs: -# $1 is PRIVATE_CONDITIONAL_USES_LIBRARIES_HOST -# $2 is PRIVATE_CONDITIONAL_USES_LIBRARIES_TARGET - -# class_loader_context: library paths on the host -# stored_class_loader_context_libs: library paths on device -# these are both comma separated paths, example: lib1.jar:lib2.jar or /system/framework/lib1.jar:/system/framework/lib2.jar - # target_sdk_version: parsed from manifest -# my_conditional_host_libs: libraries conditionally added for non P -# my_conditional_target_libs: target libraries conditionally added for non P # # outputs # class_loader_context_arg: final class loader conext arg # stored_class_loader_context_arg: final stored class loader context arg -my_conditional_host_libs=$1 -my_conditional_target_libs=$2 +# The hidl.manager shared library has a dependency on hidl.base. We'll manually +# add that information to the class loader context if we see those libraries. +hidl_manager="android.hidl.manager-V1.0-java" +hidl_base="android.hidl.base-V1.0-java" + +function add_to_contexts { + for i in $1; do + if [[ -z "${class_loader_context}" ]]; then + export class_loader_context="PCL[$i]" + else + export class_loader_context+="#PCL[$i]" + fi + if [[ $i == *"$hidl_manager"* ]]; then + export class_loader_context+="{PCL[${i/$hidl_manager/$hidl_base}]}" + fi + done + + for i in $2; do + if [[ -z "${stored_class_loader_context}" ]]; then + export stored_class_loader_context="PCL[$i]" + else + export stored_class_loader_context+="#PCL[$i]" + fi + if [[ $i == *"$hidl_manager"* ]]; then + export stored_class_loader_context+="{PCL[${i/$hidl_manager/$hidl_base}]}" + fi + done +} + +# The order below must match what the package manager also computes for +# class loader context. -# Note that SDK 28 is P. if [[ "${target_sdk_version}" -lt "28" ]]; then - if [[ -z "${class_loader_context}" ]]; then - export class_loader_context="${my_conditional_host_libs}" - else - export class_loader_context="${my_conditional_host_libs}:${class_loader_context}" - fi - if [[ -z "${stored_class_loader_context_libs}" ]]; then - export stored_class_loader_context_libs="${my_conditional_target_libs}"; - else - export stored_class_loader_context_libs="${my_conditional_target_libs}:${stored_class_loader_context_libs}"; - fi + add_to_contexts "${conditional_host_libs_28}" "${conditional_target_libs_28}" fi +if [[ "${target_sdk_version}" -lt "29" ]]; then + add_to_contexts "${conditional_host_libs_29}" "${conditional_target_libs_29}" +fi + +add_to_contexts "${dex_preopt_host_libraries}" "${dex_preopt_target_libraries}" + # Generate the actual context string. -export class_loader_context_arg="--class-loader-context=PCL[${class_loader_context}]" -export stored_class_loader_context_arg="--stored-class-loader-context=PCL[${stored_class_loader_context_libs}]" +export class_loader_context_arg="--class-loader-context=PCL[]{${class_loader_context}}" +export stored_class_loader_context_arg="--stored-class-loader-context=PCL[]{${stored_class_loader_context}}" diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 0d1961910..9f29c689d 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -192,7 +192,7 @@ ifdef LOCAL_DEX_PREOPT $(call add_json_list, OptionalUsesLibraries, $(LOCAL_OPTIONAL_USES_LIBRARIES)) $(call add_json_list, UsesLibraries, $(LOCAL_USES_LIBRARIES)) $(call add_json_map, LibraryPaths) - $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy.impl),\ + $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy.impl android.hidl.base-V1.0-java android.hidl.manager-V1.0-java),\ $(call add_json_str, $(lib), $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar)) $(call end_json_map) $(call add_json_list, Archs, $(my_dexpreopt_archs)) @@ -233,7 +233,7 @@ ifdef LOCAL_DEX_PREOPT my_dexpreopt_deps := $(my_dex_jar) my_dexpreopt_deps += $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE)) my_dexpreopt_deps += \ - $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy.impl),\ + $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy.impl android.hidl.base-V1.0-java android.hidl.manager-V1.0-java),\ $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar) my_dexpreopt_deps += $(LOCAL_DEX_PREOPT_IMAGE_LOCATION) # TODO: default boot images