Чи є простий спосіб дізнатися невикористані рядки в проекті Android?


152

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

Чи є простий спосіб зробити це?

Відповіді:


238

В Android Studio :

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

Установіть прапорець Маски (и) файлів і поставте strings.xmlв текстовому полі.


2
Потім ви можете визначитись Custom scope, вибравши Production classes-> app-> valuesзнайти невикористані рядки, кольори ...
— Jemshit Iskenderov

2
З інструментами SDK 26.0.2 це не знаходить мої невикористані рядки, в той час як "Знайти звички" не показує їх використання (і для тих, хто фактично використовувався).
— користувач905686

BTW, коли рядок фактично використовується (динамічно посилається на код), ви можете придушити попередження лінійки за допомогоюtools:ignore="UnusedResources"
— jakub.g

4
цей не працює, як очікувалося. Я спробував додати невикористаний рядок та перевірити, але він не в змозі його визначити
— chikka.anddev

Це здається ламаним, він вважав, що купу моїх струн не використовуються, але швидке «знайди звичаї» знайшло застосування. Будь обережний.
— szaske

37

Ось ще одне рішення, яке досить легко. У меню Android Studio перейдіть до

Рефакторинг> Видалити невживані ресурси ... .

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

Клацніть Попередній перегляд, щоб побачити, що є невикористаними ресурсами, і вибірково їх видаліть.


1
Це вилучило багато ресурсів, які фактично використовувалися. Довелося вручну
— зняти

1
@stoefln, якщо натиснути Попередній перегляд, ви можете вручну вибрати, що видалити, а не видалити.
— Сурагч

1
подбайте про те, щоб "Видалити також невикористані декларації @ id". Він видалив мені безліч ідентифікаторів, які мій код використовував насправді (плагін Kotlin Android Extension - це дозволить відновити перегляди з діяльності, фрагментів та переглядів)
— Dan Alboteanu

28

У моєму випадку "Запустити перевірку по імені" не спрацювало, незважаючи на те, що я використовував "Видалити невикористані ресурси".

Рішення:

  1. Відкрийте strings.xml
  2. Вторинне клацання
  3. Refactor -> Видалення невикористаних ресурсів

У мене немає поняття, чому "Видалити невикористані ресурси" працює одним способом, а не іншим.


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".
  • Виберіть "Запуск Lint: Перевірте на поширені помилки".

Тепер, коли ви відкриєте strings.xml, ви побачите, що невикористана рядок виділяється.

Ви можете виправити інші потенційні проблеми.


це корисно для пошуку рядків, які не мають перекладу у файлі за замовчуванням
— ePeace

3

В Android Studio Press

Ctlr + Alt + Shift + i

Виберіть -> Невикористані ресурси
Показує невикористані невикористані рядки та піктограми.

Дякую Щасливе кодування :)


3

Ось так я це зробив з Android 3.3.

Перевірте будь-які незбережені зміни у вашому сховищі.

  • Клацніть правою кнопкою миші модуль програми -> Refactor -> Видалити невикористані ресурси -> Попередній перегляд
  • У Попередньому перегляді Refactoring згортайте обидва погляди ("Елементи, які потрібно видалити" та "Невикористані декларації ресурсів")
  • Клацніть правою кнопкою миші «Елементи, які потрібно видалити» -> Виключити
  • Клацніть правою кнопкою миші "Невикористані декларації ресурсу" -> Виключити
  • Тепер розгорніть "Невикористані декларації ресурсу" і під цим знайдіть для програми ваш додаток strings.xml (було б декілька strings.xmls)
  • Клацніть правою кнопкою миші та strings.xml -> Включити
  • Зробіть Refactor! Усі невикористані рядки з файлу XML видалено!

Примітка. Спробуйте створити проект. Якщо компіляція не вдасться, найімовірніше, що ці strings.xml пересилаються з деяких макетів / меню xmls, які самі не використовуються. Тож ці макети xmls можна також видалити вручну!

Побудувати та запустити. Тест!


-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`
    якщо [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0]; тоді
      echo $ resourcefile: $ stringname
    фі
  зроблено
зроблено

для імені ресурсу в `find res / dravable * -тип f -name '*. ???'`; робити
  resource = `echo $ resourcename | базове ім'я xargs | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .dravable \. $ {resource} "src | egrep -v ': 0 $' | wc -l`
  count2 = `grep -rc" @drawable / $ {resource} "res / layout | egrep -v ': 0 $' | wc -l`
  count3 = `grep -rc" @dravable / $ {resource} "res / dravable * / *. 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`
  якщо [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0]; тоді
      echo $ ім'я ресурсу
  фі
зроблено

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

Це дає мені такий вихід:

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: "Аналіз"> "Запустити перевірку за назвою"> Введіть: Неповний переклад

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.