Есть ли простой способ найти неиспользуемые строки в проекте Android?

152

У меня огромный проект Android со множеством строк, объявленных в strings.xml. Я хотел удалить неиспользуемые строки в strings.xml.

Есть ли простой способ сделать это?

user556956
источник

Ответы:

239

На Android Studio :

Меню -> Анализ -> Запустить проверку по имени -> Неиспользуемые ресурсы

Установите флажок File mask (s) и вставьте strings.xmlв текстовое поле.

Одед Брейнер
источник
2
Затем вы можете определить Custom scope, выбрав Production classes-> app-> valuesнайти неиспользуемые строки, цвета ...
Джемшит Искендеров
2
С SDK Tools 26.0.2 это не находит мои неиспользованные строки, в то время как «Find usages» не показывает их использование (и это действительно для тех, которые действительно используются).
user905686
Кстати, когда строка фактически используется (на которую динамически ссылаются в коде), вы можете подавить предупреждения, связанные с tools:ignore="UnusedResources"
линтером,
4
этот не работает, как ожидалось. Я попытался добавить неиспользованную строку и проверить ее, но не смог ее идентифицировать
chikka.anddev
Это кажется сломанным, он думал, что куча моих строк не использовалась, но быстрое «найти использование» нашло применение. Быть осторожен.
szaske
37

Вот еще одно решение, которое довольно легко. В меню Android Studio перейдите в

Refactor> Удалить неиспользуемые ресурсы ... .

введите описание изображения здесь

Нажмите « Просмотр», чтобы увидеть, что такое неиспользуемые ресурсы, и выборочно удалить их.

Suragch
источник
1
Это удалило много ресурсов, которые были фактически использованы. Пришлось вручную удалить много вещей
stoefln
1
@stoefln, если вы нажмете Preview, вы можете вручную выбрать, что удалять, а не удалять.
Сурагч
1
позаботьтесь о том, чтобы "Удалить неиспользуемые объявления @ id тоже". Он удалил мне много идентификаторов, которые на самом деле использовал мой код (плагин Kotlin Android Extension - который позволит восстанавливать представления из действий, фрагментов и представлений)
Дан Алботяну
28

В моем случае «Запуск проверки по имени» не работал, несмотря на то, что я использовал «Удалить неиспользуемые ресурсы».

Решение:

  1. Откройте strings.xml
  2. Вторичный клик
  3. Refactor -> Удалить неиспользуемые ресурсы

Я понятия не имею, почему «Удалить неиспользуемые ресурсы» работает одним способом, но не другим.

cutiko
источник
2
Вы также можете сделать это в проводнике проекта, выбрать нужный модуль, затем щелкнуть правой кнопкой мыши и выполнить рефакторинг> удалить неиспользуемые ресурсы, удалить любой вид ресурса, например неиспользуемые элементы рисования
FRL
22

С ADT 16 вы можете сделать это максимально просто. Обновите до ADT 16 и используйте Android Lint . Это действительно удивительный инструмент. Он может найти все неиспользованные ресурсы (не только строки) и многое другое. С его официального сайта:

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.
Андрей Буней
источник
11
Начиная с ADT 20.0.2 Android Lint не находит неиспользуемые строки и не претендует на это. Я только что проверил это, добавив строку с совершенно случайным идентификатором и затем запустив Lint. Я не могу проголосовать за ответ сверху вниз, потому что мне не хватает репутации :(.
Фрэнк Харпер,
Как сказал @FrankHarper: раньше этого не было. Как сказал Лорд Флэш, он делает это сейчас:Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
серв-ин
3

Чтобы проверить string.xml.

Это легко (по крайней мере, в моей версии Eclipse)

В Eclipse для Android (у меня версия v22.6.2-1085508)

  • Щелкните правой кнопкой мыши по названию проекта в «Проводнике пакетов».
  • Выберите «Инструменты Android».
  • Выберите «Run Lint: Проверка на наличие общих ошибок».

Теперь, когда вы откроете strings.xml, вы увидите, что неиспользуемая строка подсвечивается.

Вы можете исправить другие потенциальные проблемы.

Габриэль Кляйн
источник
это полезно для поиска строк, которые не имеют перевода в файле по умолчанию
ePeace
3

В Android Studio Press

Ctlr + Alt + Shift + I

Выберите -> Неиспользуемые ресурсы.
Здесь отображаются неиспользуемые неиспользуемые строки и значки.

Спасибо Счастливого кодирования :)

Счастливый Сингх
источник
3

Вот как я это сделал с Android 3.3.

Проверьте все несохраненные изменения в вашем хранилище.

  • Щелкните правой кнопкой мыши модуль вашего приложения -> Refactor -> Удалить неиспользуемые ресурсы -> Предварительный просмотр
  • В предварительном просмотре рефакторинга сверните оба представления («Элементы, которые нужно удалить» и «Объявления о неиспользованных ресурсах»)
  • Щелкните правой кнопкой мыши «Элементы для удаления» -> Исключить
  • Щелкните правой кнопкой мыши «Неиспользуемые объявления ресурсов» -> Исключить
  • Теперь разверните «Неиспользуемые объявления ресурсов» и под этим найдите специфическое для вашего приложения strings.xml (там будет несколько strings.xmls)
  • Щелкните правой кнопкой мыши на этом strings.xml -> Включить
  • Делать Рефакторинг! Все неиспользуемые строки из XML-файла будут удалены!

Примечание: попробуйте построить проект. Если компиляция завершится неудачно, наиболее вероятно, что эти strings.xml ссылаются из некоторого макета / меню xmls, которые сами по себе не используются. Таким образом, эти макеты XMLS также могут быть удалены вручную!

Сборка и запуск. Тест!

AAP
источник
-1

Запустите этот скрипт из корня вашего проекта.

для файла ресурсов в `find res / values ​​/ *. xml`; делать
  для имени строки в `grep '. * / \ 1 / g'`; делать
    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]; затем
      echo $ resourcefile: $ stringname
    фи
  сделано
сделано

для имени ресурса в `find res / drawable * -type f -name '*. ???'`; делать
  resource = `echo $ resourcename | xargs базовое имя | 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]; затем
      echo $ resourcename
  фи
сделано

для имени ресурса в `find res / layout / *. xml`; делать
  resource = `echo $ resourcename | xargs базовое имя | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .layout \. $ {resource} "src | egrep -v ': 0 $' | wc -l`
  if [$ count1 -eq 0]; затем
      echo $ resourcename
  фи
сделано

Это дает мне такой вывод:

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
...
Карл д'Халлуин
источник
Классный подход, но проверяет ли он, нет ли имени ресурса в комментариях или строках? Требуются некоторые модификации, чтобы быть совместимым с новой структурой проекта Android Studio.
Мухаммед Джафар Машхади
-1

Только для отсутствующего перевода:

Используя InteliJ, нажмите на панели панели вашего InteliJ: «Анализ»> «Запустить проверку по имени»> Введите: Незавершенный перевод

sancho21
источник