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?

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.


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ąć.


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ą.


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.

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.


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 :)


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!


-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
...

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.