1*c8dee2aaSAndroid Build Coastguard Worker#!/bin/sh 2*c8dee2aaSAndroid Build Coastguard Worker 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2015 Google Inc. 4*c8dee2aaSAndroid Build Coastguard Worker# 5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Workerif [ -z "$1" ]; then 9*c8dee2aaSAndroid Build Coastguard Worker printf 'Usage:\n android_skp_capture.sh PACKAGE_NAME\n\n' 10*c8dee2aaSAndroid Build Coastguard Worker printf "Use \`adb shell 'pm list packages'\` to get a listing.\n\n" 11*c8dee2aaSAndroid Build Coastguard Worker exit 1 12*c8dee2aaSAndroid Build Coastguard Workerfi 13*c8dee2aaSAndroid Build Coastguard Workerif ! command -v adb > /dev/null 2>&1; then 14*c8dee2aaSAndroid Build Coastguard Worker if [ -x "${ANDROID_SDK_ROOT}/platform-tools/adb" ]; then 15*c8dee2aaSAndroid Build Coastguard Worker adb() { 16*c8dee2aaSAndroid Build Coastguard Worker "${ANDROID_SDK_ROOT}/platform-tools/adb" "$@" 17*c8dee2aaSAndroid Build Coastguard Worker } 18*c8dee2aaSAndroid Build Coastguard Worker else 19*c8dee2aaSAndroid Build Coastguard Worker echo 'adb missing' 20*c8dee2aaSAndroid Build Coastguard Worker exit 2 21*c8dee2aaSAndroid Build Coastguard Worker fi 22*c8dee2aaSAndroid Build Coastguard Workerfi 23*c8dee2aaSAndroid Build Coastguard Workerphase1_timeout_seconds=15 24*c8dee2aaSAndroid Build Coastguard Workerphase2_timeout_seconds=60 25*c8dee2aaSAndroid Build Coastguard Workerpackage="$1" 26*c8dee2aaSAndroid Build Coastguard Workerfilename="$(date '+%H%M%S').skp" 27*c8dee2aaSAndroid Build Coastguard Workerremote_path="/data/data/${package}/cache/${filename}" 28*c8dee2aaSAndroid Build Coastguard Workerlocal_path="$(date '+%Y-%m-%d_%H%M%S')_${package}.skp" 29*c8dee2aaSAndroid Build Coastguard Workerkey='debug.hwui.capture_frame_as_skp' 30*c8dee2aaSAndroid Build Coastguard Workeradb shell "setprop '${key}' '${remote_path}'" 31*c8dee2aaSAndroid Build Coastguard Workerspin() { 32*c8dee2aaSAndroid Build Coastguard Worker case "$spin" in 33*c8dee2aaSAndroid Build Coastguard Worker 1) printf '\b|';; 34*c8dee2aaSAndroid Build Coastguard Worker 2) printf '\b\\';; 35*c8dee2aaSAndroid Build Coastguard Worker 3) printf '\b-';; 36*c8dee2aaSAndroid Build Coastguard Worker *) printf '\b/';; 37*c8dee2aaSAndroid Build Coastguard Worker esac 38*c8dee2aaSAndroid Build Coastguard Worker spin=$(( ( ${spin:-0} + 1 ) % 4 )) 39*c8dee2aaSAndroid Build Coastguard Worker sleep $1 40*c8dee2aaSAndroid Build Coastguard Worker} 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Workerbanner() { 43*c8dee2aaSAndroid Build Coastguard Worker printf '\n=====================\n' 44*c8dee2aaSAndroid Build Coastguard Worker printf ' %s' "$*" 45*c8dee2aaSAndroid Build Coastguard Worker printf '\n=====================\n' 46*c8dee2aaSAndroid Build Coastguard Worker} 47*c8dee2aaSAndroid Build Coastguard Workerbanner '...WAITING...' 48*c8dee2aaSAndroid Build Coastguard Workeradb_test_exist() { 49*c8dee2aaSAndroid Build Coastguard Worker test '0' = "$(adb shell "test -e \"$1\"; echo \$?")"; 50*c8dee2aaSAndroid Build Coastguard Worker} 51*c8dee2aaSAndroid Build Coastguard Workertimeout=$(( $(date +%s) + $phase1_timeout_seconds)) 52*c8dee2aaSAndroid Build Coastguard Workerwhile ! adb_test_exist "$remote_path"; do 53*c8dee2aaSAndroid Build Coastguard Worker spin 0.05 54*c8dee2aaSAndroid Build Coastguard Worker if [ $(date +%s) -gt $timeout ] ; then 55*c8dee2aaSAndroid Build Coastguard Worker printf '\bTimed out.\n' 56*c8dee2aaSAndroid Build Coastguard Worker adb shell "setprop '${key}' ''" 57*c8dee2aaSAndroid Build Coastguard Worker exit 3 58*c8dee2aaSAndroid Build Coastguard Worker fi 59*c8dee2aaSAndroid Build Coastguard Workerdone 60*c8dee2aaSAndroid Build Coastguard Workerprintf '\b' 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Workerbanner '...SAVING...' 63*c8dee2aaSAndroid Build Coastguard Workeradb_test_file_nonzero() { 64*c8dee2aaSAndroid Build Coastguard Worker # grab first byte of `du` output 65*c8dee2aaSAndroid Build Coastguard Worker X="$(adb shell "du \"$1\" 2> /dev/null | dd bs=1 count=1 2> /dev/null")" 66*c8dee2aaSAndroid Build Coastguard Worker test "$X" && test "$X" -ne 0 67*c8dee2aaSAndroid Build Coastguard Worker} 68*c8dee2aaSAndroid Build Coastguard Worker#adb_filesize() { 69*c8dee2aaSAndroid Build Coastguard Worker# adb shell "wc -c \"$1\"" 2> /dev/null | awk '{print $1}' 70*c8dee2aaSAndroid Build Coastguard Worker#} 71*c8dee2aaSAndroid Build Coastguard Workertimeout=$(( $(date +%s) + $phase2_timeout_seconds)) 72*c8dee2aaSAndroid Build Coastguard Workerwhile ! adb_test_file_nonzero "$remote_path"; do 73*c8dee2aaSAndroid Build Coastguard Worker spin 0.05 74*c8dee2aaSAndroid Build Coastguard Worker if [ $(date +%s) -gt $timeout ] ; then 75*c8dee2aaSAndroid Build Coastguard Worker printf '\bTimed out.\n' 76*c8dee2aaSAndroid Build Coastguard Worker adb shell "setprop '${key}' ''" 77*c8dee2aaSAndroid Build Coastguard Worker exit 3 78*c8dee2aaSAndroid Build Coastguard Worker fi 79*c8dee2aaSAndroid Build Coastguard Workerdone 80*c8dee2aaSAndroid Build Coastguard Workerprintf '\b' 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Workeradb shell "setprop '${key}' ''" 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Workeri=0; while [ $i -lt 10 ]; do spin 0.10; i=$(($i + 1)); done; echo 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Workeradb pull "$remote_path" "$local_path" 87*c8dee2aaSAndroid Build Coastguard Workerif ! [ -f "$local_path" ] ; then 88*c8dee2aaSAndroid Build Coastguard Worker printf "something went wrong with `adb pull`." 89*c8dee2aaSAndroid Build Coastguard Worker exit 4 90*c8dee2aaSAndroid Build Coastguard Workerfi 91*c8dee2aaSAndroid Build Coastguard Workeradb shell rm "$remote_path" 92*c8dee2aaSAndroid Build Coastguard Workerprintf '\nSKP saved to file:\n %s\n\n' "$local_path" 93