| OLD | NEW | 
|    1 #!/bin/bash |    1 #!/bin/bash | 
|    2 # |    2 # | 
|    3 # android_perf: utility for running perf on an android device |    3 # android_perf: utility for running perf on an android device | 
|    4 #  |    4 #  | 
|    5 # The basic usage sequence is to run... |    5 # The basic usage sequence is to run... | 
|    6 #  1) perf record [gm/tests/bench] # runs profiler on specified app |    6 #  1) perf record [gm/tests/bench] # runs profiler on specified app | 
|    7 #  2) perf report # prints profiler results |    7 #  2) perf report # prints profiler results | 
|    8 #  3) perf clean # cleans the temporary directory used to store results |    8 #  3) perf clean # cleans the temporary directory used to store results | 
|    9 # |    9 # | 
|   10  |   10  | 
|   11 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |   11 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" | 
|   12 PERF_CMD=$1 |   12 source $SCRIPT_DIR/android_setup.sh | 
|   13  |  | 
|   14 source $SCRIPT_DIR/utils/setup_adb.sh |   13 source $SCRIPT_DIR/utils/setup_adb.sh | 
|   15  |   14  | 
|   16 if [ $(uname) == "Linux" ]; then |   15 if [ $(uname) == "Linux" ]; then | 
|   17     PERFHOST=$SCRIPT_DIR/linux/perfhost |   16     PERFHOST=$SCRIPT_DIR/linux/perfhost | 
|   18 elif [ $(uname) == "Darwin" ]; then |   17 elif [ $(uname) == "Darwin" ]; then | 
|   19     PERFHOST=$SCRIPT_DIR/mac/perfhost |   18     PERFHOST=$SCRIPT_DIR/mac/perfhost | 
|   20 else |   19 else | 
|   21     echo "Could not automatically determine OS!" |   20     echo "Could not automatically determine OS!" | 
|   22     exit 1; |   21     exit 1; | 
|   23 fi |   22 fi | 
|   24  |   23  | 
 |   24 # grab and remove the perf command from the input args | 
 |   25 PERF_CMD=${APP_ARGS[0]} | 
 |   26 unset APP_ARGS[0] | 
 |   27  | 
 |   28 configuration="Debug" | 
 |   29  | 
 |   30 for arg in ${APP_ARGS[@]} | 
 |   31 do | 
 |   32   if [[ "${arg}" == "--release" ]]; | 
 |   33   then  | 
 |   34     configuration="Release" | 
 |   35   else | 
 |   36     echo "${arg}" | 
 |   37     runVars=("${runVars[@]}" "${arg}") | 
 |   38   fi | 
 |   39  | 
 |   40 shift | 
 |   41 done | 
 |   42  | 
|   25 # We need the debug symbols from these files |   43 # We need the debug symbols from these files | 
|   26 PERF_TMP_DIR=$(pwd)/android_perf_tmp |   44 PERF_TMP_DIR=$(pwd)/android_perf_tmp | 
|   27  |   45  | 
|   28 TMP_SYS_BIN=$PERF_TMP_DIR/system/bin |   46 TMP_SYS_BIN=$PERF_TMP_DIR/system/bin | 
|   29 TMP_SYS_LIB=$PERF_TMP_DIR/system/lib |   47 TMP_SYS_LIB=$PERF_TMP_DIR/system/lib | 
|   30 TMP_APP_LIB=$PERF_TMP_DIR/data/data/com.skia/lib |   48 TMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp | 
|   31  |   49  | 
|   32 perf_setup() { |   50 perf_setup() { | 
|   33  |   51  | 
|   34     mkdir -p $TMP_SYS_BIN |   52     mkdir -p $TMP_SYS_BIN | 
|   35     mkdir -p $TMP_SYS_LIB |   53     mkdir -p $TMP_SYS_LIB | 
|   36     mkdir -p $TMP_APP_LIB |   54     mkdir -p $TMP_APP_LOC | 
|   37  |   55  | 
|   38     # setup symlinks to account for perf potentially looking elsewhere |  | 
|   39     mkdir -p $PERF_TMP_DIR/data/app-lib |  | 
|   40     $( cd $PERF_TMP_DIR/data/app-lib && ln -s ../data/com.skia/lib com.skia-1) |  | 
|   41     $( cd $PERF_TMP_DIR/data/app-lib && ln -s ../data/com.skia/lib com.skia-2) |  | 
|   42      |  | 
|   43     echo "Copying symbol files" |   56     echo "Copying symbol files" | 
|   44     $ADB pull /system/bin/skia_launcher $TMP_SYS_BIN |   57     adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB | 
|   45     $ADB pull /system/lib/libc.so $TMP_SYS_LIB |   58     adb_pull_if_needed /system/lib/libstlport.so $TMP_SYS_LIB | 
|   46     $ADB pull /system/lib/libstlport.so $TMP_SYS_LIB |   59     adb_pull_if_needed /system/lib/libcutils.so $TMP_SYS_LIB | 
|   47     $ADB pull /system/lib/libcutils.so $TMP_SYS_LIB |   60     adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB | 
|   48     $ADB pull /system/lib/libGLESv2.so $TMP_SYS_LIB |   61     adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB | 
|   49     $ADB pull /system/lib/libandroid.so $TMP_SYS_LIB |   62     adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB | 
|   50     $ADB pull /system/lib/libm.so $TMP_SYS_LIB |   63     adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB | 
|   51     $ADB pull /system/lib/libz.so $TMP_SYS_LIB |   64  | 
|   52      |   65     if [ ! -f "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" ]; | 
|   53     if [ $# -ge 2 ] |  | 
|   54     then |   66     then | 
|   55         APP_NAME=$(basename $2) |   67       echo "Unable to find the ${runVars[0]} library" | 
|   56         $ADB pull /data/data/com.skia/lib/lib${APP_NAME}.so $TMP_APP_LIB |   68       exit 1 | 
|   57     else  |  | 
|   58         $ADB pull /data/data/com.skia/lib/ $TMP_APP_LIB |  | 
|   59     fi |   69     fi | 
|   60      |  | 
|   61  |   70  | 
 |   71     echo "Pushing app..." | 
 |   72     adb_push_if_needed "${SKIA_OUT}/${configuration}/skia_launcher" /data/local/
     tmp | 
 |   73     adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/libskia_android.
     so" /data/local/tmp | 
 |   74     adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}
     .so" /data/local/tmp | 
 |   75  | 
 |   76     cp "${SKIA_OUT}/${configuration}/skia_launcher" $TMP_APP_LOC | 
 |   77     cp "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" $TMP_APP_LOC | 
 |   78     cp "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" $TMP_APP_LO
     C | 
|   62 } |   79 } | 
|   63  |   80  | 
|   64 perf_record() { |   81 perf_record() { | 
|   65  |   82  | 
|   66     APP_NAME=$(basename $2) |  | 
|   67     # Collect extra arguments to be passed to the skia_launcher binary |  | 
|   68     shift # perf_cmd |  | 
|   69     shift # app_name |  | 
|   70     while (( "$#" )); do |  | 
|   71       APP_ARGS="$APP_ARGS $1" |  | 
|   72       shift |  | 
|   73     done |  | 
|   74  |  | 
|   75     echo "Checking for skia_launcher app..." |  | 
|   76     if [ ! -f $TMP_SYS_BIN/skia_launcher ] |  | 
|   77     then |  | 
|   78         echo "Unable to find the skia_launcher on the device" |  | 
|   79         rm -rf $PERF_TMP_DIR |  | 
|   80         exit 1; |  | 
|   81     fi |  | 
|   82      |  | 
|   83     echo "Checking for $APP_NAME library..." |  | 
|   84     if [ ! -f $TMP_APP_LIB/lib$APP_NAME.so ] |  | 
|   85     then |  | 
|   86         echo "Unable to find the app's shared library on the device" |  | 
|   87         rm -rf $PERF_TMP_DIR |  | 
|   88         exit 1; |  | 
|   89     fi |  | 
|   90      |  | 
|   91     echo "Killing any running Skia processes." |   83     echo "Killing any running Skia processes." | 
|   92     $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kil
     l |   84     $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kil
     l | 
|   93  |   85  | 
|   94     echo "Starting application" |   86     echo "Starting application" | 
|   95     $ADB shell skia_launcher $APP_NAME $APP_ARGS & |   87     $ADB shell /data/local/tmp/skia_launcher ${runVars[@]} & | 
|   96  |   88  | 
|   97     # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO |   89     # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO | 
|   98     # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNAB
     LE |   90     # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNAB
     LE | 
|   99     # TO BE READ BY THE REPORTING TOOL |   91     # TO BE READ BY THE REPORTING TOOL | 
|  100     echo "Starting profiler" |   92     echo "Starting profiler" | 
|  101     APP_PID=$($ADB shell ps | grep skia_launcher | awk '{print $2}') |   93     APP_PID=$($ADB shell ps | grep skia_launcher | awk '{print $2}') | 
|  102     $ADB shell perf record -p ${APP_PID} sleep 70 |   94     $ADB shell perf record -p ${APP_PID} sleep 70 | 
|  103  |   95  | 
|  104     $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data |   96     $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data | 
|  105  |   97  | 
|  106     exit 0; |   98     exit 0; | 
|  107 } |   99 } | 
|  108  |  100  | 
|  109 perf_report() { |  101 perf_report() { | 
|  110     # Collect extra arguments to be passed to the perfhost binary |  102     adb_pull_if_needed /data/perf.data $PERF_TMP_DIR/perf.data | 
|  111     while (( "$#" )); do |  103     $PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[
     @]} | 
|  112       APP_ARGS="$APP_ARGS $1" |  | 
|  113       shift |  | 
|  114     done |  | 
|  115      |  | 
|  116     $PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR $APP_ARGS |  | 
|  117 } |  104 } | 
|  118  |  105  | 
|  119 # Clean up |  106 # Clean up | 
|  120 perf_clean() { |  107 perf_clean() { | 
|  121     rm -rf $PERF_TMP_DIR |  108     rm -rf $PERF_TMP_DIR | 
|  122 } |  109 } | 
|  123  |  110  | 
|  124 case $PERF_CMD in |  111 case $PERF_CMD in | 
|  125   setup) |  112   setup) | 
|  126       perf_setup $@ |  113       perf_setup ${runVars[@]} | 
|  127       ;; |  114       ;; | 
|  128   record) |  115   record) | 
|  129       perf_setup $@ |  116       perf_setup ${runVars[@]} | 
|  130       perf_record $@ |  117       perf_record ${runVars[@]} | 
|  131       ;; |  118       ;; | 
|  132   report) |  119   report) | 
|  133       perf_report |  120       perf_report | 
|  134       ;; |  121       ;; | 
|  135   clean) |  122   clean) | 
|  136       perf_clean |  123       perf_clean | 
|  137       ;; |  124       ;; | 
|  138     *) |  125     *) | 
|  139       echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: " |  126       echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: " | 
|  140       echo "setup, record, report, clean" |  127       echo "setup, record, report, clean" | 
|  141       exit 1; |  128       exit 1; | 
|  142       ;; |  129       ;; | 
|  143 esac |  130 esac | 
|  144  |  131  | 
|  145 exit 0; |  132 exit 0; | 
| OLD | NEW |