1 #!/usr/bin/env bash 2 3 # Copyright 2010 The Go Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style 5 # license that can be found in the LICENSE file. 6 7 # This is a small script for executing go binaries on the android platform. 8 # 9 # example: 10 # ./a 5.out foo bar baz 11 # 12 # The script exports the local values of GOARCH, GOTRACEBACK and GOGC 13 # to the android environment. 14 # 15 # Known issues: 16 # The script fails unless the last character output by the program is "\n" 17 # 18 # TODO(kaib): add gdb bridge support 19 20 exp () 21 { 22 if [ ${!1} ]; then 23 echo "export $1=\"${!1}\"; " 24 fi 25 } 26 27 # adb does not correctly return the exit value of the executed program. use this 28 # wrapper to manually extract the exit value 29 rloc=/data/local/tmp/retval 30 rsize=$(adb shell "ls -l $rloc"|tr -s ' '|cut -d' ' -f4) 31 rcheck=38 32 if [ "$rsize" != "$rcheck" ]; then 33 # echo "debug: retval size incorrect want $rcheck, got $rsize. uploading" 34 echo >/tmp/adb.retval '#!/system/bin/sh 35 "$@" 36 echo RETVAL: $?' 37 adb push /tmp/adb.retval $rloc >/dev/null 2>&1 38 adb shell chmod 755 $rloc 39 fi 40 41 # run the main binary 42 if [ "-g" == "$1" ]; then 43 adb forward tcp:$2 tcp:$2 44 args=$(echo $*| cut -d' ' -f4-) 45 adb push $3 /data/local/tmp/$3 >/dev/null 2>&1 46 adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \ 47 gdbserver :$2 /data/local/tmp/retval /data/local/tmp/$3 $args" \ 48 2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL 49 else 50 if [ "$*" != "$1" ]; then 51 args=$(echo $*| cut -d' ' -f2-) 52 fi 53 adb push $1 /data/local/tmp/$1 >/dev/null 2>&1 54 adb shell "$(exp GOARCH) $(exp GOTRACEBACK) $(exp GOGC) \ 55 /data/local/tmp/retval /data/local/tmp/$1 $args" \ 56 2>&1|tr -d '\r' |tee /tmp/adb.out|grep -v RETVAL 57 fi 58 exit $(grep RETVAL /tmp/adb.out|tr -d '\n\r'| cut -d' ' -f2) 59