xref: /aosp_15_r20/development/tools/findunused/findunusedresources (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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