Merge "Add support for preopt with uses-libraries" into pi-dev
am: 110d18d73c
Change-Id: Ia861e8d9bb2570ccb10c101e81e83eb372ef41f7
This commit is contained in:
commit
00b42e8c6e
|
@ -77,6 +77,7 @@ LOCAL_DROIDDOC_USE_STANDARD_DOCLET:=
|
||||||
LOCAL_DX_FLAGS:=
|
LOCAL_DX_FLAGS:=
|
||||||
LOCAL_EMMA_COVERAGE_FILTER:=
|
LOCAL_EMMA_COVERAGE_FILTER:=
|
||||||
LOCAL_EMMA_INSTRUMENT:=
|
LOCAL_EMMA_INSTRUMENT:=
|
||||||
|
LOCAL_ENFORCE_USES_LIBRARIES:=
|
||||||
LOCAL_ERROR_PRONE_FLAGS:=
|
LOCAL_ERROR_PRONE_FLAGS:=
|
||||||
LOCAL_EXPORT_CFLAGS:=
|
LOCAL_EXPORT_CFLAGS:=
|
||||||
LOCAL_EXPORT_C_INCLUDE_DEPS:=
|
LOCAL_EXPORT_C_INCLUDE_DEPS:=
|
||||||
|
@ -184,6 +185,7 @@ LOCAL_NO_STATIC_ANALYZER:=
|
||||||
LOCAL_NOTICE_FILE:=
|
LOCAL_NOTICE_FILE:=
|
||||||
LOCAL_ODM_MODULE:=
|
LOCAL_ODM_MODULE:=
|
||||||
LOCAL_OEM_MODULE:=
|
LOCAL_OEM_MODULE:=
|
||||||
|
LOCAL_OPTIONAL_USES_LIBRARIES:=
|
||||||
LOCAL_OVERRIDES_PACKAGES:=
|
LOCAL_OVERRIDES_PACKAGES:=
|
||||||
LOCAL_OVERRIDES_MODULES:=
|
LOCAL_OVERRIDES_MODULES:=
|
||||||
LOCAL_PACKAGE_NAME:=
|
LOCAL_PACKAGE_NAME:=
|
||||||
|
@ -276,6 +278,7 @@ LOCAL_USE_AAPT2:=$(USE_AAPT2)
|
||||||
LOCAL_USE_CLANG_LLD:=
|
LOCAL_USE_CLANG_LLD:=
|
||||||
LOCAL_USE_R8:=
|
LOCAL_USE_R8:=
|
||||||
LOCAL_USE_VNDK:=
|
LOCAL_USE_VNDK:=
|
||||||
|
LOCAL_USES_LIBRARIES:=
|
||||||
LOCAL_VENDOR_MODULE:=
|
LOCAL_VENDOR_MODULE:=
|
||||||
LOCAL_VINTF_FRAGMENTS:=
|
LOCAL_VINTF_FRAGMENTS:=
|
||||||
LOCAL_VTSC_FLAGS:=
|
LOCAL_VTSC_FLAGS:=
|
||||||
|
|
|
@ -1060,6 +1060,10 @@ INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST := $(TARGET_OUT_COMMON_INTERMEDIATES)
|
||||||
INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/hiddenapi-dark-greylist.txt
|
INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/hiddenapi-dark-greylist.txt
|
||||||
INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/hiddenapi-blacklist.txt
|
INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/hiddenapi-blacklist.txt
|
||||||
|
|
||||||
|
# Missing optional uses-libraries so that the platform doesn't create build rules that depend on
|
||||||
|
# them. See setup_one_odex.mk.
|
||||||
|
INTERNAL_PLATFORM_MISSING_USES_LIBRARIES := com.google.android.ble com.google.android.wearable
|
||||||
|
|
||||||
# This is the standard way to name a directory containing prebuilt target
|
# This is the standard way to name a directory containing prebuilt target
|
||||||
# objects. E.g., prebuilt/$(TARGET_PREBUILT_TAG)/libc.so
|
# objects. E.g., prebuilt/$(TARGET_PREBUILT_TAG)/libc.so
|
||||||
TARGET_PREBUILT_TAG := android-$(TARGET_ARCH)
|
TARGET_PREBUILT_TAG := android-$(TARGET_ARCH)
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# 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
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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}]"
|
|
@ -163,12 +163,26 @@ my_2nd_arch_prefix :=
|
||||||
|
|
||||||
# $(1): the input .jar or .apk file
|
# $(1): the input .jar or .apk file
|
||||||
# $(2): the output .odex file
|
# $(2): the output .odex file
|
||||||
|
# In the case where LOCAL_ENFORCE_USES_LIBRARIES is true, PRIVATE_DEX2OAT_CLASS_LOADER_CONTEXT
|
||||||
|
# contains the normalized path list of the libraries. This makes it easier to conditionally prepend
|
||||||
|
# org.apache.http.legacy.boot based on the SDK level if required.
|
||||||
define dex2oat-one-file
|
define dex2oat-one-file
|
||||||
$(hide) rm -f $(2)
|
$(hide) rm -f $(2)
|
||||||
$(hide) mkdir -p $(dir $(2))
|
$(hide) mkdir -p $(dir $(2))
|
||||||
$(hide) ANDROID_LOG_TAGS="*:e" $(DEX2OAT) \
|
stored_class_loader_context_libs=$(PRIVATE_DEX2OAT_STORED_CLASS_LOADER_CONTEXT_LIBS) && \
|
||||||
|
class_loader_context_arg=--class-loader-context=$(PRIVATE_DEX2OAT_CLASS_LOADER_CONTEXT) && \
|
||||||
|
class_loader_context=$(PRIVATE_DEX2OAT_CLASS_LOADER_CONTEXT) && \
|
||||||
|
stored_class_loader_context_arg="" && \
|
||||||
|
uses_library_names="$(PRIVATE_USES_LIBRARY_NAMES)" && \
|
||||||
|
optional_uses_library_names="$(PRIVATE_OPTIONAL_USES_LIBRARY_NAMES)" && \
|
||||||
|
$(if $(PRIVATE_ENFORCE_USES_LIBRARIES), \
|
||||||
|
source build/make/core/verify_uses_libraries.sh "$(1)" && \
|
||||||
|
source build/make/core/construct_context.sh "$(PRIVATE_CONDITIONAL_USES_LIBRARIES_HOST)" "$(PRIVATE_CONDITIONAL_USES_LIBRARIES_TARGET)" && \
|
||||||
|
,) \
|
||||||
|
ANDROID_LOG_TAGS="*:e" $(DEX2OAT) \
|
||||||
--runtime-arg -Xms$(DEX2OAT_XMS) --runtime-arg -Xmx$(DEX2OAT_XMX) \
|
--runtime-arg -Xms$(DEX2OAT_XMS) --runtime-arg -Xmx$(DEX2OAT_XMX) \
|
||||||
--class-loader-context=$(PRIVATE_DEX2OAT_CLASS_LOADER_CONTEXT) \
|
$${class_loader_context_arg} \
|
||||||
|
$${stored_class_loader_context_arg} \
|
||||||
--boot-image=$(PRIVATE_DEX_PREOPT_IMAGE_LOCATION) \
|
--boot-image=$(PRIVATE_DEX_PREOPT_IMAGE_LOCATION) \
|
||||||
--dex-file=$(1) \
|
--dex-file=$(1) \
|
||||||
--dex-location=$(PRIVATE_DEX_LOCATION) \
|
--dex-location=$(PRIVATE_DEX_LOCATION) \
|
||||||
|
|
|
@ -25,17 +25,89 @@ else
|
||||||
my_dex_preopt_image_location := $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION)
|
my_dex_preopt_image_location := $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION)
|
||||||
endif
|
endif
|
||||||
my_dex_preopt_image_filename := $(call get-image-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(my_dex_preopt_image_location))
|
my_dex_preopt_image_filename := $(call get-image-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(my_dex_preopt_image_location))
|
||||||
|
|
||||||
|
# If LOCAL_ENFORCE_USES_LIBRARIES is not set, default to true if either of LOCAL_USES_LIBRARIES or
|
||||||
|
# LOCAL_OPTIONAL_USES_LIBRARIES are specified.
|
||||||
|
ifeq (,$(LOCAL_ENFORCE_USES_LIBRARIES))
|
||||||
|
# Will change the default to true unconditionally in the future.
|
||||||
|
ifneq (,$(LOCAL_OPTIONAL_USES_LIBRARIES))
|
||||||
|
LOCAL_ENFORCE_USES_LIBRARIES := true
|
||||||
|
endif
|
||||||
|
ifneq (,$(LOCAL_USES_LIBRARIES))
|
||||||
|
LOCAL_ENFORCE_USES_LIBRARIES := true
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
my_uses_libraries := $(LOCAL_USES_LIBRARIES)
|
||||||
|
my_optional_uses_libraries := $(LOCAL_OPTIONAL_USES_LIBRARIES)
|
||||||
|
my_missing_uses_libraries := $(INTERNAL_PLATFORM_MISSING_USES_LIBRARIES)
|
||||||
|
|
||||||
|
# If we have either optional or required uses-libraries, set up the class loader context
|
||||||
|
# accordingly.
|
||||||
|
my_lib_names :=
|
||||||
|
my_optional_lib_names :=
|
||||||
|
my_filtered_optional_uses_libraries :=
|
||||||
|
my_system_dependencies :=
|
||||||
|
my_stored_preopt_class_loader_context_libs :=
|
||||||
|
my_conditional_uses_libraries_host :=
|
||||||
|
my_conditional_uses_libraries_target :=
|
||||||
|
|
||||||
|
ifneq (true,$(LOCAL_ENFORCE_USES_LIBRARIES))
|
||||||
|
# Pass special class loader context to skip the classpath and collision check.
|
||||||
|
# This will get removed once LOCAL_USES_LIBRARIES is enforced.
|
||||||
|
# Right now LOCAL_USES_LIBRARIES is opt in, for the case where it's not specified we still default
|
||||||
|
# to the &.
|
||||||
|
my_dex_preopt_class_loader_context := \&
|
||||||
|
else
|
||||||
|
# Compute the filtered optional uses libraries by removing ones that are not supposed to exist.
|
||||||
|
my_filtered_optional_uses_libraries := \
|
||||||
|
$(filter-out $(my_missing_uses_libraries), $(my_optional_uses_libraries))
|
||||||
|
my_filtered_uses_libraries := $(my_uses_libraries) $(my_filtered_optional_uses_libraries)
|
||||||
|
|
||||||
|
# These are the ones we are verifying in the make rule, use the unfiltered libraries.
|
||||||
|
my_lib_names := $(my_uses_libraries)
|
||||||
|
my_optional_lib_names := $(my_optional_uses_libraries)
|
||||||
|
|
||||||
|
# Calculate system build dependencies based on the filtered libraries.
|
||||||
|
my_intermediate_libs := $(foreach lib_name, $(my_lib_names) $(my_filtered_optional_uses_libraries), \
|
||||||
|
$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib_name),,COMMON)/javalib.jar)
|
||||||
|
my_dex_preopt_system_dependencies := $(my_intermediate_libs)
|
||||||
|
my_dex_preopt_class_loader_context := $(call normalize-path-list,$(my_intermediate_libs))
|
||||||
|
|
||||||
|
# The class loader context checksums are filled in by dex2oat.
|
||||||
|
my_stored_preopt_class_loader_context_libs := $(call normalize-path-list, \
|
||||||
|
$(foreach lib_name,$(my_filtered_uses_libraries),/system/framework/$(lib_name).jar))
|
||||||
|
|
||||||
|
# Fix up org.apache.http.legacy.boot since it should be org.apache.http.legacy in the manifest.
|
||||||
|
my_lib_names := $(patsubst org.apache.http.legacy.boot,org.apache.http.legacy,$(my_lib_names))
|
||||||
|
my_optional_lib_names := $(patsubst org.apache.http.legacy.boot,org.apache.http.legacy,$(my_optional_lib_names))
|
||||||
|
ifeq (,$(filter org.apache.http.legacy,$(my_lib_names) $(my_optional_lib_names)))
|
||||||
|
my_conditional_uses_libraries_host := $(call intermediates-dir-for,JAVA_LIBRARIES,org.apache.http.legacy.boot,,COMMON)/javalib.jar
|
||||||
|
my_conditional_uses_libraries_target := /system/framework/org.apache.http.legacy.boot.jar
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Always depend on org.apache.http.legacy.boot since it may get used by dex2oat-one-file for apps
|
||||||
|
# targetting <SDK 28(P).
|
||||||
|
my_always_depend_libraries := $(call intermediates-dir-for,JAVA_LIBRARIES,org.apache.http.legacy.boot,,COMMON)/javalib.jar
|
||||||
|
|
||||||
|
$(my_built_odex): $(AAPT)
|
||||||
|
$(my_built_odex): $(my_always_depend_libraries)
|
||||||
|
$(my_built_odex): $(my_dex_preopt_system_dependencies)
|
||||||
|
$(my_built_odex): PRIVATE_ENFORCE_USES_LIBRARIES := $(LOCAL_ENFORCE_USES_LIBRARIES)
|
||||||
|
$(my_built_odex): PRIVATE_CONDITIONAL_USES_LIBRARIES_HOST := $(my_conditional_uses_libraries_host)
|
||||||
|
$(my_built_odex): PRIVATE_CONDITIONAL_USES_LIBRARIES_TARGET := $(my_conditional_uses_libraries_target)
|
||||||
|
$(my_built_odex): PRIVATE_USES_LIBRARY_NAMES := $(my_lib_names)
|
||||||
|
$(my_built_odex): PRIVATE_OPTIONAL_USES_LIBRARY_NAMES := $(my_optional_lib_names)
|
||||||
$(my_built_odex): PRIVATE_2ND_ARCH_VAR_PREFIX := $(my_2nd_arch_prefix)
|
$(my_built_odex): PRIVATE_2ND_ARCH_VAR_PREFIX := $(my_2nd_arch_prefix)
|
||||||
$(my_built_odex): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE))
|
$(my_built_odex): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE))
|
||||||
$(my_built_odex): PRIVATE_DEX_PREOPT_IMAGE_LOCATION := $(my_dex_preopt_image_location)
|
$(my_built_odex): PRIVATE_DEX_PREOPT_IMAGE_LOCATION := $(my_dex_preopt_image_location)
|
||||||
|
$(my_built_odex): PRIVATE_DEX2OAT_CLASS_LOADER_CONTEXT := $(my_dex_preopt_class_loader_context)
|
||||||
|
$(my_built_odex): PRIVATE_DEX2OAT_STORED_CLASS_LOADER_CONTEXT_LIBS := $(my_stored_preopt_class_loader_context_libs)
|
||||||
$(my_built_odex) : $($(my_2nd_arch_prefix)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \
|
$(my_built_odex) : $($(my_2nd_arch_prefix)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \
|
||||||
$(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \
|
$(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \
|
||||||
$(my_dex_preopt_image_filename)
|
$(my_dex_preopt_image_filename)
|
||||||
|
|
||||||
# Pass special class loader context to skip the classpath and collision check.
|
|
||||||
# Should modify build system to pass used libraries properly later.
|
|
||||||
$(my_built_odex): PRIVATE_DEX2OAT_CLASS_LOADER_CONTEXT := \&
|
|
||||||
|
|
||||||
my_installed_odex := $(call get-odex-installed-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE))
|
my_installed_odex := $(call get-odex-installed-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE))
|
||||||
|
|
||||||
my_built_vdex := $(patsubst %.odex,%.vdex,$(my_built_odex))
|
my_built_vdex := $(patsubst %.odex,%.vdex,$(my_built_odex))
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
# Parse sdk, targetSdk, and uses librares in the APK, then cross reference against build specified ones.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
local_apk=$1
|
||||||
|
badging=$(aapt dump badging "${local_apk}")
|
||||||
|
export sdk_version=$(echo "${badging}" | grep "sdkVersion" | sed -n "s/sdkVersion:'\(.*\)'/\1/p")
|
||||||
|
# Export target_sdk_version to the caller.
|
||||||
|
export target_sdk_version=$(echo "${badging}" | grep "targetSdkVersion" | sed -n "s/targetSdkVersion:'\(.*\)'/\1/p")
|
||||||
|
uses_libraries=$(echo "${badging}" | grep "uses-library" | sed -n "s/uses-library:'\(.*\)'/\1/p")
|
||||||
|
optional_uses_libraries=$(echo "${badging}" | grep "uses-library-not-required" | sed -n "s/uses-library-not-required:'\(.*\)'/\1/p")
|
||||||
|
|
||||||
|
# Verify that the uses libraries match exactly.
|
||||||
|
# Currently we validate the ordering of the libraries since it matters for resolution.
|
||||||
|
single_line_libs=$(echo "${uses_libraries}" | tr '\n' ' ' | awk '{$1=$1}1')
|
||||||
|
if [[ "${single_line_libs}" != "${uses_library_names}" ]]; then
|
||||||
|
echo "LOCAL_USES_LIBRARIES (${uses_library_names})" \
|
||||||
|
"do not match (${single_line_libs}) in manifest for ${local_apk}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify that the optional uses libraries match exactly.
|
||||||
|
single_line_optional_libs=$(echo "${optional_uses_libraries}" | tr '\n' ' ' | awk '{$1=$1}1')
|
||||||
|
if [[ "${single_line_optional_libs}" != "${optional_uses_library_names}" ]]; then
|
||||||
|
echo "LOCAL_OPTIONAL_USES_LIBRARIES (${optional_uses_library_names}) " \
|
||||||
|
"do not match (${single_line_optional_libs}) in manifest for ${local_apk}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in New Issue