#!/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 [--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