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