Files
android_development/tools/findunused/findunusedresources
Marco Nelissen 4357bb8b8c Add a 'removeunusedresources' script that goes through an app and removes
all the unused resources. It uses the 'findunusedresources' script to find
the resources, and the 'xmlstarlet' command to edit xml files. The
result is an uncommitted git change that you can verify, modify if
needed, and then check in.
Also put some more fixes in the findunusedresources script to keep
it from reporting false positives.
2009-06-26 09:36:32 -07:00

86 lines
3.0 KiB
Bash
Executable File

#!/bin/sh
if [ "$1" == "-h" ]
then
cat <<- EOH
Usage: $0 [-p] [folder]
-p option prints out unused resources, otherwise a total count is printed
folder option causes only that app folder to be scanned, default is to scan all folders onder apps/
EOH
exit
fi
showall=no
if [ "$1" == "-p" ]
then
showall=yes
shift
fi
apps=$1
if [ "$apps" == "" ]
then
apps=$ANDROID_BUILD_TOP/packages/apps/*
fi
for app in $apps
do
echo '-----------------------------------------------------------'
if [ "$app" == "." ]
then
app=$(pwd)
fi
if [ -d $app/res ]
then
appname=$(basename $app)
resources=
for res in $(echo $app/res/* $(find $ANDROID_BUILD_TOP/vendor -type d -wholename $ANDROID_BUILD_TOP/vendor/*/$appname/res | grep overlay))
do
resources="$resources $(echo $res | grep -v '\-mcc\|[a-z]*-[a-z][a-z]$\|[a-z]*-[a-z][a-z]-.*')"
done
sources=$app/src
if [ -d $app/tests ]
then
sources="$sources $app/tests"
fi
if [ -d $app/samples ]
then
sources="$sources $app/samples"
fi
# find the R.java file that contains all the generated resource identifiers
rDotJava=$(find $ANDROID_BUILD_TOP/out/target/common/obj/APPS/${appname}_intermediates/ -name R.java)
# Simplistically process the content of the file to get the names of all the constants,
# and try to find a reference to each constant.
# First take all the input files and concatenate them, removing newlines. This allows us to
# find expressions that are broken up over multiple lines, i.e. R.drawable.\nsomeconstant
find $resources $sources $app/AndroidManifest.xml -type f -print |xargs cat | tr -d '\n ' > /tmp/everything$$
# Now look for each of the constants in the contatenated file.
for i in $(cat $rDotJava | grep "\w*=0x\d*" | sed 's/ *public static final int //' | sed 's/=0x.*//')
do
# Since periods in the names get translated to underscores in R.java, and you can actually
# refer to such constants from java by using an underscore instead of a period, we also
# replace all underscores with a pattern that will match periods and underscores.
p=$(echo $i | sed 's/_/[\\._]/g')
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$$)
done | grep " 0$" | {
# this block gets as its input a list of constants for which no references were found, one per line
if [ "$showall" == "yes" ]
then
echo $app
cat
else
count=$(wc -l)
if [ "$count" != "0" ]
then
echo $app: $count unused resources
fi
fi
}
rm /tmp/everything$$
fi
done