| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #!/usr/bin/bash
- HVIGORWPATH=`which hvigorw 2>/dev/null`
- if [ "x$HVIGORWPATH" == "x" ]; then
- echo "Couldn't find hvigorw!"
- echo "Please make sure the HarmonyOS command line tools are in your PATH." 1>&2
- exit 1
- fi
- HDCPATH=`which hdc 2>/dev/null`
- if [ "x$HDCPATH" == "x" ]; then
- echo "Couldn't find hdc!"
- echo "Please make sure the HarmonyOS command line tools are in your PATH." 1>&2
- exit 1
- fi
- CLTBINPATH=`dirname "$HVIGORWPATH"`
- CLTPATH=`dirname "$CLTBINPATH"`
- CLT=`realpath "$CLTPATH"`
- #echo "CLT is '$CLT'"
- need_usage=0
- APPJSON=""
- PROJDIR="$1"
- if [ "x$PROJDIR" == "x" ]; then
- need_usage=1
- else
- PROJDIR=`realpath "$PROJDIR"`
- APPJSON="$PROJDIR/AppScope/app.json5"
- if [ ! -f "$APPJSON" ]; then
- echo "Can't find '$APPJSON'. Is project directory correct?" 1>&2
- echo "" 1>&2
- need_usage=1
- fi
- fi
- do_clean=0
- do_build=0
- do_uninstall=0
- do_install=0
- do_kill=0
- do_launch=0
- do_log=0
- do_debug=0
- do_anything=0
- shift # dump projectdir
- while [ $# -gt 0 ]; do
- do_anything=1
- case $1 in
- --clean)
- do_clean=1
- shift
- ;;
- --build)
- do_build=1
- shift
- ;;
- --install)
- do_install=1
- shift
- ;;
- --uninstall)
- do_uninstall=1
- shift
- ;;
- --kill)
- do_kill=1
- shift
- ;;
- --launch)
- do_launch=1
- shift
- ;;
- --log)
- do_log=1
- shift
- ;;
- --debug)
- do_launch=1
- do_debug=1
- shift
- ;;
- *)
- echo "Unknown option '$1'" 1>&2
- need_usage=1
- shift
- ;;
- esac
- done
- if [ "$do_anything" == "0" ]; then
- need_usage=1
- fi
- if [ "$need_usage" == "1" ]; then
- echo "USAGE: $0 <project_dir> [--kill] [--uninstall] [--build] [--install] [--launch] [--debug] [--log]" 1>&2
- echo "" 1>&2
- exit 1
- fi
- if [ "$do_build" == "1" ]; then
- if [ "$do_debug" == "1" ]; then
- do_install=1
- elif [ "$do_launch" == "1" ]; then
- do_install=1
- fi
- fi
- # Here we go!
- BUNDLE=`grep -F bundleName "$PROJDIR/AppScope/app.json5" |perl -w -p -e 's/\A\s*\"bundleName\"\s*\:\s*\"(.*?)\".*?\Z/$1/i;'`
- if [ "x$BUNDLE" == "x" ]; then
- echo "Failed to determine bundle name! Aborting!" 1>&2
- exit 1
- fi
- echo "BUNDLE is '$BUNDLE'"
- #set -x
- cd "$PROJDIR"
- if [ "$do_kill" == "1" ]; then
- echo "KILLING..."
- hdc shell aa force-stop $BUNDLE || exit 1
- fi
- if [ "$do_uninstall" == "1" ]; then
- echo "UNINSTALLING..."
- hdc uninstall $BUNDLE || exit 1
- fi
- if [ "$do_clean" == "1" ]; then
- echo "CLEANING..."
- hvigorw clean || exit 1
- fi
- if [ "$do_build" == "1" ]; then
- echo "BUILDING..."
- hvigorw assembleHap || exit 1
- fi
- if [ "$do_debug" == "1" ]; then
- hdc shell mkdir -p data/local/tmp/debugserver/$BUNDLE
- hdc file send "$CLT/sdk/default/hms/native/lldb/aarch64-linux-ohos/lldb-server" data/local/tmp/debugserver/$BUNDLE
- hdc shell chmod 755 data/local/tmp/debugserver/$BUNDLE/lldb-server
- fi
- if [ "$do_install" == "1" ]; then
- echo "INSTALLING..."
- hdc install "$PROJDIR/entry/build/default/outputs/default/entry-default-signed.hap" || exit 1
- fi
- # Catch sigint, kill the backgrounded `hdc hilog` then exit.
- trap_sigint() {
- if [ "$HILOGPID" != "" ]; then
- kill -9 "$HILOGPID"
- fi
- wait "$HILOGPID" 2>/dev/null
- echo ""
- #echo "Killed $HILOGPID"
- exit 0
- }
- HILOGPID=""
- if [ "$do_log" == "1" ]; then
- trap trap_sigint INT
- # This wild bash syntax puts `hdc` in the background, and pipes its output through `grep`, but `$!` will have hdc's process ID.
- # The ridiculous perl regular expression basically filters out a ton of garbage from each line of the log. You can remove it entirely and just grep for the bundle name, though!
- hdc hilog > >(grep -F --line-buffered "/$BUNDLE/" |perl -w -p -e 's/\A\d+\-\d+\s+(\d+\:\d+\:\d+)\.\d+\s+\d+\s+\d+\s+(.)\s+.*?\/.*?\/(.*?)\:\s+/$1 $2 $3: /;') & HILOGPID="$!"
- fi
- if [ "$do_launch" == "1" ]; then
- echo "LAUNCHING..."
- # !!! FIXME: maybe this makes the process wait on launch until debugger is attached?
- #hdc shell aa appdebug -b $BUNDLE
- hdc shell aa start -a EntryAbility -b $BUNDLE || exit 1
- fi
- if [ "$do_debug" == "1" ]; then
- echo "DEBUGGING..."
- hdc shell aa attach -b $BUNDLE
- hdc shell aa process -a EntryAbility -b $BUNDLE -D "/data/local/tmp/debugserver/$BUNDLE/lldb-server platform --listen unix-abstract:///lldb-server/platform.sock"
- PID=`hdc shell ps -w -o PID,ARGS |grep -F "$BUNDLE" |head -n 1 |awk '{print $1}'`
- if [ "x$PID" == "x" ]; then
- echo "Failed to determine PID! Aborting!" 1>&2
- exit 1
- fi
- echo "PID is $PID"
- trap - INT
- "$CLT/sdk/default/openharmony/native/llvm/bin/lldb" \
- -O "platform select remote-ohos" \
- -O "platform connect unix-abstract-connect:///lldb-server/platform.sock" \
- -O "settings append target.exec-search-paths \"$PROJDIR/entry/build/default/intermediates/cmake/default/obj/arm64-v8a\"" \
- -O "attach $PID"
- trap trap_sigint INT
- fi
- if [ "$HILOGPID" != "" ]; then
- #echo "$0: WAITING ON $HILOGPID"
- wait "$HILOGPID"
- fi
|