1*6fa2df46SAndroid Build Coastguard Worker#!/bin/bash 2*6fa2df46SAndroid Build Coastguard Worker# 3*6fa2df46SAndroid Build Coastguard Worker# Copyright (C) 2024 The Android Open Source Project 4*6fa2df46SAndroid Build Coastguard Worker# 5*6fa2df46SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*6fa2df46SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*6fa2df46SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*6fa2df46SAndroid Build Coastguard Worker# 9*6fa2df46SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*6fa2df46SAndroid Build Coastguard Worker# 11*6fa2df46SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*6fa2df46SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*6fa2df46SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*6fa2df46SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*6fa2df46SAndroid Build Coastguard Worker# limitations under the License. 16*6fa2df46SAndroid Build Coastguard Worker 17*6fa2df46SAndroid Build Coastguard Workerset -e 18*6fa2df46SAndroid Build Coastguard Worker 19*6fa2df46SAndroid Build Coastguard Workerunset TRACE_FILE 20*6fa2df46SAndroid Build Coastguard Workerunset QUERY_FILE 21*6fa2df46SAndroid Build Coastguard Workerunset WORKLOAD 22*6fa2df46SAndroid Build Coastguard Workerunset SET_ROOT 23*6fa2df46SAndroid Build Coastguard Workerunset PERFETTO_CONFIG_FILE 24*6fa2df46SAndroid Build Coastguard Workerunset PERFETTO_PID 25*6fa2df46SAndroid Build Coastguard Workerunset SERIAL 26*6fa2df46SAndroid Build Coastguard Worker 27*6fa2df46SAndroid Build Coastguard Worker 28*6fa2df46SAndroid Build Coastguard Workerfunction help { 29*6fa2df46SAndroid Build Coastguard Worker echo "Usage: $0 [OPTION]..." 30*6fa2df46SAndroid Build Coastguard Worker echo "Options: " 31*6fa2df46SAndroid Build Coastguard Worker echo " -h, --help Print this message" 32*6fa2df46SAndroid Build Coastguard Worker echo " -r, --root Switch the target device to root" 33*6fa2df46SAndroid Build Coastguard Worker echo " -c, --config PERFETTO_CONFIG Path to file containing the Perfetto" 34*6fa2df46SAndroid Build Coastguard Worker echo " configuration" 35*6fa2df46SAndroid Build Coastguard Worker echo " -q, --query QUERY Path to file containing the SQL query to run on" 36*6fa2df46SAndroid Build Coastguard Worker echo " the Perfetto trace with trace_processor" 37*6fa2df46SAndroid Build Coastguard Worker echo " -t, --trace TRACE Path to which the Perfetto trace will be written to" 38*6fa2df46SAndroid Build Coastguard Worker echo " -w, --workload WORKLOAD Benchmark to run Dittobench with" 39*6fa2df46SAndroid Build Coastguard Worker echo " -s, --serial SERIAL Serial address for ADB" 40*6fa2df46SAndroid Build Coastguard Worker} 41*6fa2df46SAndroid Build Coastguard Worker 42*6fa2df46SAndroid Build Coastguard Worker 43*6fa2df46SAndroid Build Coastguard Workerwhile [ "$#" -gt "0" ]; do 44*6fa2df46SAndroid Build Coastguard Worker case $1 in 45*6fa2df46SAndroid Build Coastguard Worker -w|--workload) 46*6fa2df46SAndroid Build Coastguard Worker WORKLOAD="$2" 47*6fa2df46SAndroid Build Coastguard Worker shift 48*6fa2df46SAndroid Build Coastguard Worker shift 49*6fa2df46SAndroid Build Coastguard Worker ;; 50*6fa2df46SAndroid Build Coastguard Worker -q|--query) 51*6fa2df46SAndroid Build Coastguard Worker QUERY_FILE="$2" 52*6fa2df46SAndroid Build Coastguard Worker shift 53*6fa2df46SAndroid Build Coastguard Worker shift 54*6fa2df46SAndroid Build Coastguard Worker ;; 55*6fa2df46SAndroid Build Coastguard Worker -t|--trace) 56*6fa2df46SAndroid Build Coastguard Worker TRACE_FILE="$2" 57*6fa2df46SAndroid Build Coastguard Worker shift 58*6fa2df46SAndroid Build Coastguard Worker shift 59*6fa2df46SAndroid Build Coastguard Worker ;; 60*6fa2df46SAndroid Build Coastguard Worker -c|--config) 61*6fa2df46SAndroid Build Coastguard Worker PERFETTO_CONFIG_FILE="$2" 62*6fa2df46SAndroid Build Coastguard Worker shift 63*6fa2df46SAndroid Build Coastguard Worker shift 64*6fa2df46SAndroid Build Coastguard Worker ;; 65*6fa2df46SAndroid Build Coastguard Worker -s|--serial) 66*6fa2df46SAndroid Build Coastguard Worker SERIAL="-s $2" 67*6fa2df46SAndroid Build Coastguard Worker shift 68*6fa2df46SAndroid Build Coastguard Worker shift 69*6fa2df46SAndroid Build Coastguard Worker ;; 70*6fa2df46SAndroid Build Coastguard Worker -r|--root) 71*6fa2df46SAndroid Build Coastguard Worker SET_ROOT=1 72*6fa2df46SAndroid Build Coastguard Worker shift 73*6fa2df46SAndroid Build Coastguard Worker ;; 74*6fa2df46SAndroid Build Coastguard Worker -h|--help) 75*6fa2df46SAndroid Build Coastguard Worker help 76*6fa2df46SAndroid Build Coastguard Worker exit 0 77*6fa2df46SAndroid Build Coastguard Worker shift 78*6fa2df46SAndroid Build Coastguard Worker ;; 79*6fa2df46SAndroid Build Coastguard Worker -*|--*) 80*6fa2df46SAndroid Build Coastguard Worker echo "Unknown option $1" 81*6fa2df46SAndroid Build Coastguard Worker help 82*6fa2df46SAndroid Build Coastguard Worker exit 1 83*6fa2df46SAndroid Build Coastguard Worker ;; 84*6fa2df46SAndroid Build Coastguard Worker esac 85*6fa2df46SAndroid Build Coastguard Workerdone 86*6fa2df46SAndroid Build Coastguard Worker 87*6fa2df46SAndroid Build Coastguard Worker 88*6fa2df46SAndroid Build Coastguard Workerif [ -z "${ANDROID_HOST_OUT}" ] ; then 89*6fa2df46SAndroid Build Coastguard Worker echo "This script requires an Android environment. It needs to be run from an" 90*6fa2df46SAndroid Build Coastguard Worker echo "Android repository after the initialization scripts:" 91*6fa2df46SAndroid Build Coastguard Worker echo "$ source build/envsetup.sh" 92*6fa2df46SAndroid Build Coastguard Worker echo "$ lunch aosp_cf_x86_64_phone-trunk_staging-userdebug" 93*6fa2df46SAndroid Build Coastguard Worker exit 1 94*6fa2df46SAndroid Build Coastguard Workerfi 95*6fa2df46SAndroid Build Coastguard Worker 96*6fa2df46SAndroid Build Coastguard Worker 97*6fa2df46SAndroid Build Coastguard Worker# If the user specified a WORKLOAD, make sure that Dittobench is built, better 98*6fa2df46SAndroid Build Coastguard Worker# before enabling tracing. 99*6fa2df46SAndroid Build Coastguard Workerif [ ! -z "${WORKLOAD}" ] ; then 100*6fa2df46SAndroid Build Coastguard Worker if [ ! -z "${SET_ROOT}" ] ; then 101*6fa2df46SAndroid Build Coastguard Worker adb ${SERIAL} shell whoami | grep root || adb ${SERIAL} root 102*6fa2df46SAndroid Build Coastguard Worker sleep 2 103*6fa2df46SAndroid Build Coastguard Worker fi 104*6fa2df46SAndroid Build Coastguard Worker 105*6fa2df46SAndroid Build Coastguard Worker m dittobench 106*6fa2df46SAndroid Build Coastguard Worker adb ${SERIAL} push ${ANDROID_PRODUCT_OUT}/system/bin/dittobench /data/local/tmp/ 107*6fa2df46SAndroid Build Coastguard Workerfi 108*6fa2df46SAndroid Build Coastguard Worker 109*6fa2df46SAndroid Build Coastguard Worker 110*6fa2df46SAndroid Build Coastguard Workerif [ ! -z "${PERFETTO_CONFIG_FILE}" ] ; then 111*6fa2df46SAndroid Build Coastguard Worker if [ -z "${TRACE_FILE}" ] ; then 112*6fa2df46SAndroid Build Coastguard Worker TRACE_FILE=$(mktemp) 113*6fa2df46SAndroid Build Coastguard Worker echo "Using temporary trace file path: \"${TRACE_FILE}\"" 114*6fa2df46SAndroid Build Coastguard Worker fi 115*6fa2df46SAndroid Build Coastguard Worker ${ANDROID_BUILD_TOP}/external/perfetto/tools/record_android_trace ${SERIAL} --no-open \ 116*6fa2df46SAndroid Build Coastguard Worker -c ${PERFETTO_CONFIG_FILE} \ 117*6fa2df46SAndroid Build Coastguard Worker -o ${TRACE_FILE} & 118*6fa2df46SAndroid Build Coastguard Worker PERFETTO_PID=$! 119*6fa2df46SAndroid Build Coastguard Worker 120*6fa2df46SAndroid Build Coastguard Worker echo "Perfetto started (${PERFETTO_PID}), cooling down..." 121*6fa2df46SAndroid Build Coastguard Worker sleep 5 122*6fa2df46SAndroid Build Coastguard Workerfi 123*6fa2df46SAndroid Build Coastguard Worker 124*6fa2df46SAndroid Build Coastguard Worker 125*6fa2df46SAndroid Build Coastguard Workerif [ ! -z "${WORKLOAD}" ] ; then 126*6fa2df46SAndroid Build Coastguard Worker adb ${SERIAL} shell /data/local/tmp/dittobench -w ${WORKLOAD} -f csv | column -t -s "," 127*6fa2df46SAndroid Build Coastguard Worker echo "Cooldown..." 128*6fa2df46SAndroid Build Coastguard Worker sleep 5 129*6fa2df46SAndroid Build Coastguard Workerfi 130*6fa2df46SAndroid Build Coastguard Worker 131*6fa2df46SAndroid Build Coastguard Worker 132*6fa2df46SAndroid Build Coastguard Worker# If there is an instance of record_android_trace, kill it gracefully, so that 133*6fa2df46SAndroid Build Coastguard Worker# the trace file is correctly pulled from the device. 134*6fa2df46SAndroid Build Coastguard Workerif [ ! -z "${PERFETTO_PID}" ] ; then 135*6fa2df46SAndroid Build Coastguard Worker kill -s 15 $PERFETTO_PID # SIGTERM 136*6fa2df46SAndroid Build Coastguard Worker wait $PERFETTO_PID 137*6fa2df46SAndroid Build Coastguard Workerfi 138*6fa2df46SAndroid Build Coastguard Worker 139*6fa2df46SAndroid Build Coastguard Worker 140*6fa2df46SAndroid Build Coastguard Workerif [ ! -z "${QUERY_FILE}" ] ; then 141*6fa2df46SAndroid Build Coastguard Worker if [ -z "${TRACE_FILE}" ] ; then 142*6fa2df46SAndroid Build Coastguard Worker echo "A TRACE file needs to be specified to run a query, unless Perfetto is" 143*6fa2df46SAndroid Build Coastguard Worker echo "run as a result of setting the PERFETTO_CONFIG parameter" 144*6fa2df46SAndroid Build Coastguard Worker exit 1 145*6fa2df46SAndroid Build Coastguard Worker fi 146*6fa2df46SAndroid Build Coastguard Worker [ ! which trace_processor_shell ] && m trace_processor_shell 147*6fa2df46SAndroid Build Coastguard Worker trace_processor_shell -q ${QUERY_FILE} ${TRACE_FILE} | column -t -s ',' 148*6fa2df46SAndroid Build Coastguard Workerfi 149*6fa2df46SAndroid Build Coastguard Worker 150