|  | #!/bin/sh | 
|  |  | 
|  | # Copyright 2015 Google Inc. | 
|  | # | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | if [ -z "$1" ]; then | 
|  | printf 'Usage:\n    android_skp_capture.sh PACKAGE_NAME\n\n' | 
|  | printf "Use \`adb shell 'pm list packages'\` to get a listing.\n\n" | 
|  | exit 1 | 
|  | fi | 
|  | if ! command -v adb > /dev/null 2>&1; then | 
|  | if [ -x "${ANDROID_SDK_ROOT}/platform-tools/adb" ]; then | 
|  | adb() { | 
|  | "${ANDROID_SDK_ROOT}/platform-tools/adb" "$@" | 
|  | } | 
|  | else | 
|  | echo 'adb missing' | 
|  | exit 2 | 
|  | fi | 
|  | fi | 
|  | phase1_timeout_seconds=15 | 
|  | phase2_timeout_seconds=60 | 
|  | package="$1" | 
|  | filename="$(date '+%H%M%S').skp" | 
|  | remote_path="/data/data/${package}/cache/${filename}" | 
|  | local_path="$(date '+%Y-%m-%d_%H%M%S')_${package}.skp" | 
|  | key='debug.hwui.capture_frame_as_skp' | 
|  | adb shell "setprop '${key}' '${remote_path}'" | 
|  | spin() { | 
|  | case "$spin" in | 
|  | 1) printf '\b|';; | 
|  | 2) printf '\b\\';; | 
|  | 3) printf '\b-';; | 
|  | *) printf '\b/';; | 
|  | esac | 
|  | spin=$(( ( ${spin:-0} + 1 ) % 4 )) | 
|  | sleep $1 | 
|  | } | 
|  |  | 
|  | banner() { | 
|  | printf '\n=====================\n' | 
|  | printf '   %s' "$*" | 
|  | printf '\n=====================\n' | 
|  | } | 
|  | banner '...WAITING...' | 
|  | adb_test_exist() { | 
|  | test '0' = "$(adb shell "test -e \"$1\"; echo \$?")"; | 
|  | } | 
|  | timeout=$(( $(date +%s) + $phase1_timeout_seconds)) | 
|  | while ! adb_test_exist "$remote_path"; do | 
|  | spin 0.05 | 
|  | if [ $(date +%s) -gt $timeout ] ; then | 
|  | printf '\bTimed out.\n' | 
|  | adb shell "setprop '${key}' ''" | 
|  | exit 3 | 
|  | fi | 
|  | done | 
|  | printf '\b' | 
|  |  | 
|  | banner '...SAVING...' | 
|  | adb_test_file_nonzero() { | 
|  | # grab first byte of `du` output | 
|  | X="$(adb shell "du \"$1\" 2> /dev/null | dd bs=1 count=1 2> /dev/null")" | 
|  | test "$X" && test "$X" -ne 0 | 
|  | } | 
|  | #adb_filesize() { | 
|  | #    adb shell "wc -c \"$1\"" 2> /dev/null | awk '{print $1}' | 
|  | #} | 
|  | timeout=$(( $(date +%s) + $phase2_timeout_seconds)) | 
|  | while ! adb_test_file_nonzero "$remote_path"; do | 
|  | spin 0.05 | 
|  | if [ $(date +%s) -gt $timeout ] ; then | 
|  | printf '\bTimed out.\n' | 
|  | adb shell "setprop '${key}' ''" | 
|  | exit 3 | 
|  | fi | 
|  | done | 
|  | printf '\b' | 
|  |  | 
|  | adb shell "setprop '${key}' ''" | 
|  |  | 
|  | i=0; while [ $i -lt 10 ]; do spin 0.10; i=$(($i + 1)); done; echo | 
|  |  | 
|  | adb pull "$remote_path" "$local_path" | 
|  | if ! [ -f "$local_path" ] ; then | 
|  | printf "something went wrong with `adb pull`." | 
|  | exit 4 | 
|  | fi | 
|  | adb shell rm "$remote_path" | 
|  | printf '\nSKP saved to file:\n    %s\n\n'  "$local_path" |