¿Hay alguna manera simple de descubrir cadenas no utilizadas en el proyecto de Android?

152

Tengo un gran proyecto de Android con muchas cadenas declaradas strings.xml. Quería eliminar cadenas no utilizadas strings.xml.

¿Hay alguna manera fácil de hacerlo?

usuario556956
fuente

Respuestas:

238

En Android Studio :

Menú -> Analizar -> Ejecutar inspección por nombre -> Recursos no utilizados

Marque la casilla de verificación Máscaras de archivo y colóquelas strings.xmlen el campo de texto.

Breder Oded
fuente
2
Luego puede definir Custom scope, eligiendo Production classes-> app-> valuespara encontrar cadenas no utilizadas, colores ...
Jemshit Iskenderov
2
Con SDK Tools 26.0.2, esto no encuentra mis cadenas no utilizadas, mientras que "Buscar usos" no muestra ningún uso de ellas (y lo hace para las que realmente se usan).
user905686
Por cierto, cuando realmente se usa una cadena (referenciada dinámicamente en el código), puede suprimir las advertencias de linter contools:ignore="UnusedResources"
jakub.g
44
Este no funciona como se esperaba. He intentado agregar una cadena no utilizada e inspeccionar, pero no puede identificarlo
chikka.anddev
Esto parece roto, pensó que un montón de mis cadenas no se usaban, pero un rápido "encontrar usos" encontró uso. Ten cuidado.
szaske
37

Aquí hay otra solución que es bastante fácil. En el menú de Android Studio, vaya a

Refactor> Eliminar los recursos no utilizados ... .

ingrese la descripción de la imagen aquí

Haga clic en Vista previa para ver cuáles son los recursos no utilizados y eliminarlos selectivamente.

Suragch
fuente
1
Esto eliminó muchos recursos que realmente se utilizaron. Tuve que recuperar manualmente muchas cosas
stoefln
1
@stoefln, si hace clic en Vista previa, puede elegir manualmente qué eliminar y no eliminar.
Suragch
1
tenga cuidado con eso de "Eliminar también las declaraciones de ID no utilizadas". Me borró muchas identificaciones que mi código realmente estaba usando (complemento de extensión de Android Kotlin, que permitirá recuperar vistas de actividades, fragmentos y vistas)
Dan Alboteanu
28

En mi caso, "Ejecutar inspección por nombre" no funcionó, a pesar de que estaba usando "Eliminar recursos no utilizados".

Solución:

  1. Abrir strings.xml
  2. Clic secundario
  3. Refactorizar -> Eliminar recursos no utilizados

No tengo idea de por qué "Eliminar recursos no utilizados" funciona de una manera pero no de la otra.

cutiko
fuente
2
También puede hacerlo en el explorador de proyectos, seleccione el módulo que desee, luego haga clic con el botón derecho y refactorice> elimine recursos no utilizados, elimine cualquier tipo de recurso como elementos extraíbles no utilizados
FRL
22

Con ADT 16 puedes hacerlo lo más simple posible. Actualice a ADT 16 y use Android Lint . Es una herramienta realmente asombrosa. Puede encontrar todos los recursos no utilizados (no solo cadenas) y muchos más. Desde su sitio oficial:

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
fuente
11
A partir de ADT 20.0.2, Android Lint no encuentra cadenas no utilizadas, ni tampoco afirma. Simplemente lo probé agregando una cadena con una identificación completamente aleatoria y luego ejecutando Lint. No pude votar la respuesta arriba, porque no tengo suficiente reputación :(.
Frank Harper
Como dijo @FrankHarper: no lo hizo anteriormente. Como Lord Flash dijo, ahora lo hace:Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
serv-inc
3

Para verificar string.xml.

Es fácil (al menos en mi versión de Eclipse)

En Eclipse para Android (tengo la versión v22.6.2-1085508)

  • Haga clic derecho en el nombre del proyecto en "Explorador de paquetes"
  • Seleccione "Herramientas de Android".
  • Seleccione "Ejecutar pelusa: verificar errores comunes".

Ahora, cuando abra strings.xml, verá que la cadena no utilizada está resaltada.

Puede solucionar otros problemas potenciales.

Gabriel Klein
fuente
esto es útil para encontrar cadenas que no tienen una traducción en el archivo predeterminado
ePeace
3

En Android Studio Press

Ctlr + Alt + Mayús + i

Seleccione -> Recursos no utilizados
Le muestra cadenas e iconos no utilizados.

Gracias feliz codificación :)

Feliz singh
fuente
3

Así es como lo hice con Android 3.3.

Registre cualquier cambio no guardado en su repositorio.

  • Haga clic derecho en el módulo de su aplicación -> Refactor -> Eliminar recursos no utilizados -> Vista previa
  • En la Vista previa de refactorización, contraiga ambas vistas ('Elementos a eliminar' y 'Declaraciones de recursos no utilizados')
  • Haga clic con el botón derecho en 'Elementos para eliminar' -> Excluir
  • Haga clic con el botón derecho en 'Declaraciones de recursos no utilizados' -> Excluir
  • Ahora expanda 'Declaraciones de recursos no utilizados' y debajo de eso ubique strings.xml específicos de su aplicación (habría múltiples strings.xmls)
  • Haga clic derecho en ese strings.xml -> Incluir
  • ¡Refactorizar! ¡Se eliminan todas las cadenas no utilizadas del archivo xml!

Nota: intente construir el proyecto. Si la compilación falla, lo más probable es que estos strings.xml se refieran desde algún diseño / menú xmls, que no se utilizan. ¡Así que esos xmls de diseño también se pueden eliminar manualmente!

Construye y corre. ¡Prueba!

AAP
fuente
-1

Ejecute este script desde la raíz de su proyecto.

para el archivo de recursos en `find res / values ​​/ *. xml`; hacer
  para stringname en `grep '. * / \ 1 / g' '; hacer
    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 [$ cuenta1 -eq 0 -a $ cuenta2 -eq 0 -a $ cuenta3 -eq 0 -a $ cuenta4 -eq 0 -a $ cuenta5 -eq 0]; luego
      echo $ resourcefile: $ stringname
    fi
  hecho
hecho

para resourcename en `find res / drawable * -type f -name '*. ???' '; hacer
  resource = `echo $ resourcename | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .drawable \. $ {resource} "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 / $ {resource} "res / menu | egrep -v ': 0 $' | wc -l`
  count5 = `grep -rc" @drawable / $ {resource} "AndroidManifest.xml | egrep -v '^ 0 $' | wc -l`
  if [$ cuenta1 -eq 0 -a $ cuenta2 -eq 0 -a $ cuenta3 -eq 0 -a $ cuenta4 -eq 0 -a $ cuenta5 -eq 0]; luego
      echo $ resourcename
  fi
hecho

para resourcename en `find res / layout / *. xml`; hacer
  resource = `echo $ resourcename | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .layout \. $ {resource} "src | egrep -v ': 0 $' | wc -l`
  si [$ cuenta1 -eq 0]; luego
      echo $ resourcename
  fi
hecho

Me da este tipo de salida:

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
fuente
Enfoque genial, pero ¿comprueba si el nombre del recurso no está en comentarios o cadenas? También necesita algunas modificaciones para ser compatible con la nueva estructura de proyecto de Android Studio.
Mohammad Jafar Mashhadi
-1

Solo para traducción faltante:

Con InteliJ, haga clic en la barra del panel de su InteliJ: "Analizar"> "Ejecutar inspección por nombre"> Escriba: Traducción incompleta

sancho21
fuente