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