1#!/bin/bash 2# 3# Runner for an individual run-test. 4 5if [[ -z "$ANDROID_BUILD_TOP" ]]; then 6 echo 'ANDROID_BUILD_TOP environment variable is empty; did you forget to run `lunch`?' 7 exit 1 8fi 9 10msg() { 11 if [ "$QUIET" = "n" ]; then 12 echo "$@" 13 fi 14} 15 16ANDROID_ROOT="/system" 17ANDROID_ART_ROOT="/apex/com.android.art" 18ANDROID_I18N_ROOT="/apex/com.android.i18n" 19ANDROID_TZDATA_ROOT="/apex/com.android.tzdata" 20ARCHITECTURES_32="(arm|x86|none)" 21ARCHITECTURES_64="(arm64|x86_64|none)" 22ARCHITECTURES_PATTERN="${ARCHITECTURES_32}" 23GET_DEVICE_ISA_BITNESS_FLAG="--32" 24BOOT_IMAGE="" 25CHROOT= 26COMPILE_FLAGS="" 27DALVIKVM="dalvikvm32" 28DEBUGGER="n" 29WITH_AGENT=() 30DEBUGGER_AGENT="" 31WRAP_DEBUGGER_AGENT="n" 32DEV_MODE="n" 33DEX2OAT_NDEBUG_BINARY="dex2oat32" 34DEX2OAT_DEBUG_BINARY="dex2oatd32" 35EXPERIMENTAL="" 36FALSE_BIN="false" 37FLAGS="" 38ANDROID_FLAGS="" 39GDB="" 40GDB_ARGS="" 41GDBSERVER_DEVICE="gdbserver" 42GDBSERVER_HOST="gdbserver" 43HAVE_IMAGE="y" 44HOST="n" 45BIONIC="n" 46CREATE_ANDROID_ROOT="n" 47USE_ZIPAPEX="n" 48ZIPAPEX_LOC="" 49USE_EXTRACTED_ZIPAPEX="n" 50EXTRACTED_ZIPAPEX_LOC="" 51INTERPRETER="n" 52JIT="n" 53INVOKE_WITH="" 54IS_JVMTI_TEST="n" 55ADD_LIBDIR_ARGUMENTS="n" 56ISA=x86 57LIBRARY_DIRECTORY="lib" 58TEST_DIRECTORY="nativetest" 59MAIN="" 60OPTIMIZE="y" 61PREBUILD="y" 62QUIET="n" 63RELOCATE="n" 64STRIP_DEX="n" 65SECONDARY_DEX="" 66TIME_OUT="n" # "n" (disabled), "timeout" (use timeout), "gdb" (use gdb) 67TIMEOUT_DUMPER=signal_dumper 68# Values in seconds. 69TIME_OUT_EXTRA=0 70TIME_OUT_VALUE= 71USE_GDB="n" 72USE_GDBSERVER="n" 73GDBSERVER_PORT=":5039" 74USE_JVM="n" 75USE_JVMTI="n" 76VERIFY="y" # y=yes,n=no,s=softfail 77ZYGOTE="" 78DEX_VERIFY="" 79INSTRUCTION_SET_FEATURES="" 80ARGS="" 81VDEX_ARGS="" 82EXTERNAL_LOG_TAGS="n" # if y respect externally set ANDROID_LOG_TAGS. 83DRY_RUN="n" # if y prepare to run the test but don't run it. 84TEST_VDEX="n" 85TEST_DM="n" 86TEST_IS_NDEBUG="n" 87APP_IMAGE="y" 88JVMTI_STRESS="n" 89JVMTI_STEP_STRESS="n" 90JVMTI_FIELD_STRESS="n" 91JVMTI_TRACE_STRESS="n" 92JVMTI_REDEFINE_STRESS="n" 93PROFILE="n" 94RANDOM_PROFILE="n" 95# The normal dex2oat timeout. 96DEX2OAT_TIMEOUT="300" # 5 mins 97# The *hard* timeout where we really start trying to kill the dex2oat. 98DEX2OAT_RT_TIMEOUT="360" # 6 mins 99CREATE_RUNNER="n" 100 101# if "y", run 'sync' before dalvikvm to make sure all files from 102# build step (e.g. dex2oat) were finished writing. 103SYNC_BEFORE_RUN="n" 104 105# When running a debug build, we want to run with all checks. 106ANDROID_FLAGS="${ANDROID_FLAGS} -XX:SlowDebug=true" 107# The same for dex2oatd, both prebuild and runtime-driven. 108ANDROID_FLAGS="${ANDROID_FLAGS} -Xcompiler-option --runtime-arg -Xcompiler-option -XX:SlowDebug=true" 109COMPILER_FLAGS="${COMPILER_FLAGS} --runtime-arg -XX:SlowDebug=true" 110 111while true; do 112 if [ "x$1" = "x--quiet" ]; then 113 QUIET="y" 114 shift 115 elif [ "x$1" = "x--dex2oat-rt-timeout" ]; then 116 shift 117 if [ "x$1" = "x" ]; then 118 echo "$0 missing argument to --dex2oat-rt-timeout" 1>&2 119 exit 1 120 fi 121 DEX2OAT_RT_TIMEOUT="$1" 122 shift 123 elif [ "x$1" = "x--dex2oat-timeout" ]; then 124 shift 125 if [ "x$1" = "x" ]; then 126 echo "$0 missing argument to --dex2oat-timeout" 1>&2 127 exit 1 128 fi 129 DEX2OAT_TIMEOUT="$1" 130 shift 131 elif [ "x$1" = "x--jvmti" ]; then 132 USE_JVMTI="y" 133 IS_JVMTI_TEST="y" 134 shift 135 elif [ "x$1" = "x--add-libdir-argument" ]; then 136 ADD_LIBDIR_ARGUMENTS="y" 137 shift 138 elif [ "x$1" = "x-O" ]; then 139 TEST_IS_NDEBUG="y" 140 shift 141 elif [ "x$1" = "x--lib" ]; then 142 shift 143 if [ "x$1" = "x" ]; then 144 echo "$0 missing argument to --lib" 1>&2 145 exit 1 146 fi 147 LIB="$1" 148 shift 149 elif [ "x$1" = "x--gc-stress" ]; then 150 # Give an extra 20 mins if we are gc-stress. 151 TIME_OUT_EXTRA=$((${TIME_OUT_EXTRA} + 1200)) 152 shift 153 elif [ "x$1" = "x--testlib" ]; then 154 shift 155 if [ "x$1" = "x" ]; then 156 echo "$0 missing argument to --testlib" 1>&2 157 exit 1 158 fi 159 ARGS="${ARGS} $1" 160 shift 161 elif [ "x$1" = "x--args" ]; then 162 shift 163 if [ "x$1" = "x" ]; then 164 echo "$0 missing argument to --args" 1>&2 165 exit 1 166 fi 167 ARGS="${ARGS} $1" 168 shift 169 elif [ "x$1" = "x--compiler-only-option" ]; then 170 shift 171 option="$1" 172 COMPILE_FLAGS="${COMPILE_FLAGS} $option" 173 shift 174 elif [ "x$1" = "x-Xcompiler-option" ]; then 175 shift 176 option="$1" 177 FLAGS="${FLAGS} -Xcompiler-option $option" 178 COMPILE_FLAGS="${COMPILE_FLAGS} $option" 179 shift 180 elif [ "x$1" = "x--create-runner" ]; then 181 CREATE_RUNNER="y" 182 shift 183 elif [ "x$1" = "x--android-runtime-option" ]; then 184 shift 185 option="$1" 186 ANDROID_FLAGS="${ANDROID_FLAGS} $option" 187 shift 188 elif [ "x$1" = "x--runtime-option" ]; then 189 shift 190 option="$1" 191 FLAGS="${FLAGS} $option" 192 if [ "x$option" = "x-Xmethod-trace" ]; then 193 # Method tracing can slow some tests down a lot, in particular 194 # 530-checker-lse2. 195 TIME_OUT_EXTRA=$((${TIME_OUT_EXTRA} + 1200)) 196 fi 197 shift 198 elif [ "x$1" = "x--boot" ]; then 199 shift 200 BOOT_IMAGE="$1" 201 shift 202 elif [ "x$1" = "x--relocate" ]; then 203 RELOCATE="y" 204 shift 205 elif [ "x$1" = "x--no-relocate" ]; then 206 RELOCATE="n" 207 shift 208 elif [ "x$1" = "x--prebuild" ]; then 209 PREBUILD="y" 210 shift 211 elif [ "x$1" = "x--compact-dex-level" ]; then 212 shift 213 COMPILE_FLAGS="${COMPILE_FLAGS} --compact-dex-level=$1" 214 shift 215 elif [ "x$1" = "x--jvmti-redefine-stress" ]; then 216 # APP_IMAGE doesn't really work with jvmti redefine stress 217 USE_JVMTI="y" 218 APP_IMAGE="n" 219 JVMTI_STRESS="y" 220 JVMTI_REDEFINE_STRESS="y" 221 shift 222 elif [ "x$1" = "x--jvmti-step-stress" ]; then 223 USE_JVMTI="y" 224 JVMTI_STRESS="y" 225 JVMTI_STEP_STRESS="y" 226 shift 227 elif [ "x$1" = "x--jvmti-field-stress" ]; then 228 USE_JVMTI="y" 229 JVMTI_STRESS="y" 230 JVMTI_FIELD_STRESS="y" 231 shift 232 elif [ "x$1" = "x--jvmti-trace-stress" ]; then 233 USE_JVMTI="y" 234 JVMTI_STRESS="y" 235 JVMTI_TRACE_STRESS="y" 236 shift 237 elif [ "x$1" = "x--no-app-image" ]; then 238 APP_IMAGE="n" 239 shift 240 elif [ "x$1" = "x--strip-dex" ]; then 241 STRIP_DEX="y" 242 shift 243 elif [ "x$1" = "x--host" ]; then 244 HOST="y" 245 ANDROID_ROOT="${ANDROID_HOST_OUT}" 246 ANDROID_ART_ROOT="${ANDROID_HOST_OUT}/com.android.art" 247 ANDROID_I18N_ROOT="${ANDROID_HOST_OUT}/com.android.i18n" 248 ANDROID_TZDATA_ROOT="${ANDROID_HOST_OUT}/com.android.tzdata" 249 # On host, we default to using the symlink, as the PREFER_32BIT 250 # configuration is the only configuration building a 32bit version of 251 # dex2oat. 252 DEX2OAT_DEBUG_BINARY="dex2oatd" 253 DEX2OAT_NDEBUG_BINARY="dex2oat" 254 shift 255 elif [ "x$1" = "x--bionic" ]; then 256 BIONIC="y" 257 # We need to create an ANDROID_ROOT because currently we cannot create 258 # the frameworks/libcore with linux_bionic so we need to use the normal 259 # host ones which are in a different location. 260 CREATE_ANDROID_ROOT="y" 261 shift 262 elif [ "x$1" = "x--runtime-extracted-zipapex" ]; then 263 shift 264 USE_EXTRACTED_ZIPAPEX="y" 265 EXTRACTED_ZIPAPEX_LOC="$1" 266 shift 267 elif [ "x$1" = "x--runtime-zipapex" ]; then 268 shift 269 USE_ZIPAPEX="y" 270 ZIPAPEX_LOC="$1" 271 # TODO (b/119942078): Currently apex does not support 272 # symlink_preferred_arch so we will not have a dex2oatd to execute and 273 # need to manually provide 274 # dex2oatd64. 275 DEX2OAT_DEBUG_BINARY="dex2oatd64" 276 shift 277 elif [ "x$1" = "x--no-prebuild" ]; then 278 PREBUILD="n" 279 shift 280 elif [ "x$1" = "x--no-image" ]; then 281 HAVE_IMAGE="n" 282 shift 283 elif [ "x$1" = "x--secondary" ]; then 284 SECONDARY_DEX=":$DEX_LOCATION/$TEST_NAME-ex.jar" 285 # Enable cfg-append to make sure we get the dump for both dex files. 286 # (otherwise the runtime compilation of the secondary dex will overwrite 287 # the dump of the first one). 288 FLAGS="${FLAGS} -Xcompiler-option --dump-cfg-append" 289 COMPILE_FLAGS="${COMPILE_FLAGS} --dump-cfg-append" 290 shift 291 elif [ "x$1" = "x--with-agent" ]; then 292 shift 293 USE_JVMTI="y" 294 WITH_AGENT+=("$1") 295 shift 296 elif [ "x$1" = "x--debug-wrap-agent" ]; then 297 WRAP_DEBUGGER_AGENT="y" 298 shift 299 elif [ "x$1" = "x--debug-agent" ]; then 300 shift 301 DEBUGGER="agent" 302 USE_JVMTI="y" 303 DEBUGGER_AGENT="$1" 304 TIME_OUT="n" 305 shift 306 elif [ "x$1" = "x--debug" ]; then 307 USE_JVMTI="y" 308 DEBUGGER="y" 309 TIME_OUT="n" 310 shift 311 elif [ "x$1" = "x--gdbserver-port" ]; then 312 shift 313 GDBSERVER_PORT=$1 314 shift 315 elif [ "x$1" = "x--gdbserver-bin" ]; then 316 shift 317 GDBSERVER_HOST=$1 318 GDBSERVER_DEVICE=$1 319 shift 320 elif [ "x$1" = "x--gdbserver" ]; then 321 USE_GDBSERVER="y" 322 DEV_MODE="y" 323 TIME_OUT="n" 324 shift 325 elif [ "x$1" = "x--gdb" ]; then 326 USE_GDB="y" 327 DEV_MODE="y" 328 TIME_OUT="n" 329 shift 330 elif [ "x$1" = "x--gdb-arg" ]; then 331 shift 332 gdb_arg="$1" 333 GDB_ARGS="${GDB_ARGS} $gdb_arg" 334 shift 335 elif [ "x$1" = "x--zygote" ]; then 336 ZYGOTE="-Xzygote" 337 msg "Spawning from zygote" 338 shift 339 elif [ "x$1" = "x--dev" ]; then 340 DEV_MODE="y" 341 shift 342 elif [ "x$1" = "x--interpreter" ]; then 343 INTERPRETER="y" 344 shift 345 elif [ "x$1" = "x--jit" ]; then 346 JIT="y" 347 shift 348 elif [ "x$1" = "x--baseline" ]; then 349 FLAGS="${FLAGS} -Xcompiler-option --baseline" 350 COMPILE_FLAGS="${COMPILE_FLAGS} --baseline" 351 shift 352 elif [ "x$1" = "x--jvm" ]; then 353 USE_JVM="y" 354 shift 355 elif [ "x$1" = "x--invoke-with" ]; then 356 shift 357 if [ "x$1" = "x" ]; then 358 echo "$0 missing argument to --invoke-with" 1>&2 359 exit 1 360 fi 361 if [ "x$INVOKE_WITH" = "x" ]; then 362 INVOKE_WITH="$1" 363 else 364 INVOKE_WITH="$INVOKE_WITH $1" 365 fi 366 shift 367 elif [ "x$1" = "x--no-verify" ]; then 368 VERIFY="n" 369 shift 370 elif [ "x$1" = "x--verify-soft-fail" ]; then 371 VERIFY="s" 372 shift 373 elif [ "x$1" = "x--no-optimize" ]; then 374 OPTIMIZE="n" 375 shift 376 elif [ "x$1" = "x--chroot" ]; then 377 shift 378 CHROOT="$1" 379 shift 380 elif [ "x$1" = "x--android-root" ]; then 381 shift 382 ANDROID_ROOT="$1" 383 shift 384 elif [ "x$1" = "x--android-i18n-root" ]; then 385 shift 386 ANDROID_I18N_ROOT="$1" 387 shift 388 elif [ "x$1" = "x--android-art-root" ]; then 389 shift 390 ANDROID_ART_ROOT="$1" 391 shift 392 elif [ "x$1" = "x--android-tzdata-root" ]; then 393 shift 394 ANDROID_TZDATA_ROOT="$1" 395 shift 396 elif [ "x$1" = "x--instruction-set-features" ]; then 397 shift 398 INSTRUCTION_SET_FEATURES="$1" 399 shift 400 elif [ "x$1" = "x--timeout" ]; then 401 shift 402 TIME_OUT_VALUE="$1" 403 shift 404 elif [ "x$1" = "x--" ]; then 405 shift 406 break 407 elif [ "x$1" = "x--64" ]; then 408 ISA="x86_64" 409 GDBSERVER_DEVICE="gdbserver64" 410 DALVIKVM="dalvikvm64" 411 LIBRARY_DIRECTORY="lib64" 412 TEST_DIRECTORY="nativetest64" 413 ARCHITECTURES_PATTERN="${ARCHITECTURES_64}" 414 GET_DEVICE_ISA_BITNESS_FLAG="--64" 415 DEX2OAT_NDEBUG_BINARY="dex2oat64" 416 DEX2OAT_DEBUG_BINARY="dex2oatd64" 417 shift 418 elif [ "x$1" = "x--experimental" ]; then 419 if [ "$#" -lt 2 ]; then 420 echo "missing --experimental option" 1>&2 421 exit 1 422 fi 423 EXPERIMENTAL="$EXPERIMENTAL $2" 424 shift 2 425 elif [ "x$1" = "x--external-log-tags" ]; then 426 EXTERNAL_LOG_TAGS="y" 427 shift 428 elif [ "x$1" = "x--dry-run" ]; then 429 DRY_RUN="y" 430 shift 431 elif [ "x$1" = "x--vdex" ]; then 432 TEST_VDEX="y" 433 shift 434 elif [ "x$1" = "x--dm" ]; then 435 TEST_DM="y" 436 shift 437 elif [ "x$1" = "x--vdex-filter" ]; then 438 shift 439 option="$1" 440 VDEX_ARGS="${VDEX_ARGS} --compiler-filter=$option" 441 shift 442 elif [ "x$1" = "x--vdex-arg" ]; then 443 shift 444 VDEX_ARGS="${VDEX_ARGS} $1" 445 shift 446 elif [ "x$1" = "x--sync" ]; then 447 SYNC_BEFORE_RUN="y" 448 shift 449 elif [ "x$1" = "x--profile" ]; then 450 PROFILE="y" 451 shift 452 elif [ "x$1" = "x--random-profile" ]; then 453 RANDOM_PROFILE="y" 454 shift 455 elif expr "x$1" : "x--" >/dev/null 2>&1; then 456 echo "unknown $0 option: $1" 1>&2 457 exit 1 458 else 459 break 460 fi 461done 462 463# HACK: Force the use of `signal_dumper` on host. 464if [[ "$HOST" = "y" ]]; then 465 TIME_OUT="timeout" 466fi 467 468# If you change this, update the timeout in testrunner.py as well. 469if [ -z "$TIME_OUT_VALUE" ] ; then 470 # 10 minutes is the default. 471 TIME_OUT_VALUE=600 472 473 # For sanitized builds use a larger base. 474 # TODO: Consider sanitized target builds? 475 if [ "x$SANITIZE_HOST" != "x" ] ; then 476 TIME_OUT_VALUE=1500 # 25 minutes. 477 fi 478 479 TIME_OUT_VALUE=$((${TIME_OUT_VALUE} + ${TIME_OUT_EXTRA})) 480fi 481 482# Escape hatch for slow hosts or devices. Accept an environment variable as a timeout factor. 483if [ ! -z "$ART_TIME_OUT_MULTIPLIER" ] ; then 484 TIME_OUT_VALUE=$((${TIME_OUT_VALUE} * ${ART_TIME_OUT_MULTIPLIER})) 485fi 486 487# The DEX_LOCATION with the chroot prefix, if any. 488CHROOT_DEX_LOCATION="$CHROOT$DEX_LOCATION" 489 490# If running on device, determine the ISA of the device. 491if [ "$HOST" = "n" ]; then 492 ISA=$("$ANDROID_BUILD_TOP/art/test/utils/get-device-isa" "$GET_DEVICE_ISA_BITNESS_FLAG") 493fi 494 495if [ "$USE_JVM" = "n" ]; then 496 FLAGS="${FLAGS} ${ANDROID_FLAGS}" 497 # we don't want to be trying to get adbconnections since the plugin might 498 # not have been built. 499 FLAGS="${FLAGS} -XjdwpProvider:none" 500 for feature in ${EXPERIMENTAL}; do 501 FLAGS="${FLAGS} -Xexperimental:${feature} -Xcompiler-option --runtime-arg -Xcompiler-option -Xexperimental:${feature}" 502 COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xexperimental:${feature}" 503 done 504fi 505 506if [ "$CREATE_ANDROID_ROOT" = "y" ]; then 507 ANDROID_ROOT=$DEX_LOCATION/android-root 508fi 509 510if [ "x$1" = "x" ] ; then 511 MAIN="Main" 512else 513 MAIN="$1" 514 shift 515fi 516 517if [ "$ZYGOTE" = "" ]; then 518 if [ "$OPTIMIZE" = "y" ]; then 519 if [ "$VERIFY" = "y" ]; then 520 DEX_OPTIMIZE="-Xdexopt:verified" 521 else 522 DEX_OPTIMIZE="-Xdexopt:all" 523 fi 524 msg "Performing optimizations" 525 else 526 DEX_OPTIMIZE="-Xdexopt:none" 527 msg "Skipping optimizations" 528 fi 529 530 if [ "$VERIFY" = "y" ]; then 531 JVM_VERIFY_ARG="-Xverify:all" 532 msg "Performing verification" 533 elif [ "$VERIFY" = "s" ]; then 534 JVM_VERIFY_ARG="Xverify:all" 535 DEX_VERIFY="-Xverify:softfail" 536 msg "Forcing verification to be soft fail" 537 else # VERIFY = "n" 538 DEX_VERIFY="-Xverify:none" 539 JVM_VERIFY_ARG="-Xverify:none" 540 msg "Skipping verification" 541 fi 542fi 543 544msg "------------------------------" 545 546if [ "$DEBUGGER" = "y" ]; then 547 # Use this instead for ddms and connect by running 'ddms': 548 # DEBUGGER_OPTS="-XjdwpOptions=server=y,suspend=y -XjdwpProvider:adbconnection" 549 # TODO: add a separate --ddms option? 550 551 PORT=12345 552 msg "Waiting for jdb to connect:" 553 if [ "$HOST" = "n" ]; then 554 msg " adb forward tcp:$PORT tcp:$PORT" 555 fi 556 msg " jdb -attach localhost:$PORT" 557 if [ "$USE_JVM" = "n" ]; then 558 # Use the default libjdwp agent. Use --debug-agent to use a custom one. 559 DEBUGGER_OPTS="-agentpath:libjdwp.so=transport=dt_socket,address=$PORT,server=y,suspend=y -XjdwpProvider:internal" 560 else 561 DEBUGGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=$PORT,server=y,suspend=y" 562 fi 563elif [ "$DEBUGGER" = "agent" ]; then 564 PORT=12345 565 # TODO Support ddms connection and support target. 566 if [ "$HOST" = "n" ]; then 567 echo "--debug-agent not supported yet for target!" 568 exit 1 569 fi 570 AGENTPATH=${DEBUGGER_AGENT} 571 if [ "$WRAP_DEBUGGER_AGENT" = "y" ]; then 572 WRAPPROPS="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}/libwrapagentpropertiesd.so" 573 if [ "$TEST_IS_NDEBUG" = "y" ]; then 574 WRAPPROPS="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}/libwrapagentproperties.so" 575 fi 576 AGENTPATH="${WRAPPROPS}=${ANDROID_BUILD_TOP}/art/tools/libjdwp-compat.props,${AGENTPATH}" 577 fi 578 msg "Connect to localhost:$PORT" 579 DEBUGGER_OPTS="-agentpath:${AGENTPATH}=transport=dt_socket,address=$PORT,server=y,suspend=y" 580fi 581 582for agent in "${WITH_AGENT[@]}"; do 583 FLAGS="${FLAGS} -agentpath:${agent}" 584done 585 586if [ "$USE_JVMTI" = "y" ]; then 587 if [ "$USE_JVM" = "n" ]; then 588 plugin=libopenjdkjvmtid.so 589 if [[ "$TEST_IS_NDEBUG" = "y" ]]; then 590 plugin=libopenjdkjvmti.so 591 fi 592 # We used to add flags here that made the runtime debuggable but that is not 593 # needed anymore since the plugin can do it for us now. 594 FLAGS="${FLAGS} -Xplugin:${plugin}" 595 fi 596fi 597 598# Add the libdir to the argv passed to the main function. 599if [ "$ADD_LIBDIR_ARGUMENTS" = "y" ]; then 600 if [[ "$HOST" = "y" ]]; then 601 ARGS="${ARGS} ${ANDROID_HOST_OUT}/${TEST_DIRECTORY}/" 602 else 603 ARGS="${ARGS} /data/${TEST_DIRECTORY}/art/${ISA}/" 604 fi 605fi 606if [ "$IS_JVMTI_TEST" = "y" ]; then 607 agent=libtiagentd.so 608 lib=tiagentd 609 if [[ "$TEST_IS_NDEBUG" = "y" ]]; then 610 agent=libtiagent.so 611 lib=tiagent 612 fi 613 614 ARGS="${ARGS} ${lib}" 615 if [[ "$USE_JVM" = "y" ]]; then 616 FLAGS="${FLAGS} -agentpath:${ANDROID_HOST_OUT}/nativetest64/${agent}=${TEST_NAME},jvm" 617 else 618 if [[ "$HOST" = "y" ]]; then 619 FLAGS="${FLAGS} -agentpath:${agent}=${TEST_NAME},art" 620 else 621 # The linker configuration used for dalvikvm(64) in the ART APEX 622 # requires us to pass the full path to the agent to the runtime when 623 # running on device. 624 FLAGS="${FLAGS} -agentpath:/data/${TEST_DIRECTORY}/art/${ISA}/${agent}=${TEST_NAME},art" 625 fi 626 fi 627fi 628 629if [[ "$JVMTI_STRESS" = "y" ]]; then 630 agent=libtistressd.so 631 if [[ "$TEST_IS_NDEBUG" = "y" ]]; then 632 agent=libtistress.so 633 fi 634 635 # Just give it a default start so we can always add ',' to it. 636 agent_args="jvmti-stress" 637 if [[ "$JVMTI_REDEFINE_STRESS" = "y" ]]; then 638 # We really cannot do this on RI so don't both passing it in that case. 639 if [[ "$USE_JVM" = "n" ]]; then 640 agent_args="${agent_args},redefine" 641 fi 642 fi 643 if [[ "$JVMTI_FIELD_STRESS" = "y" ]]; then 644 agent_args="${agent_args},field" 645 fi 646 if [[ "$JVMTI_STEP_STRESS" = "y" ]]; then 647 agent_args="${agent_args},step" 648 fi 649 if [[ "$JVMTI_TRACE_STRESS" = "y" ]]; then 650 agent_args="${agent_args},trace" 651 fi 652 # In the future add onto this; 653 if [[ "$USE_JVM" = "y" ]]; then 654 FLAGS="${FLAGS} -agentpath:${ANDROID_HOST_OUT}/nativetest64/${agent}=${agent_args}" 655 else 656 if [[ "$HOST" = "y" ]]; then 657 FLAGS="${FLAGS} -agentpath:${agent}=${agent_args}" 658 else 659 # The linker configuration used for dalvikvm(64) in the ART APEX 660 # requires us to pass the full path to the agent to the runtime when 661 # running on device. 662 FLAGS="${FLAGS} -agentpath:/data/${TEST_DIRECTORY}/art/${ISA}/${agent}=${agent_args}" 663 fi 664 fi 665fi 666 667if [ "$USE_JVM" = "y" ]; then 668 export LD_LIBRARY_PATH=${ANDROID_HOST_OUT}/lib64 669 # Some jvmti tests are flaky without -Xint on the RI. 670 if [ "$IS_JVMTI_TEST" = "y" ]; then 671 FLAGS="${FLAGS} -Xint" 672 fi 673 # Xmx is necessary since we don't pass down the ART flags to JVM. 674 # We pass the classes2 path whether it's used (src-multidex) or not. 675 cmdline="${JAVA} ${DEBUGGER_OPTS} ${JVM_VERIFY_ARG} -Xmx256m -classpath classes:classes2 ${FLAGS} $MAIN $@ ${ARGS}" 676 if [ "$DEV_MODE" = "y" ]; then 677 echo $cmdline 678 fi 679 if [ "$CREATE_RUNNER" = "y" ]; then 680 echo "#!/bin/bash" > runit.sh 681 echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH\"" 682 echo $cmdline "2>&1" >> runit.sh 683 chmod u+x runit.sh 684 echo "Runnable test script written to $PWD/runit.sh" 685 else 686 $cmdline 687 fi 688 exit 689fi 690 691# Note: This must start with the CORE_IMG_JARS in Android.common_path.mk 692# because that's what we use for compiling the core.art image. 693# It may contain additional modules from TEST_CORE_JARS. 694bpath_modules="core-oj core-libart core-icu4j okhttp bouncycastle apache-xml conscrypt" 695if [ "${HOST}" = "y" ]; then 696 framework="${ANDROID_HOST_OUT}/framework" 697 if [ "${ANDROID_HOST_OUT:0:${#ANDROID_BUILD_TOP}+1}" = "${ANDROID_BUILD_TOP}/" ]; then 698 framework_location="${ANDROID_HOST_OUT:${#ANDROID_BUILD_TOP}+1}/framework" 699 else 700 echo "error: ANDROID_BUILD_TOP/ is not a prefix of ANDROID_HOST_OUT" 701 echo "ANDROID_BUILD_TOP=${ANDROID_BUILD_TOP}" 702 echo "ANDROID_HOST_OUT=${ANDROID_HOST_OUT}" 703 exit 704 fi 705 bpath_suffix="-hostdex" 706else 707 framework="${ANDROID_ROOT}/framework" 708 framework_location="${ANDROID_ROOT}/framework" 709 bpath_suffix="-testdex" 710fi 711bpath="" 712bpath_locations="" 713bpath_separator="" 714for bpath_module in ${bpath_modules}; do 715 bpath+="${bpath_separator}${framework}/${bpath_module}${bpath_suffix}.jar" 716 bpath_locations+="${bpath_separator}${framework_location}/${bpath_module}${bpath_suffix}.jar" 717 bpath_separator=":" 718done 719# Pass down the bootclasspath 720FLAGS="${FLAGS} -Xbootclasspath:${bpath}" 721FLAGS="${FLAGS} -Xbootclasspath-locations:${bpath_locations}" 722COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xbootclasspath:${bpath}" 723COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xbootclasspath-locations:${bpath_locations}" 724 725if [ "$HAVE_IMAGE" = "n" ]; then 726 # Disable image dex2oat - this will forbid the runtime to patch or compile an image. 727 FLAGS="${FLAGS} -Xnoimage-dex2oat" 728 729 # We'll abuse a second flag here to test different behavior. If --relocate, use the 730 # existing image - relocation will fail as patching is disallowed. If --no-relocate, 731 # pass a non-existent image - compilation will fail as dex2oat is disallowed. 732 if [ "${RELOCATE}" = "y" ] ; then 733 DALVIKVM_BOOT_OPT="-Ximage:${BOOT_IMAGE}" 734 else 735 DALVIKVM_BOOT_OPT="-Ximage:/system/non-existent/core.art" 736 fi 737else 738 DALVIKVM_BOOT_OPT="-Ximage:${BOOT_IMAGE}" 739fi 740 741 742if [ "$USE_GDB" = "y" ]; then 743 if [ "$USE_GDBSERVER" = "y" ]; then 744 echo "Cannot pass both --gdb and --gdbserver at the same time!" >&2 745 exit 1 746 elif [ "$HOST" = "n" ]; then 747 # We might not have any hostname resolution if we are using a chroot. 748 GDB="$GDBSERVER_DEVICE --no-startup-with-shell 127.0.0.1$GDBSERVER_PORT" 749 else 750 if [ `uname` = "Darwin" ]; then 751 GDB=lldb 752 GDB_ARGS="$GDB_ARGS -- $DALVIKVM" 753 DALVIKVM= 754 else 755 GDB=gdb 756 GDB_ARGS="$GDB_ARGS --args $DALVIKVM" 757 # Enable for Emacs "M-x gdb" support. TODO: allow extra gdb arguments on command line. 758 # gdbargs="--annotate=3 $gdbargs" 759 fi 760 fi 761elif [ "$USE_GDBSERVER" = "y" ]; then 762 if [ "$HOST" = "n" ]; then 763 # We might not have any hostname resolution if we are using a chroot. 764 GDB="$GDBSERVER_DEVICE --no-startup-with-shell 127.0.0.1$GDBSERVER_PORT" 765 else 766 GDB="$GDBSERVER_HOST $GDBSERVER_PORT" 767 fi 768fi 769 770if [ "$INTERPRETER" = "y" ]; then 771 INT_OPTS="${INT_OPTS} -Xint" 772 if [ "$VERIFY" = "y" ] ; then 773 INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=quicken" 774 COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=quicken" 775 elif [ "$VERIFY" = "s" ]; then 776 INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=extract" 777 COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=extract" 778 DEX_VERIFY="${DEX_VERIFY} -Xverify:softfail" 779 else # VERIFY = "n" 780 INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=assume-verified" 781 COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=assume-verified" 782 DEX_VERIFY="${DEX_VERIFY} -Xverify:none" 783 fi 784fi 785 786if [ "$JIT" = "y" ]; then 787 INT_OPTS="${INT_OPTS} -Xusejit:true" 788 if [ "$VERIFY" = "y" ] ; then 789 INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=quicken" 790 COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=quicken" 791 else 792 INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=assume-verified" 793 COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=assume-verified" 794 DEX_VERIFY="${DEX_VERIFY} -Xverify:none" 795 fi 796else 797 INT_OPTS="${INT_OPTS} -Xusejit:false" 798fi 799 800JNI_OPTS="-Xjnigreflimit:512 -Xcheck:jni" 801 802COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xnorelocate" 803if [ "$RELOCATE" = "y" ]; then 804 FLAGS="${FLAGS} -Xrelocate" 805else 806 FLAGS="$FLAGS -Xnorelocate" 807fi 808 809if [ "$BIONIC" = "y" ]; then 810 # This is the location that soong drops linux_bionic builds. Despite being 811 # called linux_bionic-x86 the build is actually amd64 (x86_64) only. 812 if [ ! -e "$OUT_DIR/soong/host/linux_bionic-x86" ]; then 813 echo "linux_bionic-x86 target doesn't seem to have been built!" >&2 814 exit 1 815 fi 816 # Set TIMEOUT_DUMPER manually so it works even with apex's 817 TIMEOUT_DUMPER=$OUT_DIR/soong/host/linux_bionic-x86/bin/signal_dumper 818fi 819 820# Prevent test from silently falling back to interpreter in no-prebuild mode. This happens 821# when DEX_LOCATION path is too long, because vdex/odex filename is constructed by taking 822# full path to dex, stripping leading '/', appending '@classes.vdex' and changing every 823# remaining '/' into '@'. 824if [ "$HOST" = "y" ]; then 825 max_filename_size=$(getconf NAME_MAX $DEX_LOCATION) 826else 827 # There is no getconf on device, fallback to standard value. 828 # See NAME_MAX in kernel <linux/limits.h> 829 max_filename_size=255 830fi 831# Compute VDEX_NAME. 832DEX_LOCATION_STRIPPED="${DEX_LOCATION#/}" 833VDEX_NAME="${DEX_LOCATION_STRIPPED//\//@}@$TEST_NAME[email protected]" 834if [ ${#VDEX_NAME} -gt $max_filename_size ]; then 835 echo "Dex location path too long:" 836 echo "$VDEX_NAME is ${#VDEX_NAME} character long, and the limit is $max_filename_size." 837 exit 1 838fi 839 840if [ "$HOST" = "y" ]; then 841 # On host, run binaries (`dex2oat(d)`, `dalvikvm`, `profman`) from the `bin` 842 # directory under the "Android Root" (usually `out/host/linux-x86`). 843 # 844 # TODO(b/130295968): Adjust this if/when ART host artifacts are installed 845 # under the ART root (usually `out/host/linux-x86/com.android.art`). 846 ANDROID_ART_BIN_DIR=$ANDROID_ROOT/bin 847else 848 # On target, run binaries (`dex2oat(d)`, `dalvikvm`, `profman`) from the ART 849 # APEX's `bin` directory. This means the linker will observe the ART APEX 850 # linker configuration file (`/apex/com.android.art/etc/ld.config.txt`) for 851 # these binaries. 852 ANDROID_ART_BIN_DIR=$ANDROID_ART_ROOT/bin 853fi 854 855profman_cmdline="true" 856dex2oat_cmdline="true" 857vdex_cmdline="true" 858dm_cmdline="true" 859mkdir_locations="${DEX_LOCATION}/dalvik-cache/$ISA" 860strip_cmdline="true" 861sync_cmdline="true" 862linkroot_cmdline="true" 863linkroot_overlay_cmdline="true" 864setupapex_cmdline="true" 865installapex_cmdline="true" 866 867linkdirs() { 868 find "$1" -maxdepth 1 -mindepth 1 -type d | xargs -i ln -sf '{}' "$2" 869} 870 871if [ "$CREATE_ANDROID_ROOT" = "y" ]; then 872 mkdir_locations="${mkdir_locations} ${ANDROID_ROOT}" 873 linkroot_cmdline="linkdirs ${ANDROID_HOST_OUT} ${ANDROID_ROOT}" 874 if [ "${BIONIC}" = "y" ]; then 875 # TODO Make this overlay more generic. 876 linkroot_overlay_cmdline="linkdirs $OUT_DIR/soong/host/linux_bionic-x86 ${ANDROID_ROOT}" 877 fi 878fi 879 880if [ "$USE_ZIPAPEX" = "y" ]; then 881 # TODO Currently this only works for linux_bionic zipapexes because those are 882 # stripped and so small enough that the ulimit doesn't kill us. 883 mkdir_locations="${mkdir_locations} $DEX_LOCATION/zipapex" 884 zip_options="-qq" 885 if [ "$DEV_MODE" = "y" ]; then 886 zip_options="" 887 fi 888 setupapex_cmdline="unzip -o -u ${zip_options} ${ZIPAPEX_LOC} apex_payload.zip -d ${DEX_LOCATION}" 889 installapex_cmdline="unzip -o -u ${zip_options} ${DEX_LOCATION}/apex_payload.zip -d ${DEX_LOCATION}/zipapex" 890 ANDROID_ART_BIN_DIR=$DEX_LOCATION/zipapex/bin 891elif [ "$USE_EXTRACTED_ZIPAPEX" = "y" ]; then 892 # Just symlink the zipapex binaries 893 ANDROID_ART_BIN_DIR=$DEX_LOCATION/zipapex/bin 894 # Force since some tests manually run this file twice. 895 ln_options="" 896 if [ "$DEV_MODE" = "y" ]; then 897 ln_options="--verbose" 898 fi 899 installapex_cmdline="ln -s -f ${ln_options} ${EXTRACTED_ZIPAPEX_LOC} ${DEX_LOCATION}/zipapex" 900fi 901 902# PROFILE takes precedence over RANDOM_PROFILE, since PROFILE tests require a 903# specific profile to run properly. 904if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then 905 profman_cmdline="$ANDROID_ART_BIN_DIR/profman \ 906 --apk=$DEX_LOCATION/$TEST_NAME.jar \ 907 --dex-location=$DEX_LOCATION/$TEST_NAME.jar" 908 if [ -f $DEX_LOCATION/$TEST_NAME-ex.jar ]; then 909 profman_cmdline="${profman_cmdline} \ 910 --apk=$DEX_LOCATION/$TEST_NAME-ex.jar \ 911 --dex-location=$DEX_LOCATION/$TEST_NAME-ex.jar" 912 fi 913 COMPILE_FLAGS="${COMPILE_FLAGS} --profile-file=$DEX_LOCATION/$TEST_NAME.prof" 914 FLAGS="${FLAGS} -Xcompiler-option --profile-file=$DEX_LOCATION/$TEST_NAME.prof" 915 if [ "$PROFILE" = "y" ]; then 916 profman_cmdline="${profman_cmdline} --create-profile-from=$DEX_LOCATION/profile \ 917 --reference-profile-file=$DEX_LOCATION/$TEST_NAME.prof" 918 else 919 profman_cmdline="${profman_cmdline} --generate-test-profile=$DEX_LOCATION/$TEST_NAME.prof \ 920 --generate-test-profile-seed=0" 921 fi 922fi 923 924# Enable mini-debug-info for JIT (if JIT is used). 925FLAGS="$FLAGS -Xcompiler-option --generate-mini-debug-info" 926 927if [ "$PREBUILD" = "y" ]; then 928 mkdir_locations="${mkdir_locations} ${DEX_LOCATION}/oat/$ISA" 929 if [ "$APP_IMAGE" = "y" ]; then 930 # Pick a base that will force the app image to get relocated. 931 app_image="--app-image-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.art --resolve-startup-const-strings=true" 932 fi 933 934 dex2oat_binary=${DEX2OAT_DEBUG_BINARY} 935 if [[ "$TEST_IS_NDEBUG" = "y" ]]; then 936 dex2oat_binary=${DEX2OAT_NDEBUG_BINARY} 937 fi 938 dex2oat_cmdline="$INVOKE_WITH $ANDROID_ART_BIN_DIR/$dex2oat_binary \ 939 $COMPILE_FLAGS \ 940 --boot-image=${BOOT_IMAGE} \ 941 --dex-file=$DEX_LOCATION/$TEST_NAME.jar \ 942 --oat-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.odex \ 943 ${app_image} \ 944 --generate-mini-debug-info \ 945 --instruction-set=$ISA" 946 if [ "x$INSTRUCTION_SET_FEATURES" != "x" ] ; then 947 dex2oat_cmdline="${dex2oat_cmdline} --instruction-set-features=${INSTRUCTION_SET_FEATURES}" 948 fi 949 950 # Add in a timeout. This is important for testing the compilation/verification time of 951 # pathological cases. 952 # Note: as we don't know how decent targets are (e.g., emulator), only do this on the host for 953 # now. We should try to improve this. 954 # The current value is rather arbitrary. run-tests should compile quickly. 955 # Watchdog timeout is in milliseconds so add 3 '0's to the dex2oat timeout. 956 if [ "$HOST" != "n" ]; then 957 # Use SIGRTMIN+2 to try to dump threads. 958 # Use -k 1m to SIGKILL it a minute later if it hasn't ended. 959 dex2oat_cmdline="timeout -k ${DEX2OAT_TIMEOUT}s -s SIGRTMIN+2 ${DEX2OAT_RT_TIMEOUT}s ${dex2oat_cmdline} --watchdog-timeout=${DEX2OAT_TIMEOUT}000" 960 fi 961 if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then 962 vdex_cmdline="${dex2oat_cmdline} ${VDEX_ARGS} --input-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex --output-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex" 963 elif [ "$TEST_VDEX" = "y" ]; then 964 vdex_cmdline="${dex2oat_cmdline} ${VDEX_ARGS} --input-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex" 965 elif [ "$TEST_DM" = "y" ]; then 966 dex2oat_cmdline="${dex2oat_cmdline} --output-vdex=$DEX_LOCATION/oat/$ISA/primary.vdex" 967 dm_cmdline="zip -qj $DEX_LOCATION/oat/$ISA/$TEST_NAME.dm $DEX_LOCATION/oat/$ISA/primary.vdex" 968 vdex_cmdline="${dex2oat_cmdline} ${VDEX_ARGS} --dump-timings --dm-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.dm" 969 elif [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then 970 vdex_cmdline="${dex2oat_cmdline} --input-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex --output-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex" 971 fi 972fi 973 974if [ "$STRIP_DEX" = "y" ]; then 975 strip_cmdline="zip --quiet --delete $DEX_LOCATION/$TEST_NAME.jar classes.dex" 976fi 977 978if [ "$SYNC_BEFORE_RUN" = "y" ]; then 979 sync_cmdline="sync" 980fi 981 982DALVIKVM_ISA_FEATURES_ARGS="" 983if [ "x$INSTRUCTION_SET_FEATURES" != "x" ] ; then 984 DALVIKVM_ISA_FEATURES_ARGS="-Xcompiler-option --instruction-set-features=${INSTRUCTION_SET_FEATURES}" 985fi 986 987# java.io.tmpdir can only be set at launch time. 988TMP_DIR_OPTION="" 989if [ "$HOST" = "n" ]; then 990 TMP_DIR_OPTION="-Djava.io.tmpdir=/data/local/tmp" 991fi 992 993# The build servers have an ancient version of bash so we cannot use @Q. 994if [ "$USE_GDBSERVER" == "y" ]; then 995 printf -v QUOTED_DALVIKVM_BOOT_OPT "%q" "$DALVIKVM_BOOT_OPT" 996else 997 QUOTED_DALVIKVM_BOOT_OPT="$DALVIKVM_BOOT_OPT" 998fi 999 1000# We set DumpNativeStackOnSigQuit to false to avoid stressing libunwind. 1001# b/27185632 1002# b/24664297 1003dalvikvm_cmdline="$INVOKE_WITH $GDB $ANDROID_ART_BIN_DIR/$DALVIKVM \ 1004 $GDB_ARGS \ 1005 $FLAGS \ 1006 $DEX_VERIFY \ 1007 -XXlib:$LIB \ 1008 $DEX2OAT \ 1009 $DALVIKVM_ISA_FEATURES_ARGS \ 1010 $ZYGOTE \ 1011 $JNI_OPTS \ 1012 $INT_OPTS \ 1013 $DEBUGGER_OPTS \ 1014 ${QUOTED_DALVIKVM_BOOT_OPT} \ 1015 $TMP_DIR_OPTION \ 1016 -XX:DumpNativeStackOnSigQuit:false \ 1017 -cp $DEX_LOCATION/$TEST_NAME.jar$SECONDARY_DEX $MAIN $ARGS" 1018 1019# Remove whitespace. 1020dex2oat_cmdline=$(echo $dex2oat_cmdline) 1021dalvikvm_cmdline=$(echo $dalvikvm_cmdline) 1022dm_cmdline=$(echo $dm_cmdline) 1023vdex_cmdline=$(echo $vdex_cmdline) 1024profman_cmdline=$(echo $profman_cmdline) 1025 1026# Use an empty ASAN_OPTIONS to enable defaults. 1027# Note: this is required as envsetup right now exports detect_leaks=0. 1028RUN_TEST_ASAN_OPTIONS="" 1029 1030# Multiple shutdown leaks. b/38341789 1031if [ "x$RUN_TEST_ASAN_OPTIONS" != "x" ] ; then 1032 RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}:" 1033fi 1034RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}detect_leaks=0" 1035 1036# For running, we must turn off logging when dex2oat is missing. Otherwise we use 1037# the same defaults as for prebuilt: everything when --dev, otherwise errors and above only. 1038if [ "$EXTERNAL_LOG_TAGS" = "n" ]; then 1039 if [ "$DEV_MODE" = "y" ]; then 1040 export ANDROID_LOG_TAGS='*:d' 1041 elif [ "$HAVE_IMAGE" = "n" ]; then 1042 # All tests would log the error of missing image. Be silent here and only log fatal 1043 # events. 1044 export ANDROID_LOG_TAGS='*:s' 1045 else 1046 # We are interested in LOG(ERROR) output. 1047 export ANDROID_LOG_TAGS='*:e' 1048 fi 1049fi 1050 1051if [ "$HOST" = "n" ]; then 1052 adb root > /dev/null 1053 adb wait-for-device 1054 if [ "$QUIET" = "n" ]; then 1055 adb shell rm -rf $CHROOT_DEX_LOCATION 1056 adb shell mkdir -p $CHROOT_DEX_LOCATION 1057 adb push $TEST_NAME.jar $CHROOT_DEX_LOCATION 1058 adb push $TEST_NAME-ex.jar $CHROOT_DEX_LOCATION 1059 if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then 1060 adb push profile $CHROOT_DEX_LOCATION 1061 fi 1062 # Copy resource folder 1063 if [ -d res ]; then 1064 adb push res $CHROOT_DEX_LOCATION 1065 fi 1066 else 1067 adb shell rm -rf $CHROOT_DEX_LOCATION >/dev/null 2>&1 1068 adb shell mkdir -p $CHROOT_DEX_LOCATION >/dev/null 2>&1 1069 adb push $TEST_NAME.jar $CHROOT_DEX_LOCATION >/dev/null 2>&1 1070 adb push $TEST_NAME-ex.jar $CHROOT_DEX_LOCATION >/dev/null 2>&1 1071 if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then 1072 adb push profile $CHROOT_DEX_LOCATION >/dev/null 2>&1 1073 fi 1074 # Copy resource folder 1075 if [ -d res ]; then 1076 adb push res $CHROOT_DEX_LOCATION >/dev/null 2>&1 1077 fi 1078 fi 1079 1080 # Populate LD_LIBRARY_PATH. 1081 LD_LIBRARY_PATH= 1082 if [ "$ANDROID_ROOT" != "/system" ]; then 1083 # Current default installation is dalvikvm 64bits and dex2oat 32bits, 1084 # so we can only use LD_LIBRARY_PATH when testing on a local 1085 # installation. 1086 LD_LIBRARY_PATH="$ANDROID_ROOT/$LIBRARY_DIRECTORY" 1087 fi 1088 # Needed to access libarttest(d).so and JVMTI agent libraries. 1089 LD_LIBRARY_PATH="/data/$TEST_DIRECTORY/art/$ISA:$LD_LIBRARY_PATH" 1090 # Needed to access the boot (core) image files. 1091 LD_LIBRARY_PATH="/data/art-test/$ISA:$LD_LIBRARY_PATH" 1092 # Needed to access the test's Odex files. 1093 LD_LIBRARY_PATH="$DEX_LOCATION/oat/$ISA:$LD_LIBRARY_PATH" 1094 # Needed to access the test's native libraries (see e.g. 674-hiddenapi, 1095 # which generates `libhiddenapitest_*.so` libraries in `$DEX_LOCATION`). 1096 LD_LIBRARY_PATH="$DEX_LOCATION:$LD_LIBRARY_PATH" 1097 1098 # System libraries needed by libarttestd.so 1099 PUBLIC_LIBS=libc++.so:libbacktrace.so:libbase.so:libnativehelper.so 1100 if [ "$TEST_IS_NDEBUG" = "y" ]; then 1101 PUBLIC_LIBS=$PUBLIC_LIBS:libart.so:libdexfile.so:libprofile.so:libartbase.so 1102 else 1103 PUBLIC_LIBS=$PUBLIC_LIBS:libartd.so:libdexfiled.so:libprofiled.so:libartbased.so 1104 fi 1105 1106 # Prepend directories to the path on device. 1107 PREPEND_TARGET_PATH=$ANDROID_ART_BIN_DIR 1108 if [ "$ANDROID_ROOT" != "/system" ]; then 1109 PREPEND_TARGET_PATH="$PREPEND_TARGET_PATH:$ANDROID_ROOT/bin" 1110 fi 1111 1112 timeout_dumper_cmd= 1113 1114 # Check whether signal_dumper is available. 1115 if [ "$TIMEOUT_DUMPER" = signal_dumper ] ; then 1116 # Chroot? Use as prefix for tests. 1117 TIMEOUT_DUMPER_PATH_PREFIX= 1118 if [ -n "$CHROOT" ]; then 1119 TIMEOUT_DUMPER_PATH_PREFIX="$CHROOT/" 1120 fi 1121 1122 # Testing APEX? 1123 if adb shell "test -x ${TIMEOUT_DUMPER_PATH_PREFIX}/apex/com.android.art/bin/signal_dumper" ; then 1124 TIMEOUT_DUMPER="/apex/com.android.art/bin/signal_dumper" 1125 # Is it in /system/bin? 1126 elif adb shell "test -x ${TIMEOUT_DUMPER_PATH_PREFIX}/system/bin/signal_dumper" ; then 1127 TIMEOUT_DUMPER="/system/bin/signal_dumper" 1128 else 1129 TIMEOUT_DUMPER= 1130 fi 1131 else 1132 TIMEOUT_DUMPER= 1133 fi 1134 1135 if [ ! -z "$TIMEOUT_DUMPER" ] ; then 1136 # Use "-l" to dump to logcat. That is convenience for the build bot crash symbolization. 1137 # Use exit code 124 for toybox timeout (b/141007616). 1138 timeout_dumper_cmd="${TIMEOUT_DUMPER} -l -s 15 -e 124" 1139 fi 1140 1141 timeout_prefix= 1142 if [ "$TIME_OUT" = "timeout" ]; then 1143 # Add timeout command if time out is desired. 1144 # 1145 # Note: We first send SIGTERM (the timeout default, signal 15) to the signal dumper, which 1146 # will induce a full thread dump before killing the process. To ensure any issues in 1147 # dumping do not lead to a deadlock, we also use the "-k" option to definitely kill the 1148 # child. 1149 # Note: Using "--foreground" to not propagate the signal to children, i.e., the runtime. 1150 timeout_prefix="timeout --foreground -k 120s ${TIME_OUT_VALUE}s ${timeout_dumper_cmd} $cmdline" 1151 fi 1152 1153 # Create a script with the command. The command can get longer than the longest 1154 # allowed adb command and there is no way to get the exit status from a adb shell 1155 # command. Dalvik cache is cleaned before running to make subsequent executions 1156 # of the script follow the same runtime path. 1157 cmdline="cd $DEX_LOCATION && \ 1158 export ASAN_OPTIONS=$RUN_TEST_ASAN_OPTIONS && \ 1159 export ANDROID_DATA=$DEX_LOCATION && \ 1160 export ANDROID_ADDITIONAL_PUBLIC_LIBRARIES=$PUBLIC_LIBS && \ 1161 export DEX_LOCATION=$DEX_LOCATION && \ 1162 export ANDROID_ROOT=$ANDROID_ROOT && \ 1163 export ANDROID_I18N_ROOT=$ANDROID_I18N_ROOT && \ 1164 export ANDROID_ART_ROOT=$ANDROID_ART_ROOT && \ 1165 export ANDROID_TZDATA_ROOT=$ANDROID_TZDATA_ROOT && \ 1166 export ANDROID_LOG_TAGS=$ANDROID_LOG_TAGS && \ 1167 rm -rf ${DEX_LOCATION}/dalvik-cache/ && \ 1168 mkdir -p ${mkdir_locations} && \ 1169 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH && \ 1170 export PATH=$PREPEND_TARGET_PATH:\$PATH && \ 1171 $profman_cmdline && \ 1172 $dex2oat_cmdline && \ 1173 $dm_cmdline && \ 1174 $vdex_cmdline && \ 1175 $strip_cmdline && \ 1176 $sync_cmdline && \ 1177 $timeout_prefix $dalvikvm_cmdline" 1178 1179 cmdfile=$(tempfile -p "cmd-" -s "-$TEST_NAME") 1180 echo "$cmdline" > $cmdfile 1181 1182 if [ "$DEV_MODE" = "y" ]; then 1183 echo $cmdline 1184 if [ "$USE_GDB" = "y" ] || [ "$USE_GDBSERVER" = "y" ]; then 1185 echo "Forward ${GDBSERVER_PORT} to local port and connect GDB" 1186 fi 1187 fi 1188 1189 if [ "$QUIET" = "n" ]; then 1190 adb push $cmdfile $CHROOT_DEX_LOCATION/cmdline.sh 1191 else 1192 adb push $cmdfile $CHROOT_DEX_LOCATION/cmdline.sh >/dev/null 2>&1 1193 fi 1194 1195 exit_status=0 1196 if [ "$DRY_RUN" != "y" ]; then 1197 if [ -n "$CHROOT" ]; then 1198 adb shell chroot "$CHROOT" sh $DEX_LOCATION/cmdline.sh 1199 else 1200 adb shell sh $DEX_LOCATION/cmdline.sh 1201 fi 1202 exit_status=$? 1203 fi 1204 1205 rm -f $cmdfile 1206 exit $exit_status 1207else 1208 # Host run. 1209 export ANDROID_PRINTF_LOG=brief 1210 1211 export ANDROID_DATA="$DEX_LOCATION" 1212 export ANDROID_ROOT="${ANDROID_ROOT}" 1213 export ANDROID_I18N_ROOT="${ANDROID_I18N_ROOT}" 1214 export ANDROID_ART_ROOT="${ANDROID_ART_ROOT}" 1215 export ANDROID_TZDATA_ROOT="${ANDROID_TZDATA_ROOT}" 1216 if [ "$USE_ZIPAPEX" = "y" ] || [ "$USE_EXRACTED_ZIPAPEX" = "y" ]; then 1217 # Put the zipapex files in front of the ld-library-path 1218 export LD_LIBRARY_PATH="${ANDROID_DATA}/zipapex/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}" 1219 export DYLD_LIBRARY_PATH="${ANDROID_DATA}/zipapex/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}" 1220 else 1221 export LD_LIBRARY_PATH="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}" 1222 export DYLD_LIBRARY_PATH="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}" 1223 fi 1224 export PATH="$PATH:$ANDROID_ART_BIN_DIR" 1225 1226 # Temporarily disable address space layout randomization (ASLR). 1227 # This is needed on the host so that the linker loads core.oat at the necessary address. 1228 export LD_USE_LOAD_BIAS=1 1229 1230 cmdline="$dalvikvm_cmdline" 1231 1232 if [ "$TIME_OUT" = "gdb" ]; then 1233 if [ `uname` = "Darwin" ]; then 1234 # Fall back to timeout on Mac. 1235 TIME_OUT="timeout" 1236 elif [ "$ISA" = "x86" ]; then 1237 # prctl call may fail in 32-bit on an older (3.2) 64-bit Linux kernel. Fall back to timeout. 1238 TIME_OUT="timeout" 1239 else 1240 # Check if gdb is available. 1241 gdb --eval-command="quit" > /dev/null 2>&1 1242 if [ $? != 0 ]; then 1243 # gdb isn't available. Fall back to timeout. 1244 TIME_OUT="timeout" 1245 fi 1246 fi 1247 fi 1248 1249 if [ "$TIME_OUT" = "timeout" ]; then 1250 # Add timeout command if time out is desired. 1251 # 1252 # Note: We first send SIGTERM (the timeout default, signal 15) to the signal dumper, which 1253 # will induce a full thread dump before killing the process. To ensure any issues in 1254 # dumping do not lead to a deadlock, we also use the "-k" option to definitely kill the 1255 # child. 1256 # Note: Using "--foreground" to not propagate the signal to children, i.e., the runtime. 1257 cmdline="timeout --foreground -k 120s ${TIME_OUT_VALUE}s ${TIMEOUT_DUMPER} -s 15 $cmdline" 1258 fi 1259 1260 if [ "$DEV_MODE" = "y" ]; then 1261 for var in ANDROID_PRINTF_LOG ANDROID_DATA ANDROID_ROOT ANDROID_I18N_ROOT ANDROID_TZDATA_ROOT ANDROID_ART_ROOT LD_LIBRARY_PATH DYLD_LIBRARY_PATH PATH LD_USE_LOAD_BIAS; do 1262 echo EXPORT $var=${!var} 1263 done 1264 echo "$(declare -f linkdirs)" 1265 echo "mkdir -p ${mkdir_locations} && $setupapex_cmdline && $installapex_cmdline && $linkroot_cmdline && $linkroot_overlay_cmdline && $profman_cmdline && $dex2oat_cmdline && $dm_cmdline && $vdex_cmdline && $strip_cmdline && $sync_cmdline && $cmdline" 1266 fi 1267 1268 cd $ANDROID_BUILD_TOP 1269 1270 # Make sure we delete any existing compiler artifacts. 1271 # This enables tests to call the RUN script multiple times in a row 1272 # without worrying about interference. 1273 rm -rf ${DEX_LOCATION}/oat 1274 rm -rf ${DEX_LOCATION}/dalvik-cache/ 1275 1276 export ASAN_OPTIONS=$RUN_TEST_ASAN_OPTIONS 1277 1278 mkdir -p ${mkdir_locations} || exit 1 1279 $setupapex_cmdline || { echo "zipapex extraction failed." >&2 ; exit 2; } 1280 $installapex_cmdline || { echo "zipapex install failed. cmd was: ${installapex_cmdline}." >&2; find ${mkdir_locations} -type f >&2; exit 2; } 1281 $linkroot_cmdline || { echo "create symlink android-root failed." >&2 ; exit 2; } 1282 $linkroot_overlay_cmdline || { echo "overlay android-root failed." >&2 ; exit 2; } 1283 $profman_cmdline || { echo "Profman failed." >&2 ; exit 2; } 1284 $dex2oat_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; } 1285 $dm_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; } 1286 $vdex_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; } 1287 $strip_cmdline || { echo "Strip failed." >&2 ; exit 3; } 1288 $sync_cmdline || { echo "Sync failed." >&2 ; exit 4; } 1289 1290 if [ "$CREATE_RUNNER" = "y" ]; then 1291 echo "#!/bin/bash" > ${DEX_LOCATION}/runit.sh 1292 for var in ANDROID_PRINTF_LOG ANDROID_DATA ANDROID_ROOT ANDROID_I18N_ROOT ANDROID_TZDATA_ROOT ANDROID_ART_ROOT LD_LIBRARY_PATH DYLD_LIBRARY_PATH PATH LD_USE_LOAD_BIAS; do 1293 echo export $var="${!var}" >> ${DEX_LOCATION}/runit.sh 1294 done 1295 if [ "$DEV_MODE" = "y" ]; then 1296 echo $cmdline "2>&1" >> ${DEX_LOCATION}/runit.sh 1297 else 1298 echo 'STDERR=$(mktemp)' >> ${DEX_LOCATION}/runit.sh 1299 echo 'STDOUT=$(mktemp)' >> ${DEX_LOCATION}/runit.sh 1300 echo $cmdline '2>${STDERR} >${STDOUT}' >> ${DEX_LOCATION}/runit.sh 1301 echo 'if diff ${STDOUT} $ANDROID_DATA/expected.txt; then' >> ${DEX_LOCATION}/runit.sh 1302 echo ' rm -f ${STDOUT} ${STDERR}' >> ${DEX_LOCATION}/runit.sh 1303 echo ' exit 0' >> ${DEX_LOCATION}/runit.sh 1304 echo 'else' >> ${DEX_LOCATION}/runit.sh 1305 echo ' echo STDOUT:' >> ${DEX_LOCATION}/runit.sh 1306 echo ' cat ${STDOUT}' >> ${DEX_LOCATION}/runit.sh 1307 echo ' echo STDERR:' >> ${DEX_LOCATION}/runit.sh 1308 echo ' cat ${STDERR}' >> ${DEX_LOCATION}/runit.sh 1309 echo ' rm -f ${STDOUT} ${STDERR}' >> ${DEX_LOCATION}/runit.sh 1310 echo ' exit 1' >> ${DEX_LOCATION}/runit.sh 1311 echo 'fi' >> ${DEX_LOCATION}/runit.sh 1312 fi 1313 chmod u+x $DEX_LOCATION/runit.sh 1314 echo "Runnable test script written to ${DEX_LOCATION}/runit.sh" 1315 fi 1316 if [ "$DRY_RUN" = "y" ]; then 1317 exit 0 1318 fi 1319 1320 if [ "$USE_GDB" = "y" ]; then 1321 # When running under gdb, we cannot do piping and grepping... 1322 $cmdline "$@" 1323 elif [ "$USE_GDBSERVER" = "y" ]; then 1324 echo "Connect to $GDBSERVER_PORT" 1325 # When running under gdb, we cannot do piping and grepping... 1326 $cmdline "$@" 1327 else 1328 if [ "$TIME_OUT" != "gdb" ]; then 1329 trap 'kill -INT -$pid' INT 1330 $cmdline "$@" 2>&1 & pid=$! 1331 wait $pid 1332 exit_value=$? 1333 # Add extra detail if time out is enabled. 1334 if [ $exit_value = 124 ] && [ "$TIME_OUT" = "timeout" ]; then 1335 echo -e "\e[91mTEST TIMED OUT!\e[0m" >&2 1336 fi 1337 exit $exit_value 1338 else 1339 # With a thread dump that uses gdb if a timeout. 1340 trap 'kill -INT -$pid' INT 1341 $cmdline "$@" 2>&1 & pid=$! 1342 # Spawn a watcher process. 1343 ( sleep $TIME_OUT_VALUE && \ 1344 echo "##### Thread dump using gdb on test timeout" && \ 1345 ( gdb -q -p $pid --eval-command="info thread" --eval-command="thread apply all bt" \ 1346 --eval-command="call exit(124)" --eval-command=quit || \ 1347 kill $pid )) 2> /dev/null & watcher=$! 1348 wait $pid 1349 test_exit_status=$? 1350 pkill -P $watcher 2> /dev/null # kill the sleep which will in turn end the watcher as well 1351 if [ $test_exit_status = 0 ]; then 1352 # The test finished normally. 1353 exit 0 1354 else 1355 # The test failed or timed out. 1356 if [ $test_exit_status = 124 ]; then 1357 # The test timed out. 1358 echo -e "\e[91mTEST TIMED OUT!\e[0m" >&2 1359 fi 1360 exit $test_exit_status 1361 fi 1362 fi 1363 fi 1364fi 1365