Czy istnieje prosty sposób na znalezienie nieużywanych ciągów znaków w projekcie systemu Android?

152

Mam ogromny projekt na Androida z wieloma ciągami zadeklarowanymi w strings.xml. Chciałem usunąć nieużywane ciągi w strings.xml.

Czy jest na to łatwy sposób?

user556956
źródło

Odpowiedzi:

238

W Android Studio :

Menu -> Analiza -> Uruchom inspekcję według nazwy -> Nieużywane zasoby

Zaznacz pole wyboru Maski plików i umieść je strings.xmlw polu tekstowym.

Oded Breiner
źródło
2
Następnie możesz zdefiniować Custom scope, wybierając Production classes-> app-> valuesaby znaleźć nieużywane struny, kolory ...
Jemshit Iskenderov
2
W przypadku SDK Tools 26.0.2 nie znajduje to moich nieużywanych ciągów, podczas gdy „Find usages” nie pokazuje żadnego ich użycia (i tak jest w przypadku faktycznie używanych).
user905686
tools:ignore="UnusedResources"
Swoją drogą,
4
ten nie działa zgodnie z oczekiwaniami. Próbowałem dodać nieużywany ciąg i sprawdzić, ale nie jest w stanie go zidentyfikować
chikka.anddev
Wygląda na to, że jest zepsuty, pomyślał, że kilka moich strun jest nieużywanych, ale szybkie „znajdź zastosowania” znalazło zastosowanie. Bądź ostrożny.
szaske
37

Oto inne rozwiązanie, które jest dość łatwe. W menu Android Studio przejdź do

Refactor> Usuń niewykorzystane zasoby ... .

wprowadź opis obrazu tutaj

Kliknij Podgląd, aby zobaczyć, jakie są nieużywane zasoby i selektywnie je usunąć.

Suragch
źródło
1
To usunęło wiele zasobów, które były faktycznie używane. Musiałem ręcznie przywrócić wiele rzeczy
stoefln
1
@stoefln, jeśli klikniesz Podgląd, możesz ręcznie wybrać, co chcesz usunąć, a czego nie.
Suragch
1
uważaj na "Usuń również nieużywane deklaracje @ id". Usunęło mi to wiele identyfikatorów, których faktycznie używał mój kod (wtyczka Kotlin Android Extension - która pozwoli odzyskać widoki z działań, fragmentów i widoków)
Dan Alboteanu
28

W moim przypadku „Uruchom inspekcję według nazwy” nie działało, mimo że korzystałem z opcji „Usuń nieużywane zasoby”.

Rozwiązanie:

  1. Otwórz plik strings.xml
  2. Dodatkowe kliknięcie
  3. Refaktoryzacja -> Usuń nieużywane zasoby

Nie mam pojęcia, dlaczego „Usuń nieużywane zasoby” działa w jedną stronę, ale nie w drugą.

cutiko
źródło
2
Możesz to zrobić również w eksploratorze projektów, wybierz żądany moduł, a następnie kliknij prawym przyciskiem myszy i refaktoryzuj> usuń nieużywane zasoby, usuń wszelkiego rodzaju zasoby, takie jak nieużywane rysunki
FRL
22

Z ADT 16 możesz to zrobić tak prosto, jak to tylko możliwe. Zaktualizuj do ADT 16 i użyj Android Lint . To naprawdę niesamowite narzędzie. Może znaleźć wszystkie nieużywane zasoby (nie tylko ciągi znaków) i wiele innych. Z jego oficjalnej strony:

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
źródło
11
Od ADT 20.0.2 Android Lint nie znajduje nieużywanych ciągów znaków ani nie twierdzi, że. Właśnie przetestowałem to, dodając ciąg z całkowicie losowym identyfikatorem, a następnie uruchamiając Lint. Nie mogłem zagłosować powyżej w dół, ponieważ nie mam wystarczającej reputacji :(.
Frank Harper.
Jak powiedział @FrankHarper: wcześniej nie. Jak powiedział Lord Flash, dzieje się to teraz:Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
serv-inc
3

Aby sprawdzić string.xml.

To łatwe (przynajmniej w mojej wersji Eclipse)

W Eclipse na Androida (mam wersję v22.6.2-1085508)

  • Kliknij prawym przyciskiem myszy nazwę projektu w „Eksploratorze pakietów”
  • Wybierz „Narzędzia Androida”.
  • Wybierz „Run Lint: Check for common Errors”.

Teraz, kiedy otworzysz strings.xml, zobaczysz, że nieużywany ciąg jest podświetlony.

Możesz rozwiązać inne potencjalne problemy.

Gabriel Klein
źródło
jest to przydatne, aby znaleźć ciągi, które nie mają tłumaczenia w domyślnym pliku
ePeace
3

W Android Studio Press

Ctlr + Alt + Shift + i

Wybierz -> Nieużywane zasoby
Pokazuje nieużywane nieużywane ciągi i ikony.

Dzięki Miłego kodowania :)

Szczęśliwy Singh
źródło
3

Tak to zrobiłem z Androidem 3.3.

Sprawdź wszelkie niezapisane zmiany w swoim repozytorium.

  • Kliknij prawym przyciskiem myszy moduł aplikacji -> Refaktoryzuj -> Usuń nieużywane zasoby -> Podgląd
  • W podglądzie refaktoryzacji zwiń oba widoki („Elementy do usunięcia” i „Deklaracje nieużywanych zasobów”)
  • Kliknij prawym przyciskiem myszy „Elementy do usunięcia” -> Wyklucz
  • Kliknij prawym przyciskiem myszy „Deklaracje nieużywanych zasobów” -> Wyklucz
  • Teraz rozwiń `` Nieużywane deklaracje zasobów '' i pod tym zlokalizuj specyficzne dla aplikacji ciągi.xml (będzie wiele ciągów znaków.xml)
  • Kliknij prawym przyciskiem myszy ten strings.xml -> Uwzględnij
  • Zrób refaktoryzację! Wszystkie nieużywane ciągi z pliku xml są usuwane!

Uwaga: spróbuj zbudować projekt. Jeśli kompilacja się nie powiedzie, najprawdopodobniej ten plik strings.xml jest wywoływany z niektórych plików XML układu / menu, które same nie są używane. Więc te pliki XML układu można również usunąć ręcznie!

Buduj i uruchamiaj. Test!

AAP
źródło
-1

Uruchom ten skrypt z katalogu głównego projektu.

dla pliku zasobów w `find res / values ​​/ *. xml`; robić
  dla stringname w `grep '. * / \ 1 / g'`; robić
    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]; następnie
      echo $ resourcefile: $ stringname
    fi
  Gotowe
Gotowe

dla resourcename w `find res / drawable * -type f -name '*. ???' ''; robić
  zasób = `echo $ nazwa_zasobu | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .drawable \. $ {zasób} "src | egrep -v ': 0 $' | wc -l`
  count2 = `grep -rc" @drawable / $ {zasób} "res / layout | egrep -v ': 0 $' | wc -l`
  count3 = `grep -rc" @drawable / $ {resource} "res / drawable * / *. xml | egrep -v ': 0 $' | wc -l`
  count4 = `grep -rc" @drawable / $ {zasób} "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]; następnie
      echo $ resourcename
  fi
Gotowe

dla resourcename w `find res / layout / *. xml`; robić
  zasób = `echo $ nazwa_zasobu | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .layout \. $ {zasób} "src | egrep -v ': 0 $' | wc -l`
  if [$ count1 -eq 0]; następnie
      echo $ resourcename
  fi
Gotowe

Daje mi taki wynik:

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
źródło
Fajne podejście, ale czy sprawdza, czy nazwa zasobu nie znajduje się w komentarzach lub ciągach? Wymaga pewnych modyfikacji, aby był kompatybilny z nową strukturą projektu Android Studio.
Mohammad Jafar Mashhadi
-1

Tylko w przypadku brakującego tłumaczenia:

Używając InteliJ, kliknij na pasku panelu swojego InteliJ: „Analiza”> „Uruchom kontrolę według nazwy”> Wpisz: Niekompletne tłumaczenie

sancho21
źródło