1#!/bin/sh
2# Copyright (C) 2014 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16#
17# Symbolize oat files from the dalvik cache of a device.
18#
19# By default, pulls everything from the dalvik cache. A simple yes/no/quit prompt for each file can
20# be requested by giving "--interactive" as a parameter.
21
22INTERACTIVE="no"
23if [ "x$1" = "x--interactive" ] ; then
24  INTERACTIVE="yes"
25  shift
26fi
27
28# Pull the file from the device and symbolize it.
29function one() {
30  echo $1 $2
31  if [ "x$INTERACTIVE" = "xyes" ] ; then
32    echo -n "What to do? [Y/n/q] "
33    read -e input
34    if [ "x$input" = "xn" ] ; then
35      return
36    fi
37    if [ "x$input" = "xq" ] ; then
38      exit 0
39    fi
40  fi
41  adb pull $1/$2 /tmp || exit 1
42  mkdir -p $OUT/symbols/$1
43  oatdump --symbolize=/tmp/$2 --output=$OUT/symbols/$1/$2
44}
45
46# adb shell find seems to output in DOS format (CRLF), which messes up scripting
47function adbshellstrip() {
48  adb shell $@ | sed 's/\r$//'
49}
50
51# Search in all of /data on device.
52function all() {
53  FILES=$(adbshellstrip find /data -name "'*.oat'" -o -name "'*.dex'" -o -name "'*.odex'")
54  for FILE in $FILES ; do
55    DIR=$(dirname $FILE)
56    NAME=$(basename $FILE)
57    one $DIR $NAME
58  done
59}
60
61if [ "x$1" = "x" ] ; then
62  # No further arguments, iterate over all oat files on device.
63  all
64else
65  # Take the parameters as a list of paths on device.
66  while (($#)); do
67    DIR=$(dirname $1)
68    NAME=$(basename $1)
69    one $DIR $NAME
70    shift
71  done
72fi
73