| # Copyright 2025 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| test_name='' |
| seconds=0 |
| dump_powerhal=false |
| use_perfetto=false |
| use_simpleperf=false |
| |
| print_usage() { |
| printf 'Usage:\n smoke.sh -n TEST_NAME -d [OPTIONAL SECONDS] \n\n' |
| printf -- '-p: Enable power dumps. Only if the test duration is finite. \n\n' |
| printf -- '-t: Enable perfetto tracing. Only if the test duration is finite. Only works if you run in the same directory as config.pbtx. \n\n' |
| printf -- '-s: Enable simpleperf collection for surfaceflinger. Only if the test duration is finite. \n\n' |
| } |
| |
| while getopts 'd::n:pst' flag; do |
| case "${flag}" in |
| d) seconds="${OPTARG}";; |
| n) test_name="${OPTARG}";; |
| p) dump_powerhal=true;; |
| s) use_simpleperf=true;; |
| t) use_perfetto=true;; |
| *) print_usage |
| exit 1 ;; |
| esac |
| done |
| |
| if [ -z "$test_name" ]; then |
| print_usage |
| exit 1 |
| fi |
| |
| if [[ ! "$seconds" =~ ^[0-9]+$ ]]; then |
| echo "Seconds was not a positive integer -- defaulting to 0" |
| seconds='0' |
| fi |
| |
| echo "Launching test: $test_name" |
| |
| adb shell am start -n com.android.test.transactionflinger/com.android.test.transactionflinger.activities.$test_name |
| |
| if (( "$seconds" > 0 )); then |
| echo "Running test for $seconds seconds" |
| if (( "$seconds" < 10 )); then |
| echo "Note that running a test for less than 10 seconds may not produce great power data" |
| fi |
| |
| start_time=$(date +%s) |
| if "$dump_powerhal" ; then |
| adb shell dumpsys android.hardware.power.stats.IPowerStats/default | grep -A100 "energy meter" > before_energy.txt |
| echo "Dumped initial power stats into before_energy.txt" |
| fi |
| |
| if "$use_simpleperf" ; then |
| $(${ANDROID_BUILD_TOP}/system/extras/simpleperf/scripts/app_profiler.py -np surfaceflinger -r "--duration ${seconds} -g --post-unwind=yes" ; ${ANDROID_BUILD_TOP}/system/extras/simpleperf/scripts/pprof_proto_generator.py -i perf.data) & |
| fi |
| |
| if "$use_perfetto" ; then |
| config="$(< config.pbtx)" |
| config+=" duration_ms: ${seconds}000" |
| echo ${config} | adb shell -t perfetto -c - --txt -o /data/misc/perfetto-traces/trace.pftrace |
| adb pull /data/misc/perfetto-traces/trace.pftrace |
| else |
| sleep $seconds |
| fi |
| |
| end_time=$(date +%s) |
| elapsed=$(( end_time - start_time )) |
| if "$dump_powerhal" ; then |
| adb shell dumpsys android.hardware.power.stats.IPowerStats/default | grep -A100 "energy meter" > after_energy.txt |
| echo "Dumped final power stats into after_energy.txt after $elapsed seconds" |
| fi |
| |
| echo "Running for a few extra seconds before stopping" |
| sleep 5 |
| echo "Stopping test: $test_name" |
| adb shell am force-stop com.android.test.transactionflinger |
| fi |
| |
| |