1cb93a386Sopenharmony_ci#!/bin/bash 2cb93a386Sopenharmony_ci# 3cb93a386Sopenharmony_ci# android_perf: utility for running perf on an android device 4cb93a386Sopenharmony_ci# 5cb93a386Sopenharmony_ci# The basic usage sequence is to run... 6cb93a386Sopenharmony_ci# 1) perf record [gm/tests/bench] # runs profiler on specified app 7cb93a386Sopenharmony_ci# 2) perf report # prints profiler results 8cb93a386Sopenharmony_ci# 3) perf clean # cleans the temporary directory used to store results 9cb93a386Sopenharmony_ci# 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ciSCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 12cb93a386Sopenharmony_cisource $SCRIPT_DIR/utils/android_setup.sh 13cb93a386Sopenharmony_cisource $SCRIPT_DIR/utils/setup_adb.sh 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci# grab and remove the perf command from the input args 16cb93a386Sopenharmony_ciPERF_CMD=${APP_ARGS[0]} 17cb93a386Sopenharmony_ciunset APP_ARGS[0] 18cb93a386Sopenharmony_cirunVars=("${APP_ARGS[@]}") # shift array indices 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci# We need the debug symbols from these files 21cb93a386Sopenharmony_ciPERF_TMP_DIR=$(pwd)/android_perf_tmp 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ciTMP_SYS_BIN=$PERF_TMP_DIR/system/bin 24cb93a386Sopenharmony_ciTMP_SYS_LIB=$PERF_TMP_DIR/system/lib 25cb93a386Sopenharmony_ciTMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciperf_setup() { 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci mkdir -p $TMP_SYS_BIN 30cb93a386Sopenharmony_ci mkdir -p $TMP_SYS_LIB 31cb93a386Sopenharmony_ci mkdir -p $TMP_APP_LOC 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci echo "Copying symbol files" 34cb93a386Sopenharmony_ci adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB 35cb93a386Sopenharmony_ci adb_pull_if_needed /system/lib/libstdc++.so $TMP_SYS_LIB 36cb93a386Sopenharmony_ci adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB 37cb93a386Sopenharmony_ci adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB 38cb93a386Sopenharmony_ci adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB 39cb93a386Sopenharmony_ci adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci # SKIA_OUT variable is set by android_setup.sh 42cb93a386Sopenharmony_ci if [ ! -f "${SKIA_OUT}/${runVars[0]}" ]; 43cb93a386Sopenharmony_ci then 44cb93a386Sopenharmony_ci echo "Unable to find the ${runVars[0]} executable" 45cb93a386Sopenharmony_ci exit 1 46cb93a386Sopenharmony_ci fi 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci echo "Pushing simpleperf..." 49cb93a386Sopenharmony_ci adb_push_if_needed $SKIA_OUT/simpleperf /data/local/tmp 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci echo "Pushing app..." 52cb93a386Sopenharmony_ci adb_push_if_needed "${SKIA_OUT}/${runVars[0]}" /data/local/tmp 53cb93a386Sopenharmony_ci cp "${SKIA_OUT}/${runVars[0]}" $TMP_APP_LOC 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ciperf_record() { 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci echo "Killing any running Skia processes." 59cb93a386Sopenharmony_ci $ADB shell ps | grep ${runVars[0]} | awk '{print $2}' | xargs $ADB shell kill 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci echo "Starting application" 62cb93a386Sopenharmony_ci $ADB shell /data/local/tmp/${runVars[@]} & 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO 65cb93a386Sopenharmony_ci # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE 66cb93a386Sopenharmony_ci # TO BE READ BY THE REPORTING TOOL 67cb93a386Sopenharmony_ci echo "Starting profiler" 68cb93a386Sopenharmony_ci APP_PID=$($ADB shell ps | grep ${runVars[0]} | awk '{print $2}') 69cb93a386Sopenharmony_ci $ADB shell /data/local/tmp/simpleperf record -p ${APP_PID} -o /data/local/tmp/perf.data sleep 70 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci $ADB pull /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci exit 0; 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ciperf_report() { 77cb93a386Sopenharmony_ci adb_pull_if_needed /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data 78cb93a386Sopenharmony_ci $SKIA_OUT/perfhost_report.py -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]} 79cb93a386Sopenharmony_ci} 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci# Clean up 82cb93a386Sopenharmony_ciperf_clean() { 83cb93a386Sopenharmony_ci rm -rf $PERF_TMP_DIR 84cb93a386Sopenharmony_ci} 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_cicase $PERF_CMD in 87cb93a386Sopenharmony_ci setup) 88cb93a386Sopenharmony_ci perf_setup ${runVars[@]} 89cb93a386Sopenharmony_ci ;; 90cb93a386Sopenharmony_ci record) 91cb93a386Sopenharmony_ci perf_setup ${runVars[@]} 92cb93a386Sopenharmony_ci perf_record ${runVars[@]} 93cb93a386Sopenharmony_ci ;; 94cb93a386Sopenharmony_ci report) 95cb93a386Sopenharmony_ci perf_report 96cb93a386Sopenharmony_ci ;; 97cb93a386Sopenharmony_ci clean) 98cb93a386Sopenharmony_ci perf_clean 99cb93a386Sopenharmony_ci ;; 100cb93a386Sopenharmony_ci *) 101cb93a386Sopenharmony_ci echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: " 102cb93a386Sopenharmony_ci echo "setup, record, report, clean" 103cb93a386Sopenharmony_ci exit 1; 104cb93a386Sopenharmony_ci ;; 105cb93a386Sopenharmony_ciesac 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ciexit 0; 108