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