#!/usr/bin/env bash # Copyright (C) 2016 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. ### ### Change the BOOTCLASSPATH to pick up bootlib classes. ### Export ANDROID_DATA=something else (it should have dalvik-cache dir in it) ### Point the image to something else that's not existing. ### ### Actually run dalvikvm now... ### if [[ -z $ANDROID_BUILD_TOP ]]; then echo "Run source build/envsetup.sh first" >& 2 exit 1 fi invoke_with= DALVIKVM=dalvikvm LIBART=libart.so function follow_links() { if [ z"$BASH_SOURCE" != z ]; then file="$BASH_SOURCE" else file="$0" fi while [ -h "$file" ]; do # On Mac OS, readlink -f doesn't work. file="$(readlink "$file")" done echo "$file" } function find_libdir() { # Use realpath instead of readlink because Android does not have a readlink. if [ "$(realpath "$ANDROID_ROOT/bin/$DALVIKVM")" = "$(realpath "$ANDROID_ROOT/bin/dalvikvm64")" ]; then echo "lib64" else echo "lib" fi } function join { local IFS="$1"; shift; echo "$*"; } PROG_NAME="$(follow_links)" PROG_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)" if [[ -z $ANDROID_ROOT ]]; then # Already set to /system for actual android devices ANDROID_ROOT="$ANDROID_HOST_OUT" fi LIBDIR="$(find_libdir)" LD_LIBRARY_PATH="$ANDROID_ROOT/$LIBDIR" DEBUG_OPTION="" DELETE_ANDROID_DATA=false # If ANDROID_DATA is the system ANDROID_DATA or is not set, use our own, # and ensure we delete it at the end. if [ "$ANDROID_DATA" = "/data" ] || [ "$ANDROID_DATA" = "" ]; then # TODO: use /data/tmp/... for android, and mktemp for host #ANDROID_DATA=$PWD/android-data$$ ANDROID_DATA="$(mktemp -q -d -t "$(basename "$0").XXXXXX")" IMAGE_DIRECTORY="$ANDROID_DATA/image" mkdir -p $ANDROID_DATA/dalvik-cache/{arm,arm64,x86,x86_64} mkdir -p $IMAGE_DIRECTORY DELETE_ANDROID_DATA=true fi # Clean up the temporary files we made earlier on. function finish { if $DELETE_ANDROID_DATA; then [[ -d $ANDROID_DATA ]] && rm -rf "$ANDROID_DATA" fi } trap finish EXIT # Dummy image location name. Art ignores the bootclasspath setting if a boot image # already exists, so we force it to create a new boot image with our correct bootclasspath. IMAGE_LOCATION="$IMAGE_DIRECTORY/core-extrabootclasspath.art" # TODO: Get this list from somewhere else, a makefile perhaps? BOOT_DEXJARS=( bouncycastle-hostdex.jar apache-xml-hostdex.jar core-tests-hostdex.jar core-libart-hostdex.jar conscrypt-hostdex.jar core-ojtests-hostdex.jar # This is the *one* addition that makes our OJ tests actually run. The rest of these are standard jars on the bootclasspath. core-oj-hostdex.jar okhttp-hostdex.jar) BOOT_DEXJAR_PREFIX="$ANDROID_ROOT/framework" BOOT_DEXJARS_ABS=() for dexjar in ${BOOT_DEXJARS[@]}; do BOOT_DEXJARS_ABS=(${BOOT_DEXJARS_ABS[@]} $BOOT_DEXJAR_PREFIX/$dexjar) done export BOOTCLASSPATH=$(join ":" "${BOOT_DEXJARS_ABS[@]}") # a,b,c echo "BOOTCLASSPATH=$BOOTCLASSPATH" echo "PROG_NAME=$PROG_NAME" echo "PROG_DIR=$PROG_DIR" echo "ANDROID_ROOT=$ANDROID_ROOT" echo "LIBDIR=$LIBDIR" echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" echo "DEBUG_OPTION=$DEBUG_OPTION" echo "export BOOTCLASSPATH=$BOOTCLASSPATH" echo export ANDROID_ROOT="$ANDROID_ROOT" ANDROID_DATA=$ANDROID_DATA \ ANDROID_ROOT=$ANDROID_ROOT \ LD_LIBRARY_PATH=$LD_LIBRARY_PATH \ PATH=$ANDROID_ROOT/bin:$PATH \ LD_USE_LOAD_BIAS=1 \ $invoke_with $ANDROID_ROOT/bin/$DALVIKVM $lib \ -XXlib:$LIBART \ -Xnorelocate \ -Ximage:$IMAGE_LOCATION \ $DEBUG_OPTION \ "$@"