Existe-t-il un moyen simple de découvrir les chaînes inutilisées dans un projet Android?

152

J'ai un énorme projet Android avec de nombreuses chaînes déclarées strings.xml. Je voulais supprimer les chaînes inutilisées dans strings.xml.

Existe-t-il un moyen simple de le faire?

user556956
la source

Réponses:

239

Sur Android Studio :

Menu -> Analyser -> Exécuter l'inspection par nom -> Ressources inutilisées

Cochez la case Masque (s) de fichier et placez-la strings.xmldans le champ de texte.

Oded Breiner
la source
2
Ensuite, vous pouvez définir Custom scope, en choisissant Production classes-> app-> valuespour trouver des chaînes, des couleurs inutilisées ...
Jemshit Iskenderov
2
Avec SDK Tools 26.0.2, cela ne trouve pas mes chaînes inutilisées tandis que "Find usages" n'en montre aucune utilisation (et il le fait pour celles réellement utilisées).
user905686
BTW lorsqu'une chaîne est réellement utilisée (référencée dynamiquement dans le code), vous pouvez supprimer les avertissements de linter avectools:ignore="UnusedResources"
jakub.g
4
celui-ci ne fonctionne pas comme prévu. J'ai essayé d'ajouter une chaîne inutilisée et d'inspecter, mais je ne
parviens
Cela semble cassé, il pensait qu'un tas de mes chaînes étaient inutilisées, mais un rapide "trouver des usages" a trouvé une utilité. Faites attention.
szaske le
37

Voici une autre solution assez simple. Dans le menu Android Studio, accédez à

Restructurer> Retirer les ressources non utilisées ... .

entrez la description de l'image ici

Cliquez sur Aperçu pour voir quelles sont les ressources inutilisées et les supprimer de manière sélective.

Suragch
la source
1
Cela a supprimé beaucoup de ressources qui étaient réellement utilisées. J'ai dû restaurer manuellement beaucoup de choses
stoefln
1
@stoefln, si vous cliquez sur Aperçu, vous pouvez choisir manuellement les éléments à supprimer et non à supprimer.
Suragch
1
faites attention à "Supprimer également les déclarations @ id inutilisées". Cela m'a supprimé beaucoup d'identifiants que mon code utilisait réellement (plugin Kotlin Android Extension - qui permettra de récupérer des vues à partir d'activités, de fragments et de vues)
Dan Alboteanu
28

Dans mon cas, "Exécuter l'inspection par nom" n'a pas fonctionné, malgré le fait que j'utilisais "Supprimer les ressources inutilisées".

Solution:

  1. Ouvrez strings.xml
  2. Clic secondaire
  3. Refactoriser -> Supprimer les ressources inutilisées

Je n'ai aucune idée de la raison pour laquelle "Supprimer les ressources inutilisées" fonctionne dans un sens mais pas dans l'autre.

Cutiko
la source
2
Vous pouvez le faire aussi dans l'explorateur de projet, sélectionnez le module que vous voulez, puis faites un clic droit et refactor> supprimer les ressources inutilisées, supprimer tout type de ressource comme les drawables inutilisés
FRL
22

Avec ADT 16, vous pouvez le faire aussi simplement que possible. Mettez à jour vers ADT 16 et utilisez Android Lint . C'est un outil vraiment incroyable. Il peut trouver toutes les ressources inutilisées (pas seulement les chaînes) et bien d'autres. Depuis 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.
Andrei Buneyeu
la source
11
Depuis ADT 20.0.2, Android Lint ne trouve pas les chaînes inutilisées et ne le prétend pas. Je viens de le tester en ajoutant une chaîne avec un identifiant complètement aléatoire, puis en exécutant Lint. Je n'ai pas pu voter pour répondre ci-dessus, car je n'ai pas assez de réputation :(.
Frank Harper
Comme l'a dit @FrankHarper: ce n'était pas le cas auparavant. Comme l'a dit Lord Flash, il le fait maintenant:Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
serv-inc
3

Pour vérifier string.xml.

C'est facile (du moins dans ma version d'Eclipse)

Dans Eclipse pour Android (j'ai la version v22.6.2-1085508)

  • Faites un clic droit sur le nom du projet dans "Explorateur de packages"
  • Sélectionnez "Outils Android".
  • Sélectionnez "Run Lint: Check for common errors".

Maintenant, lorsque vous ouvrez strings.xml, vous verrez que la chaîne inutilisée est mise en surbrillance.

Vous pouvez résoudre d'autres problèmes potentiels.

Gabriel Klein
la source
ceci est utile pour trouver des chaînes qui n'ont pas de traduction dans le fichier par défaut
ePeace
3

Dans Android Studio Press

Ctlr + Alt + Maj + i

Sélectionnez -> Ressources inutilisées
Il vous montre des chaînes et des icônes inutilisées et inutilisées.

Merci Bon codage :)

Heureux Singh
la source
3

C'est ainsi que je l'ai fait avec Android 3.3.

Archivez toutes les modifications non enregistrées dans votre référentiel.

  • Cliquez avec le bouton droit sur le module de votre application -> Refactoriser -> Supprimer les ressources inutilisées -> Aperçu
  • Dans l'aperçu du refactoring, réduisez les deux vues ("Éléments à supprimer" et "Déclarations de ressources inutilisées")
  • Cliquez avec le bouton droit sur 'Éléments à supprimer' -> Exclure
  • Cliquez avec le bouton droit sur «Déclarations de ressources inutilisées» -> Exclure
  • Maintenant, développez `` Déclarations de ressources inutilisées '' et sous cela, localisez votre application spécifique strings.xml (il y aurait plusieurs strings.xmls)
  • Faites un clic droit sur strings.xml -> Inclure
  • Faites Refactor! Toutes les chaînes inutilisées du fichier xml sont supprimées!

Remarque: essayez de créer le projet. Si la compilation échoue, il est fort probable que ces strings.xml soient référencés à partir de certains fichiers XML de disposition / menu, qui eux-mêmes ne sont pas utilisés. Ainsi, ces fichiers XML de mise en page peuvent également être supprimés manuellement!

Construisez et exécutez. Tester!

AAP
la source
-1

Exécutez ce script à partir de la racine de votre projet.

pour le fichier de ressources dans `find res / values ​​/ *. xml`; faire
  pour stringname dans `grep '. * / \ 1 / g'`; faire
    count1 = `grep -rc" R.string. $ {stringname} "src | egrep -v ': 0 $' | wc -l`
    count2 = `grep -rc" @string / $ {stringname} "res / layout | egrep -v ': 0 $' | wc -l`
    count3 = `grep -rc" @string / $ {stringname} "res / menu | egrep -v ': 0 $' | wc -l`
    count4 = `grep -rc" @string / $ {stringname} "AndroidManifest.xml | egrep -v '^ 0 $' | wc -l`
    count5 = `grep -rc" @string / $ {stringname} "res / xml | egrep -v ': 0 $' | wc -l`
    if [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0]; puis
      echo $ resourcefile: $ stringname
    Fi
  terminé
terminé

pour resourcename dans `find res / drawable * -type f -name '*. ???'`; faire
  resource = `echo $ resourcename | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .drawable \. $ {ressource} "src | egrep -v ': 0 $' | wc -l`
  count2 = `grep -rc" @drawable / $ {resource} "res / layout | egrep -v ': 0 $' | wc -l`
  count3 = `grep -rc" @drawable / $ {resource} "res / drawable * / *. xml | egrep -v ': 0 $' | wc -l`
  count4 = `grep -rc" @drawable / $ {ressource} "res / menu | egrep -v ': 0 $' | wc -l`
  count5 = `grep -rc" @drawable / $ {resource} "AndroidManifest.xml | egrep -v '^ 0 $' | wc -l`
  if [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0]; puis
      echo $ resourcename
  Fi
terminé

pour le nom de ressource dans `find res / layout / *. xml`; faire
  resource = `echo $ resourcename | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .layout \. $ {ressource} "src | egrep -v ': 0 $' | wc -l`
  si [$ count1 -eq 0]; puis
      echo $ resourcename
  Fi
terminé

Cela me donne ce genre de sortie:

res / values ​​/ activity_strings.xml: activity_more
res / values ​​/ activity_strings.xml: activity_as_reply_to
res / values ​​/ db_strings.xml: sql_backlog_count
res / values ​​/ db_strings.xml: sql_backlog_update_last_resend
...
Carl D'Halluin
la source
Approche cool mais vérifie-t-elle si le nom de la ressource n'est pas dans des commentaires ou des chaînes? Il a également besoin de quelques modifications pour être compatible avec la nouvelle structure de projet Android Studio.
Mohammad Jafar Mashhadi
-1

Pour la traduction manquante uniquement:

À l'aide d'InteliJ, cliquez sur la barre du panneau de votre InteliJ: "Analyser"> "Exécuter l'inspection par nom"> Tapez: Traduction incomplète

sancho21
la source