2010-09-21 7 views
28

Je cherche un moyen efficace de savoir si une ressource (principalement un dessinable) est utilisée en Java ou dans un fichier XML. Le problème est que sur mon projet actuel les drawables sont changés souvent et maintenant j'ai quelques drawables, qui pourraient ne jamais être utilisés.Savoir si la ressource est utilisée

Existe-t-il un outil/moyen pour trouver ces drawables inutilisés sans rechercher chaque nom de fichier dans le projet entier?

+2

Il serait agréable d'avoir ce genre de scénario :) – Macarse

+0

Eh bien on dirait que je dois écrire un :) – WarrenFaith

+0

@MaxUsanin merci pour spammer ma question. Qu'est-ce que votre question a à voir avec ma question? C'est un spam et je l'ai signalé. – WarrenFaith

Répondre

31

j'ai écrit un outil basé sur python pour résoudre ce problème. Comme ce n'est pas l'endroit pour le partager directement, j'ai créé une page de projet qui est maintenant hors ligne.

MISE À JOUR:
Le développement a cessé depuis Lint peut faire la même chose et est déjà inclus dans le SDK Android.

+0

Hm est-ce moi ou est-ce que l'outil ne fonctionne pas? Je l'ai fourni avec un chemin vers le dossier racine de mon projet android. Mais maintenant il dit qu'il n'y a pas de fichier /chemin/vers/projet/root/gen/R.java. Et c'est correct parce que le fichier R.java est dans gen/de/somepackage/anotherpackage/clientpackage/Y at-il un correctif pour cela? – Janusz

+0

Je suppose qu'il est préférable de créer un ticket sur la page du projet. Je suis actif, donc je vais répondre rapidement :) – WarrenFaith

+0

Ne fonctionne pas, a dû durcir mon répertoire à "parseR (rclass)" il cherchait le R.java dans C: \ Workspace \ Project_dir \ gen \ CVS \ et J'ai donné l'option dir '-i C: \ Workspace \ Project_dir'. Donc, il faut plus de travail, mais je l'ai eu au moins pour travailler. – JPM

17

Je viens d'écrire ce script bash juste pour le plaisir:

PROJECT="/path/to/the/project" 
for file in $(ls $PROJECT/res/drawable -l | awk '{ print $8}' | sed 's/\..\+//g'); do count=0; for SRCFILE in `find $PROJECT -name "*.xml" -print 2> /dev/null`; do let "count+=$(grep -c @drawable/$file $SRCFILE)"; done; for SRCFILE in `find $PROJECT -name "*.java" -print 2> /dev/null`; do let "count+=$(grep -c R.drawable.$file $SRCFILE)"; done; if [ $count -lt 1 ]; then echo -e "\e[0;31m$file\e[0m not used"; else echo -e "\e[0;32m$file\e[0m used"; fi; done; 

Il fonctionne très bien, même si je suis un débutant bash il peut être fortement améliorée:

alt text

Il recherche ressources drawables uniquement (@drawable/name sur les fichiers XML et R.drawable.name sur les fichiers Java). Par ailleurs, je ne savais pas que boxscore et calendarlogos n'étaient pas utilisés dans mon projet. Un autre fait curieux est que la plupart des utilisateurs n'utilisent pas Linux, donc cela n'aidera pas trop de gens.


Pour MacOs serait quelque chose comme ceci:

PROJECT="/path/to/the/project" 
for file in $(ls -l $PROJECT/res/drawable | awk '{ print $9}' | sed 's/\..\+//g'); do count=0; for SRCFILE in `find $PROJECT -name "*.xml" -print 2> /dev/null`; do let "count+=$(grep -c @drawable/$file $SRCFILE)"; done; for SRCFILE in `find $PROJECT -name "*.java" -print 2> /dev/null`; do let "count+=$(grep -c R.drawable.$file $SRCFILE)"; done; if [ $count -lt 1 ]; then echo -e "$file not used"; else echo -e "$file used"; fi; done; 
+1

J'ai mis à jour ma question avec un lien vers un script que j'ai écrit. Ce script pourrait aussi être intéressant pour vous. (Je suis toujours impressionné par les gens qui écrivent des scripts bash ... +1 :) – WarrenFaith

+0

OMFG !!! Je l'ai juste essayé et vous avez fait un super travail! Vraiment ... merci, ce sera très utile. – Cristian

+0

Brillant. J'ai bien travaillé pour moi. J'ai dû changer le 8 à un 9 pour spécifier le nom de fichier cependant. J'ai également légèrement modifié le chemin du dossier drawable car l'application en question utilise des dossiers supplémentaires pour la densité et l'orientation des pixels. – bhekman

10

Vérifiez ceci: http://code.google.com/p/android-unused-resources

MISE À JOUR 14.12.2011: vous pouvez maintenant trouver des ressources inutilisées et beaucoup plus aussi simple que possible. Mettre à jour vers ADT 16 et utiliser Android Lint. C'est un outil vraiment incroyable. Il peut trouver ressources inutilisées (pas seulement les chaînes) et beaucoup plus. A partir de son site officiel:

Here are some examples of the types of errors that it looks for: 

- Missing translations (and unused translations) 
- Layout performance problems (all the issues the old layoutopt tool used to find, and more) 
- Unused resources 
- Inconsistent array sizes (when arrays are defined in multiple configurations) 
- Accessibility and internationalization problems (hardcoded strings, missing contentDescription, etc) 
- Icon problems (like missing densities, duplicate icons, wrong sizes, etc) 
- Usability problems (like not specifying an input type on a text field) 
- Manifest errors 
and many more. 
Questions connexes