blob: c4424ff704aa85514d67e0007ced2679acaf4272 [file] [log] [blame]
#! /bin/sh
# Copyright (C) 2020 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.
# This script is used on host and device. It uses a common subset
# shell dialect that should work on the host (e.g. bash), and
# Android (e.g. mksh). Try to switch to bash if the shebang above
# has launched a pessimal shell on host.
if [ -z "$KSH_VERSION" -a -z "$BASH_VERSION" -a -n "$(which bash)" ]; then
exec bash -c ". $0" -- "$@"
fi
# The purpose of this script is to invoke dex2oat with the right
# boot classpath and bootclasspath locations.
# Follow all sym links to get the program name.
if [[ -n "$BASH_SOURCE" ]]; then
PROG_NAME="$BASH_SOURCE"
else
PROG_NAME="$0"
fi
while [ -h "$PROG_NAME" ]; do
# On Mac OS, readlink -f doesn't work.
PROG_NAME="$(readlink "$PROG_NAME")"
done
PROG_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
ANDROID_ROOT="$(cd $PROG_DIR/..; pwd -P)"
declare -a args=("$@")
arg_idx=0
while true; do
if [[ $1 == "-Xbootclasspath:*" ]]; then
DEX2OAT_BCP=$1
# Remove '-Xbootclasspath:' from the arguments.
DEX2OAT_BCP=${DEX2OAT_BCP##-Xbootclasspath:}
unset args[arg_idx]
shift
elif [[ $1 == "-Xbootclasspath-locations:*" ]]; then
DEX2OAT_BCP_LOCS=$1
# Remove '-Xbootclasspath-locations:' from the argument.
DEX2OAT_BCP_LOCS=${DEX2OAT_BCP_LOCS##-Xbootclasspath-locations:}
unset args[arg_idx]
shift
elif [[ $1 == "--32" ]]; then
BITNESS=32
LD_LIBRARY_PATH=$ANDROID_ROOT/lib:$LD_LIBRARY_PATH
unset args[arg_idx]
shift
elif [[ $1 == "--64" ]]; then
BITNESS=64
LD_LIBRARY_PATH=$ANDROID_ROOT/lib64:$LD_LIBRARY_PATH
unset args[arg_idx]
shift
elif [[ "$1" == "" ]]; then
break
else
shift
fi
arg_idx=$((arg_idx + 1))
done
if [ -z "$BITNESS" ]; then
echo "Either --32 or --64 is required as argument to specify bitness"
exit 1
fi
# Create boot class path filename or location list.
# It takes one optional argument which is the prefix to be inserted before each entry.
function get_boot_class_path() {
# Note: This must start with the CORE_IMG_JARS in Android.common_path.mk
local modules="core-oj core-libart okhttp bouncycastle apache-xml core-icu4j conscrypt"
local prefix="$1"
local result=""
local separator=""
for module in ${modules}; do
case "$module" in
(conscrypt) local apex="com.android.conscrypt";;
(core-icu4j) local apex="com.android.i18n";;
(*) local apex="com.android.art";;
esac
result+="${separator}${prefix}/apex/${apex}/javalib/${module}.jar"
separator=":"
done
echo "$result"
}
# Create default boot class path if none was provided.
if [[ "$DEX2OAT_BCP" = "" ]]; then
ANDROID_ROOT_MINUS_PWD="${ANDROID_ROOT#$PWD/}" # For example: out/host/linux-x86
if [[ "$ANDROID_ROOT_MINUS_PWD" == */host/* ]]; then
DEX2OAT_BCP="$(get_boot_class_path $ANDROID_ROOT)"
DEX2OAT_BCP_LOCS="$(get_boot_class_path $ANDROID_ROOT_MINUS_PWD)"
elif [[ "$ANDROID_ROOT_MINUS_PWD" == */target/* ]]; then
DEX2OAT_BCP="$(get_boot_class_path $ANDROID_ROOT)"
DEX2OAT_BCP_LOCS="$(get_boot_class_path)"
else
echo "Can not determine whether are running on host or target"
exit 1
fi
fi
# If the dex2oat binary with the bitness as a suffix doesn't exist,
# try with a dex2oat without suffix.
DEX2OAT_SUFFIX=$BITNESS
if [[ ! -f $ANDROID_ROOT/bin/dex2oat${DEX2OAT_SUFFIX} ]]; then
DEX2OAT_SUFFIX=""
fi
LD_LIBRARY_PATH=$LD_LIBRARY_PATH \
$ANDROID_ROOT/bin/dex2oat${DEX2OAT_SUFFIX} \
--android-root=$ANDROID_ROOT \
--runtime-arg -Xbootclasspath:$DEX2OAT_BCP \
--runtime-arg -Xbootclasspath-locations:$DEX2OAT_BCP_LOCS \
${args[@]}