#!/bin/bash #base_url="scp://linaro-lava@mombin.canonical.com/home/yongqinliu/benchmark-apks/" base_url="ssh://linaro-lava@linaro-private.git.linaro.org/srv/linaro-private.git.linaro.org/people/yongqinliu/benchmark-apks.git" png_dir_device="/data/local/tmp/" post_install="" pre_uninstall="" do_streamline=false function install_linaro_android_jar(){ jar_name="linaro.android.jar" tgt_path="/data/local/tmp/${jar_name}" jar_url="http://testdata.validation.linaro.org/tools/${jar_name}" exist=`adb shell "ls ${tgt_path} 2>/dev/null"` if [ -z "${exist}" ]; then wget ${jar_url} -O ${jar_name} adb push ${jar_name} ${tgt_path} rm -f ${jar_name} fi } function delete_png_files_on_device(){ png_dir=${1-$png_dir_device} png_files=`adb shell "ls ${png_dir}/*.png 2>/dev/null"` for png_f in ${png_files}; do png_f=`echo ${png_f}|sed 's/\r//'` adb shell rm "${png_f}" done } function pull_png_files_from_device(){ src_dir_device=${1-"${png_dir_device}"} tgt_dir_local=${2-"${parent_dir}"} png_files=`adb shell "ls ${png_dir}/*.png 2>/dev/null"` for png_f in ${png_files}; do png_f=`echo ${png_f}|sed 's/\r//'` adb pull "${png_f}" "${tgt_dir_local}" &>/dev/null done } function init(){ install_linaro_android_jar #uninstall the apk application adb uninstall "${apk_package}" #clear the logcat information adb logcat -c sleep 5 rm -fr "${parent_dir}"/*.png 2>/dev/null delete_png_files_on_device "${png_dir_device}" disableRotationapk="${APKS_DIR}/RotationOff.apk" if [ -f "{$disableRotationapk}" ]; then echo "The file(${disableRotationapk}) already exists." else get_file_with_base_url "RotationOff.apk" fi adb install "${disableRotationapk}" sleep 2 adb shell am start 'rotation.off/.RotationOff' sleep 2 adb shell "cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor > /data/governor.txt" # adb shell "echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor" # adb shell "echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor" adb shell logcat -c adb shell setprop ro.debug.drawtext true adb shell setprop ro.debug.textview true adb shell setprop ro.debug.loadDataWithBaseURL true logcat_file="${parent_dir}/logcat.log" echo "---------------------------------------------------" echo "A new test is started:`date`" |tee -a "${logcat_file}" adb logcat >>${logcat_file} & export LOGCAT_PID=$! } function cleanup(){ adb shell "cat /data/governor.txt > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor" adb shell "cat /data/governor.txt > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor" adb shell rm /data/governor.txt adb shell setprop ro.debug.drawtext false adb shell setprop ro.debug.textview false adb shell setprop ro.debug.loadDataWithBaseURL false adb uninstall rotation.off if [ -n "${LOGCAT_PID}" ]; then kill -9 ${LOGCAT_PID} fi } function export_serial(){ serial="${1}" && shift if [ -n "${serial}" ]; then export ANDROID_SERIAL=${serial} else serial=`adb get-serialno|sed 's/\r//g'` if [ "X${serial}" == "Xunknown" ]; then echo "Can not get the serial number autotically," echo "Please specify the serial number with the -s option" exit 1 else export ANDROID_SERIAL=${serial} fi fi } function export_parent_dir(){ old_pwd=`pwd` cd ${parent_dir} parent_dir=`pwd` cd ${old_pwd} export parent_dir=${parent_dir} } function export_apks_dir(){ export APKS_DIR="${parent_dir}/../benchmark-apks" } function get_file_with_base_url(){ file_name="${1}" && shift if [ -z "${file_name}" ]; then echo "File name must be passed!" exit 1 fi if [ -f "${APKS_DIR}/${file_name}" ]; then echo "The file(${APKS_DIR}/${file_name}) already exists." return fi if [[ "${base_url}" =~ "scp://" ]]; then mkdir -p "${APKS_DIR}" apk_url="${base_url}/${file_name}" url_no_scp=`echo ${apk_url}|sed 's/^\s*scp\:\/\///'|sed 's/\//\:\//'` scp "${url_no_scp}" "${APKS_DIR}/${file_name}" if [ $? -ne 0 ]; then echo "Failed to get the apk(${file_name}) with ${base_url}" exit 1 fi elif [[ "${base_url}" =~ "ssh://" ]]; then rm -fr "${APKS_DIR}" git clone "${base_url}" "${APKS_DIR}" if [ $? -ne 0 ]; then echo "Failed to get the apks with ${base_url}" exit 1 fi else echo "Failed to get the file($file_name)." echo "The schema of the ${base_url} is not supported now!" exit 1 fi } function install_run_uninstall(){ #install the apk files apk_file="${APKS_DIR}/${apk_file_name}" adb install "${apk_file}" if [ $? -ne 0 ]; then echo "Failed to install ${apk_file}." exit 1 fi if [ -n "${post_install}" ]; then ${post_install} fi adb shell am start "${activity}" sleep 5 adb shell am kill-all sleep 5 streamline_init_capture adb shell uiautomator runtest linaro.android.jar -c org.linaro.benchmarks.BenchmarksTestCase#${test_method} sleep 5 streamline_end_capture if [ -n "${pre_uninstall}" ]; then ${pre_uninstall} fi adb uninstall "${apk_package}" } function collect_log(){ sleep 5 adb logcat -d -s "TextView" >${parent_dir}/logcat_textview.log sleep 5 adb logcat -d -s "Canvas" >${parent_dir}/logcat_canvas.log sleep 5 adb logcat -d -s "WebViewClassic.loadDataWithBaseURL" >${parent_dir}/logcat_webview.log sleep 5 } function streamline_locate(){ which streamline >&/dev/null return $? } function streamline_init_capture(){ if ! ${do_streamline}; then return fi if ! streamline_locate; then echo "There is no streamline command found." echo "Please check your environment variable or install it" return fi echo "Start Streamline Capture.. " adb shell "rm -r /data/streamline 2>/dev/null" adb shell mkdir /data/streamline session_file="${parent_dir}/session.xml" adb push $session_file /data/streamline app_name=`basename $parent_dir` adb shell "gatord -s /data/streamline/session.xml -o /data/streamline/${app_name}.apc &" adb shell sleep 2 } function streamline_end_capture(){ if ! ${do_streamline}; then return fi if ! streamline_locate; then return fi echo "End Streamline Capture.. " ps_info=`adb shell ps -x | grep -E '\s+gatord\s+'` ##TODO maybe have multiple lines here pid=`echo $ps_info|cut -d \ -f 2|sed 's/\r//'` if [ -n "${pid}" ]; then adb shell kill $pid fi echo "Start Processing Streamline data." app_name=`basename $parent_dir` capture_dir="$parent_dir/${app_name}.apc" rm -fr ${capture_dir} adb pull /data/streamline/${app_name}.apc $capture_dir if [ $? -ne 0 ]; then echo "Failed to pull the streamline data from android!" exit 1 fi streamline -analyze ${capture_dir} if [ $? -ne 0 ]; then echo "Failed to analyze the streamline data!" exit 1 fi apd_f="${app_name}.apd" streamline -report -function ${apd_f} |tee ${parent_dir}/streamlineReport.txt if [ $? -ne 0 ]; then echo "Failed to generate the streamline report!" exit 1 fi ##TODO detail parse should be done in run.py rm -fr ${capture_dir} adb shell rm -r /data/streamline } function show_usage(){ echo "`basename $0` [--base-url|-b ] [] [--streamline]" echo "`basename $0` --help|-h" } function parse_arguments(){ while test -n "$1"; do case "$1" in --help|-h) show_usage exit 1 ;; --streamline|-s) do_streamline=true shift 1 ;; "--base-url"|-b) if [ -z "$2" ]; then show_usage exit 1 else base_url="$2" shift 2 fi ;; *) if [ -n "${arg_serial}" ]; then echo "Too many arguments are given!" show_usage exit 1 fi arg_serial="$1" shift 1 ;; esac done } function main(){ arg_serial="" parse_arguments "$@" export_serial "${arg_serial}" export_parent_dir export_apks_dir init get_file_with_base_url "${apk_file_name}" install_run_uninstall pull_png_files_from_device "${png_dir_device}" ${parent_dir} collect_log cleanup }