| Index: tools-webrtc/android/profiling/perf_setup.sh
|
| diff --git a/tools-webrtc/android/profiling/perf_setup.sh b/tools-webrtc/android/profiling/perf_setup.sh
|
| index 7025fd27e78b09e92dd265cf83cd860508e8b655..9d80e4158afb1175208375a693f354082940e175 100755
|
| --- a/tools-webrtc/android/profiling/perf_setup.sh
|
| +++ b/tools-webrtc/android/profiling/perf_setup.sh
|
| @@ -11,7 +11,7 @@
|
| # Usage:
|
| #
|
| # It is assumed that a release build of AppRTCMobile exists and has been
|
| -# installed on a rooted and attached Android device.
|
| +# installed on an Android device which supports USB debugging.
|
| #
|
| # Source this script once from the WebRTC src/ directory and resolve any
|
| # reported issues. Add relative path to build directory as parameter.
|
| @@ -21,6 +21,9 @@
|
| # Use these functions to do the actual profiling and visualization of the
|
| # results.
|
| #
|
| +# Note that, using a rooted device is recommended since it allows us to
|
| +# resolve kernel symbols (kallsyms) as well.
|
| +#
|
| # Example usage:
|
| #
|
| # > . tools-webrtc/android/profiling/perf_setup.sh out/Release
|
| @@ -60,21 +63,11 @@ if [[ "$#" -eq 1 ]]; then
|
| fi
|
| BUILD_DIR="$1"
|
| else
|
| - unset BUILD_DIR
|
| error "Missing required parameter".
|
| usage
|
| + return 1
|
| fi
|
|
|
| -# Helper method to simpify usage of the simpleperf binary on the device.
|
| -function simpleperf_android() {
|
| - local simpleperf="${DEV_TMP_DIR}/simpleperf"
|
| - if [ ! -z "$1" ]; then
|
| - adb shell "${simpleperf}" "$@"
|
| - else
|
| - adb shell $simpleperf --help
|
| - fi
|
| -}
|
| -
|
| # Full (relative) path to the libjingle_peerconnection_so.so file.
|
| function native_shared_lib_path() {
|
| echo "${BUILD_DIR}${NATIVE_LIB_PATH}"
|
| @@ -126,11 +119,12 @@ function copy_simpleperf_to_device() {
|
| [[ $(dev_arch) == "aarch64" ]] \
|
| && perf_binary="/arm64/simpleperf" \
|
| || perf_binary="/arm/simpleperf"
|
| - local simpleperf="${DEV_TMP_DIR}/simpleperf"
|
| # Copy the simpleperf binary from local host to temp folder on device.
|
| adb push "${SCRIPT_DIR}/simpleperf/bin/android${perf_binary}" \
|
| "${DEV_TMP_DIR}" 1> /dev/null
|
| - adb shell chmod a+x $simpleperf
|
| + # Copy simpleperf from temp folder to the application package.
|
| + adb shell run-as "${APP_NAME}" cp "${DEV_TMP_DIR}/simpleperf" .
|
| + adb shell run-as "${APP_NAME}" chmod a+x simpleperf
|
| # Enable profiling on the device.
|
| enable_profiling
|
| # Allows usage of running report commands on the device.
|
| @@ -142,7 +136,8 @@ function copy_simpleperf_to_device() {
|
| # Copy the recorded 'perf.data' file from the device to the current directory.
|
| # TODO(henrika): add support for specifying the destination.
|
| function pull_perf_data_from_device() {
|
| - adb pull "${DEV_TMP_DIR}/perf.data" .
|
| + adb shell run-as "${APP_NAME}" cp perf.data /sdcard/perf.data
|
| + adb pull sdcard/perf.data .
|
| } 1> /dev/null
|
|
|
|
|
| @@ -192,7 +187,7 @@ function print_function_help() {
|
| printf " perf_report_graph\n"
|
| printf " perf_report_graph_callee\n"
|
| printf " perf_update\n"
|
| - printf " perf_clean\n"
|
| + printf " perf_cleanup\n"
|
| printf " flame_graph\n"
|
| printf " plot_flame_graph\n"
|
| }
|
| @@ -209,7 +204,9 @@ function cleanup() {
|
| # device to ensure that symbols are up-to-date.
|
| function perf_update() {
|
| copy_native_shared_library_to_symbol_cache
|
| - copy_kernel_symbols_from_device_to_symbol_cache
|
| + if image_is_root; then
|
| + copy_kernel_symbols_from_device_to_symbol_cache
|
| + fi
|
| }
|
|
|
| # Record stack frame based call graphs while using the application.
|
| @@ -228,15 +225,12 @@ function perf_record() {
|
| fi
|
| local pid=$(find_app_pid "${APP_NAME}")
|
| echo "Profiling PID $pid for $duration seconds (media must be is active)..."
|
| - local output_file="${DEV_TMP_DIR}/perf.data"
|
| - simpleperf_android record \
|
| + adb shell run-as "${APP_NAME}" ./simpleperf record \
|
| --call-graph fp \
|
| -p "${pid}" \
|
| - -o $output_file \
|
| -f 1000 \
|
| --duration "${duration}" \
|
| --log error
|
| - app_stop "${APP_NAME}"
|
| # Copy profile results from device to current directory.
|
| pull_perf_data_from_device
|
| # Print out a summary report (load per thread).
|
| @@ -247,7 +241,7 @@ function perf_record() {
|
| warning "AppRTCMobile must be active"
|
| app_start "${APP_NAME}"
|
| echo "Start media and then call perf_record again..."
|
| - fi 2> /dev/null
|
| + fi
|
| }
|
|
|
| # Analyze the profile report and show samples per threads.
|
| @@ -309,10 +303,16 @@ function flame_graph() {
|
| file_name="$1"
|
| title="$2"
|
| fi
|
| - report_sample.py \
|
| - --symfs "${SYMBOL_DIR}" \
|
| - --kallsyms "${SYMBOL_DIR}/kallsyms" \
|
| - perf.data >out.perf
|
| + if image_is_not_root; then
|
| + report_sample.py \
|
| + --symfs "${SYMBOL_DIR}" \
|
| + perf.data >out.perf
|
| + else
|
| + report_sample.py \
|
| + --symfs "${SYMBOL_DIR}" \
|
| + --kallsyms "${SYMBOL_DIR}/kallsyms" \
|
| + perf.data >out.perf
|
| + fi
|
| stackcollapse-perf.pl out.perf >out.folded
|
| flamegraph.pl --title="${title}" out.folded >"${file_name}"
|
| rm out.perf
|
| @@ -361,18 +361,11 @@ main() {
|
| fi
|
| ok "one device is connected via USB"
|
|
|
| - # Ensure that the device is rooted.
|
| - if image_is_not_root; then
|
| - error "device is not rooted"
|
| - return 1
|
| - fi
|
| - ok "device is rooted"
|
| -
|
| # Restart adb with root permissions if needed.
|
| - if adb_has_no_root_permissions; then
|
| + if image_is_root && adb_has_no_root_permissions; then
|
| adb root
|
| + ok "adb is running as root"
|
| fi
|
| - ok "adbd is running as root"
|
|
|
| # Create an empty symbol cache in the tmp folder.
|
| # TODO(henrika): it might not be required to start from a clean cache.
|
|
|