16bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#!/bin/bash
26bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#===- lib/asan/scripts/asan_device_setup -----------------------------------===#
36bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#
46bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#                     The LLVM Compiler Infrastructure
56bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#
66bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# This file is distributed under the University of Illinois Open Source
76bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# License. See LICENSE.TXT for details.
86bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#
96bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# Prepare Android device to run ASan applications.
106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#
116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#===------------------------------------------------------------------------===#
126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerset -e
146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerHERE="$(cd "$(dirname "$0")" && pwd)"
166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerrevert=no
186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerextra_options=
196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerdevice=
206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerlib=
216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickeruse_su=0
226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction usage {
246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "usage: $0 [--revert] [--device device-id] [--lib path] [--extra-options options]"
256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "  --revert: Uninstall ASan from the device."
266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "  --lib: Path to ASan runtime library."
276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "  --extra-options: Extra ASAN_OPTIONS."
286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "  --device: Install to the given device. Use 'adb devices' to find"
296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "            device-id."
306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "  --use-su: Use 'su -c' prefix for every adb command instead of using"
316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "            'adb root' once."
326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo
336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    exit 1
346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction adb_push {
376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [ $use_su -eq 0 ]; then
386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB push "$1" "$2"
396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  else
406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local FILENAME=$(basename $1)
416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB push "$1" "/data/local/tmp/$FILENAME"
426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell su -c "rm \\\"$2/$FILENAME\\\"" >&/dev/null
436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell su -c "cat \\\"/data/local/tmp/$FILENAME\\\" > \\\"$2/$FILENAME\\\""
446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell su -c "rm \\\"/data/local/tmp/$FILENAME\\\""
456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction adb_remount {
496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [ $use_su -eq 0 ]; then
506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB remount
516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  else
526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local STORAGE=`$ADB shell mount | grep /system | cut -d ' ' -f1`
536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if [ "$STORAGE" != "" ]; then
546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      echo Remounting $STORAGE at /system
556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      $ADB shell su -c "mount -o remount,rw $STORAGE /system"
566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    else
576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      echo Failed to get storage device name for "/system" mount point
586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction adb_shell {
636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [ $use_su -eq 0 ]; then
646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell $@
656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  else
666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell su -c "$*"
676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction adb_root {
716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [ $use_su -eq 0 ]; then
726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB root
736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction adb_wait_for_device {
776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  $ADB wait-for-device
786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction adb_pull {
816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [ $use_su -eq 0 ]; then
826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB pull "$1" "$2"
836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  else
846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local FILENAME=$(basename $1)
856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell rm "/data/local/tmp/$FILENAME" >&/dev/null
866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB shell su -c "[ -f \\\"$1\\\" ] && cat \\\"$1\\\" > \\\"/data/local/tmp/$FILENAME\\\" && chown root.shell \\\"/data/local/tmp/$FILENAME\\\" && chmod 755 \\\"/data/local/tmp/$FILENAME\\\"" &&
876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    $ADB pull "/data/local/tmp/$FILENAME" "$2" >&/dev/null && $ADB shell "rm \"/data/local/tmp/$FILENAME\""
886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction get_device_arch { # OUT OUT64
926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _outvar=$1
936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _outvar64=$2
946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _ABI=$(adb_shell getprop ro.product.cpu.abi)
956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _ARCH=
966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _ARCH64=
976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if [[ $_ABI == x86* ]]; then
986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        _ARCH=i686
996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    elif [[ $_ABI == armeabi* ]]; then
1006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        _ARCH=arm
1016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    elif [[ $_ABI == arm64-v8a* ]]; then
1026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        _ARCH=arm
1036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        _ARCH64=aarch64
1046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    else
1056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        echo "Unrecognized device ABI: $_ABI"
1066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        exit 1
1076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
1086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    eval $_outvar=\$_ARCH
1096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    eval $_outvar64=\$_ARCH64
1106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
1116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerwhile [[ $# > 0 ]]; do
1136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  case $1 in
1146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    --revert)
1156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      revert=yes
1166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      ;;
1176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    --extra-options)
1186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      shift
1196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      if [[ $# == 0 ]]; then
1206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        echo "--extra-options requires an argument."
1216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        exit 1
1226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      fi
1236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      extra_options="$1"
1246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      ;;
1256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    --lib)
1266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      shift
1276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      if [[ $# == 0 ]]; then
1286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        echo "--lib requires an argument."
1296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        exit 1
1306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      fi
1316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      lib="$1"
1326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      ;;
1336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    --device)
1346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      shift
1356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      if [[ $# == 0 ]]; then
1366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        echo "--device requires an argument."
1376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        exit 1
1386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      fi
1396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      device="$1"
1406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      ;;
1416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    --use-su)
1426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      use_su=1
1436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      ;;
1446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    *)
1456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      usage
1466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      ;;
1476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  esac
1486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  shift
1496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerdone
1506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerADB=${ADB:-adb}
1526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ x$device != x ]]; then
1536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ADB="$ADB -s $device"
1546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
1556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [ $use_su -eq 1 ]; then
1576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  # Test if 'su' is present on the device
1586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  SU_TEST_OUT=`$ADB shell su -c "echo foo" 2>&1 | sed 's/\r$//'`
1596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [ $? != 0 -o "$SU_TEST_OUT" != "foo" ]; then
1606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "ERROR: Cannot use 'su -c':"
1616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "$ adb shell su -c \"echo foo\""
1626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo $SU_TEST_OUT
1636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "Check that 'su' binary is correctly installed on the device or omit"
1646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo "            --use-su flag"
1656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    exit 1
1666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
1676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
1686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerecho '>> Remounting /system rw'
1706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickeradb_wait_for_device
1716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickeradb_root
1726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickeradb_wait_for_device
1736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickeradb_remount
1746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickeradb_wait_for_device
1756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerget_device_arch ARCH ARCH64
1776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerecho "Target architecture: $ARCH"
1786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerASAN_RT="libclang_rt.asan-$ARCH-android.so"
1796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -n $ARCH64 ]]; then
1806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  echo "Target architecture: $ARCH64"
1816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  ASAN_RT64="libclang_rt.asan-$ARCH64-android.so"
1826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
1836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ x$revert == xyes ]]; then
1856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Uninstalling ASan'
1866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
1876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if ! adb_shell ls -l /system/bin/app_process | grep -o '\->.*app_process' >&/dev/null; then
1886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      echo '>> Pre-L device detected.'
1896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell mv /system/bin/app_process.real /system/bin/app_process
1906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/asanwrapper
1916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    elif ! adb_shell ls -l /system/bin/app_process64.real | grep -o 'No such file or directory' >&/dev/null; then
1926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      # 64-bit installation.
1936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell mv /system/bin/app_process32.real /system/bin/app_process32
1946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell mv /system/bin/app_process64.real /system/bin/app_process64
1956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/asanwrapper
1966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/asanwrapper64
1976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    else
1986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      # 32-bit installation.
1996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/app_process.wrap
2006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/asanwrapper
2016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/app_process
2026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell ln -s /system/bin/app_process32 /system/bin/app_process
2036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
2046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Restarting shell'
2066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell stop
2076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell start
2086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # Remove the library on the last step to give a chance to the 'su' binary to
2106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # be executed without problem.
2116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell rm /system/lib/$ASAN_RT
2126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Done'
2146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    exit 0
2156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -d "$lib" ]]; then
2186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ASAN_RT_PATH="$lib"
2196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelif [[ -f "$lib" && "$lib" == *"$ASAN_RT" ]]; then
2206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ASAN_RT_PATH=$(dirname "$lib")
2216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelif [[ -f "$HERE/$ASAN_RT" ]]; then
2226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ASAN_RT_PATH="$HERE"
2236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelif [[ $(basename "$HERE") == "bin" ]]; then
2246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # We could be in the toolchain's base directory.
2256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # Consider ../lib, ../lib/asan, ../lib/linux,
2266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # ../lib/clang/$VERSION/lib/linux, and ../lib64/clang/$VERSION/lib/linux.
2276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    P=$(ls "$HERE"/../lib/"$ASAN_RT" \
2286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker           "$HERE"/../lib/asan/"$ASAN_RT" \
2296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker           "$HERE"/../lib/linux/"$ASAN_RT" \
2306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker           "$HERE"/../lib/clang/*/lib/linux/"$ASAN_RT" \
2316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker           "$HERE"/../lib64/clang/*/lib/linux/"$ASAN_RT" 2>/dev/null | sort | tail -1)
2326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if [[ -n "$P" ]]; then
2336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        ASAN_RT_PATH="$(dirname "$P")"
2346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
2356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT" ]]; then
2386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo ">> ASan runtime library not found"
2396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    exit 1
2406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -n "$ASAN_RT64" ]]; then
2436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT64" ]]; then
2446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo ">> ASan runtime library not found"
2456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    exit 1
2466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
2476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerTMPDIRBASE=$(mktemp -d)
2506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerTMPDIROLD="$TMPDIRBASE/old"
2516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerTMPDIR="$TMPDIRBASE/new"
2526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickermkdir "$TMPDIROLD"
2536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerRELEASE=$(adb_shell getprop ro.build.version.release)
2556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerPRE_L=0
2566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif echo "$RELEASE" | grep '^4\.' >&/dev/null; then
2576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    PRE_L=1
2586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif ! adb_shell ls -l /system/bin/app_process | grep -o '\->.*app_process' >&/dev/null; then
2616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if adb_pull /system/bin/app_process.real /dev/null >&/dev/null; then
2636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        echo '>> Old-style ASan installation detected. Reverting.'
2646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        adb_shell mv /system/bin/app_process.real /system/bin/app_process
2656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
2666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Pre-L device detected. Setting up app_process symlink.'
2686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell mv /system/bin/app_process /system/bin/app_process32
2696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell ln -s /system/bin/app_process32 /system/bin/app_process
2706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerecho '>> Copying files from the device'
2736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -n "$ASAN_RT64" ]]; then
2746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/lib/"$ASAN_RT" "$TMPDIROLD" || true
2756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/lib64/"$ASAN_RT64" "$TMPDIROLD" || true
2766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/app_process32 "$TMPDIROLD" || true
2776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/app_process32.real "$TMPDIROLD" || true
2786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/app_process64 "$TMPDIROLD" || true
2796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/app_process64.real "$TMPDIROLD" || true
2806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/asanwrapper "$TMPDIROLD" || true
2816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/asanwrapper64 "$TMPDIROLD" || true
2826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelse
2836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/lib/"$ASAN_RT" "$TMPDIROLD" || true
2846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/app_process32 "$TMPDIROLD" || true
2856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/app_process.wrap "$TMPDIROLD" || true
2866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_pull /system/bin/asanwrapper "$TMPDIROLD" || true
2876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickercp -r "$TMPDIROLD" "$TMPDIR"
2896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -f "$TMPDIR/app_process.wrap" || -f "$TMPDIR/app_process64.real" ]]; then
2916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo ">> Previous installation detected"
2926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelse
2936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo ">> New installation"
2946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
2956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerecho '>> Generating wrappers'
2976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
2986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickercp "$ASAN_RT_PATH/$ASAN_RT" "$TMPDIR/"
2996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -n "$ASAN_RT64" ]]; then
3006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  cp "$ASAN_RT_PATH/$ASAN_RT64" "$TMPDIR/"
3016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
3026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerASAN_OPTIONS=start_deactivated=1,malloc_context_size=0
3046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction generate_zygote_wrapper { # from, to, asan_rt
3066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _from=$1
3076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _to=$2
3086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _asan_rt=$3
3096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [[ PRE_L -eq 0 ]]; then
3106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # LD_PRELOAD parsing is broken in N if it starts with ":". Luckily, it is
3116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # unset in the system environment since L.
3126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _ld_preload=$_asan_rt
3136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  else
3146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    local _ld_preload=\$LD_PRELOAD:$_asan_rt
3156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
3166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  cat <<EOF >"$TMPDIR/$_from"
3176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#!/system/bin/sh-from-zygote
3186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerASAN_OPTIONS=$ASAN_OPTIONS \\
3196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerASAN_ACTIVATION_OPTIONS=include_if_exists=/data/local/tmp/asan.options.%b \\
3206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerLD_PRELOAD=$_ld_preload \\
3216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerexec $_to \$@
3226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerEOF
3246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
3256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# On Android-L not allowing user segv handler breaks some applications.
3276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ PRE_L -eq 0 ]]; then
3286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ASAN_OPTIONS="$ASAN_OPTIONS,allow_user_segv_handler=1"
3296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
3306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ x$extra_options != x ]] ; then
3326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ASAN_OPTIONS="$ASAN_OPTIONS,$extra_options"
3336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
3346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# Zygote wrapper.
3366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -f "$TMPDIR/app_process64" ]]; then
3376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  # A 64-bit device.
3386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [[ ! -f "$TMPDIR/app_process64.real" ]]; then
3396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # New installation.
3406bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    mv "$TMPDIR/app_process32" "$TMPDIR/app_process32.real"
3416bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    mv "$TMPDIR/app_process64" "$TMPDIR/app_process64.real"
3426bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
3436bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  generate_zygote_wrapper "app_process32" "/system/bin/app_process32.real" "$ASAN_RT"
3446bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  generate_zygote_wrapper "app_process64" "/system/bin/app_process64.real" "$ASAN_RT64"
3456bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelse
3466bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  # A 32-bit device.
3476bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  generate_zygote_wrapper "app_process.wrap" "/system/bin/app_process32" "$ASAN_RT"
3486bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
3496bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3506bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# General command-line tool wrapper (use for anything that's not started as
3516bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker# zygote).
3526bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickercat <<EOF >"$TMPDIR/asanwrapper"
3536bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#!/system/bin/sh
3546bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerLD_PRELOAD=$ASAN_RT \\
3556bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerexec \$@
3566bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3576bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerEOF
3586bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3596bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif [[ -n "$ASAN_RT64" ]]; then
3606bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  cat <<EOF >"$TMPDIR/asanwrapper64"
3616bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker#!/system/bin/sh
3626bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerLD_PRELOAD=$ASAN_RT64 \\
3636bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerexec \$@
3646bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3656bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerEOF
3666bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
3676bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3686bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfunction install { # from, to, chmod, chcon
3696bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _from=$1
3706bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _to=$2
3716bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _mode=$3
3726bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _context=$4
3736bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  local _basename="$(basename "$_from")"
3746bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  echo "Installing $_to/$_basename $_mode $_context"
3756bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_push "$_from" "$_to/$_basename"
3766bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  adb_shell chown root.shell "$_to/$_basename"
3776bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [[ -n "$_mode" ]]; then
3786bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell chmod "$_mode" "$_to/$_basename"
3796bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
3806bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  if [[ -n "$_context" ]]; then
3816bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell chcon "$_context" "$_to/$_basename"
3826bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker  fi
3836bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker}
3846bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3856bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerif ! ( cd "$TMPDIRBASE" && diff -qr old/ new/ ) ; then
3866bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # Make SELinux happy by keeping app_process wrapper and the shell
3876bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    # it runs on in zygote domain.
3886bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    ENFORCING=0
3896bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if adb_shell getenforce | grep Enforcing >/dev/null; then
3906bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        # Sometimes shell is not allowed to change file contexts.
3916bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        # Temporarily switch to permissive.
3926bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        ENFORCING=1
3936bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        adb_shell setenforce 0
3946bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
3956bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
3966bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if [[ PRE_L -eq 1 ]]; then
3976bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        CTX=u:object_r:system_file:s0
3986bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    else
3996bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        CTX=u:object_r:zygote_exec:s0
4006bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
4016bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4026bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Pushing files to the device'
4036bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4046bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if [[ -n "$ASAN_RT64" ]]; then
4056bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/$ASAN_RT" /system/lib 644
4066bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/$ASAN_RT64" /system/lib64 644
4076bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/app_process32" /system/bin 755 $CTX
4086bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/app_process32.real" /system/bin 755 $CTX
4096bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/app_process64" /system/bin 755 $CTX
4106bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/app_process64.real" /system/bin 755 $CTX
4116bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/asanwrapper" /system/bin 755
4126bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/asanwrapper64" /system/bin 755
4136bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    else
4146bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/$ASAN_RT" /system/lib 644
4156bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/app_process32" /system/bin 755 $CTX
4166bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/app_process.wrap" /system/bin 755 $CTX
4176bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      install "$TMPDIR/asanwrapper" /system/bin 755 $CTX
4186bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4196bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell rm /system/bin/app_process
4206bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker      adb_shell ln -s /system/bin/app_process.wrap /system/bin/app_process
4216bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
4226bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4236bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell cp /system/bin/sh /system/bin/sh-from-zygote
4246bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell chcon $CTX /system/bin/sh-from-zygote
4256bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4266bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    if [ $ENFORCING == 1 ]; then
4276bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker        adb_shell setenforce 1
4286bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    fi
4296bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4306bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Restarting shell (asynchronous)'
4316bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell stop
4326bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    adb_shell start
4336bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4346bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Please wait until the device restarts'
4356bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerelse
4366bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker    echo '>> Device is up to date'
4376bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerfi
4386bdbd720989797e8a53237ef3ef213c4114f869gitbuildkicker
4396bdbd720989797e8a53237ef3ef213c4114f869gitbuildkickerrm -r "$TMPDIRBASE"
440