Existe alguma maneira simples de descobrir cadeias não utilizadas no projeto Android?

152

Eu tenho um grande projeto Android com muitas strings declaradas strings.xml. Eu queria remover cordas não utilizadas strings.xml.

Existe alguma maneira fácil de fazer isso?

user556956
fonte

Respostas:

238

No Android Studio :

Menu -> Analisar -> Executar inspeção por nome -> Recursos não utilizados

Marque a caixa de seleção Máscara (s) de arquivo e coloque strings.xmlno campo de texto.

Oded Breiner
fonte
2
Em seguida, você pode definir Custom scope, escolhendo Production classes-> app-> valuespara encontrar cordas não utilizadas cores ...
Jemshit Iskenderov
2
Com o SDK Tools 26.0.2, isso não encontra minhas seqüências de caracteres não utilizadas, enquanto "Localizar usos" não mostra nenhum uso delas (e sim para as realmente usadas).
user905686
BTW, quando uma string é realmente usada (referenciada dinamicamente no código), você pode suprimir os avisos do linter comtools:ignore="UnusedResources"
jakub.g
4
este não está funcionando como esperado. Eu tentei adicionar cordas não utilizadas e inspecionar, mas ele não é capaz de identificá-las
Chikka.anddev
Isso parece quebrado, pensou que várias das minhas cordas não estavam sendo usadas, mas um rápido "encontrar usos" encontrou uso. Seja cuidadoso.
szaske 12/02
37

Aqui está outra solução que é bastante fácil. No menu do Android Studio, vá para

Refactor> Remover recursos não utilizados ... .

insira a descrição da imagem aqui

Clique em Visualizar para ver quais são os recursos não utilizados e removê-los seletivamente.

Suragch
fonte
1
Isso removeu muitos recursos que foram realmente usados. Tinha que recuperar manualmente muitas coisas
manualmente
1
@stoefln, se você clicar em Visualizar, poderá escolher manualmente o que excluir e não excluir.
Suragch
1
tome cuidado com "Exclua também as declarações @ id não utilizadas". É excluída me lotes de ID de que meu código estava realmente usando (plugin Kotlin Extensão Android - que permitirá recuperar pontos de vista de Actividades, fragmentos e Visualizações)
Dan Alboteanu
28

No meu caso, "Executar inspeção por nome" não funcionou, apesar de eu estar usando "Remover recursos não utilizados".

Solução:

  1. Abra strings.xml
  2. Clique secundário
  3. Refatorar -> Remover recursos não utilizados

Não faço idéia por que "Remover recursos não utilizados" funciona de uma maneira, mas não da outra.

cutiko
fonte
2
Você pode fazê-lo também no Project Explorer, selecione o módulo que deseja, clique em e refatorar direito> remover recursos não utilizados, a remover qualquer tipo de recurso como drawables não utilizados
FRL
22

Com o ADT 16, você pode fazer o mais simples possível. Atualize para o ADT 16 e use o Android Lint . É uma ferramenta realmente incrível. Ele pode encontrar todos os recursos não utilizados (não apenas as strings) e muito mais. Do seu site 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
fonte
11
A partir do ADT 20.0.2, o Android Lint não encontra Strings não utilizadas, nem afirma. Acabei de testar adicionando uma string com um ID completamente aleatório e executando o Lint. Não pude votar na resposta acima, porque não tenho reputação suficiente :(.
Frank Harper
Como o @FrankHarper disse: isso não acontecia anteriormente. Como Lord Flash disse, ele faz agora:Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
serv-inc
3

Para verificar string.xml.

É fácil (pelo menos na minha versão do Eclipse)

No Eclipse para Android (eu tenho a versão v22.6.2-1085508)

  • Clique com o botão direito do mouse no nome do projeto em "Package Explorer"
  • Selecione "Ferramentas Android".
  • Selecione "Run Lint: verifique se há erros comuns".

Agora, quando você abrir o arquivo strings.xml, verá que a seqüência não utilizada está destacada.

Você pode corrigir outros problemas em potencial.

Gabriel Klein
fonte
isto é útil para encontrar cordas que não têm tradução no arquivo padrão
ePeace
3

No Android Studio Press

Ctlr + Alt + Shift + i

Selecione -> Recursos não utilizados
não utilizados. Mostra seqüências de caracteres e ícones não utilizados.

Obrigado Feliz codificação :)

Happy Singh
fonte
3

Foi assim que fiz no Android 3.3.

Faça check-in de alterações não salvas no seu repositório.

  • Clique com o botão direito do mouse no módulo do seu aplicativo -> Refatorar -> Remover recursos não utilizados -> Visualizar
  • Na visualização de refatoração, reduza as duas exibições ('Itens a serem excluídos' e 'Declarações de recursos não utilizados')
  • Clique com o botão direito do mouse em 'Itens a serem excluídos' -> Excluir
  • Clique com o botão direito do mouse em 'Declarações de Recursos Não Utilizados' -> Excluir
  • Agora expanda 'Declarações de recursos não utilizados' e, em seguida, localize strings.xml específico do aplicativo (haveria várias strings.xmls)
  • Clique com o botão direito do mouse em strings.xml -> Incluir
  • Refatorar! Todas as strings não utilizadas do arquivo xml são excluídas!

Nota: Tente criar o projeto. Se a compilação falhar, é mais provável que essas strings.xml estejam sendo consultadas em alguns xmls de layout / menu, os quais não são utilizados. Portanto, esses xmls de layout também podem ser excluídos manualmente!

Construa e execute. Teste!

AAP
fonte
-1

Execute este script a partir da raiz do seu projeto.

para arquivo de recursos em `find res / values ​​/ *. xml`; Faz
  para stringname em `grep '. * / \ 1 / g'`; Faz
    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]; então
      echo $ resourcefile: $ stringname
    fi
  feito
feito

para resourcename em `find res / drawable * -type f -name '*. ???' '; Faz
  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 [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0]; então
      echo $ resourcename
  fi
feito

para resourcename em `find res / layout / *. xml`; Faz
  resource = `echo $ resourcename | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .layout \. $ {resource} "src | egrep -v ': 0 $' | wc -l`
  if [$ count1-eq 0]; então
      echo $ resourcename
  fi
feito

Isso me dá esse tipo de saída:

res / valores / activity_strings.xml: activity_more
res / valores / activity_strings.xml: activity_as_reply_to
res / valores / db_strings.xml: sql_backlog_count
res / valores / db_strings.xml: sql_backlog_update_last_resend
...
Carl D'Halluin
fonte
Abordagem legal, mas verifica se o nome do recurso não está nos comentários ou nas strings? Ele também precisa de algumas modificações para ser compatível com a nova estrutura de projeto do Android Studio.
Mohammad Jafar Mashhadi
-1

Apenas para a tradução ausente:

Usando o InteliJ, clique na barra de painel do seu InteliJ: "Analisar"> "Executar inspeção por nome"> Digite: Tradução incompleta

sancho21
fonte