• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2
3LANG=C
4
5if [ "$1" == "-h" ]
6then
7    cat <<- EOH
8		    Usage: $0 [-p] [folder]
9		      -p option prints out unused resources, otherwise a total count is printed
10		      folder option causes only that app folder to be scanned, default is to scan all folders onder apps/
11		EOH
12    exit
13fi
14
15showall=no
16if [ "$1" == "-p" ]
17then
18    showall=yes
19    shift
20fi
21
22apps=$1
23if [ "$apps" == "" ]
24then
25    apps=$ANDROID_BUILD_TOP/packages/apps/*
26fi
27
28for app in $apps
29do
30    echo '-----------------------------------------------------------'
31    if [ "$app" == "." ]
32    then
33        app=$(pwd)
34    fi
35    if [ -d $app/res ]
36    then
37        appname=$(basename $app)
38        resources=
39        for res in $(echo $app/res/* $(find $ANDROID_BUILD_TOP/vendor -type d -wholename $ANDROID_BUILD_TOP/vendor/*/$appname/res | grep overlay))
40        do
41            resources="$resources $(echo $res | grep -v '\-mcc\|[a-z]*-[a-z][a-z]$\|[a-z]*-[a-z][a-z]-.*')"
42        done
43        sources=$app/src
44        if [ -d $app/tests ]
45        then
46            sources="$sources $app/tests"
47        fi
48        if [ -d $app/samples ]
49        then
50            sources="$sources $app/samples"
51        fi
52
53        # find the R.java file that contains all the generated resource identifiers
54        rDotJava=$(find $ANDROID_BUILD_TOP/out/target/common/obj/APPS/${appname}_intermediates/ -name R.java)
55
56        # Simplistically process the content of the file to get the names of all the constants,
57        # and try to find a reference to each constant.
58
59        # First take all the input files and concatenate them, removing newlines. This allows us to
60        # find expressions that are broken up over multiple lines, i.e. R.drawable.\nsomeconstant
61        find $resources $sources $app/AndroidManifest.xml -type f -print |xargs cat | tr -d '\n ' > /tmp/everything$$
62
63        # Now look for each of the constants in the contatenated file.
64        for i in $(cat $rDotJava | grep "\w*=0x\d*" | sed 's/ *public static final int //' | sed 's/=0x.*//')
65        do
66            # Since periods in the names get translated to underscores in R.java, and you can actually
67            # refer to such constants from java by using an underscore instead of a period, we also
68            # replace all underscores with a pattern that will match periods and underscores.
69            p=$(echo $i | sed 's/_/[\\._]/g')
70            echo $i $(grep -cw R\\..*\\.$i\\\|@style/$p\\\|@drawable/$p\\\|@anim/$p\\\|@color/$p\\\|@xml/$p\\\|@layout/$p\\\|@menu/$p\\\|@+id/$p\\\|@array/$p\\\|@string/$p\\\|@dimen/$p\\\|\[a-z\]\*:$p\\\|enumname=\"$p\\\|\<item\>$p\< < /tmp/everything$$)
71        done | grep " 0$" | {
72            # this block gets as its input a list of constants for which no references were found, one per line
73            if [ "$showall" == "yes" ]
74            then
75                echo $app
76                cat
77            else
78                count=$(wc -l)
79                if [ "$count" != "0" ]
80                then
81                    echo $app: $count unused resources
82                fi
83            fi
84        }
85        rm /tmp/everything$$
86    fi
87done
88