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