안드로이드 프로젝트에서 사용하지 않는 문자열을 찾는 간단한 방법이 있습니까?


152

에 많은 문자열이 선언 된 거대한 Android 프로젝트가 strings.xml있습니다. 에서 사용하지 않는 문자열을 제거하고 싶었습니다 strings.xml.

그렇게 쉬운 방법이 있습니까?

답변:


238

안드로이드 스튜디오 :

메뉴 -> 분석 -> 이름으로 검사 실행 -> 사용하지 않은 자원

확인 파일 마스크 (들) 체크 박스를 넣어 strings.xml텍스트 필드에.


2
그런 다음 사용하지 않는 문자열, 색상을 찾기 위해 -> -> 를 Custom scope선택하여 정의 할 수 있습니다 .Production classesappvalues
Jemshit Iskenderov

2
SDK Tools 26.0.2에서는 사용하지 않은 문자열을 찾지 못하지만 "사용 현황 찾기"에는 해당 사용법이 표시되지 않으며 실제로 사용 된 문자열도 사용됩니다.
user905686

문자열이 실제로 사용되는 BTW 때와 경고 린터 억제 할 수 있습니다 (코드에서 동적으로 참조)tools:ignore="UnusedResources"
jakub.g

4
이것은 예상대로 작동하지 않습니다. 사용하지 않는 문자열을 추가하고 검사했지만 시도 할 수 없습니다
chikka.anddev

이것은 깨진 것처럼 보였습니다. 많은 문자열이 사용되지 않았다고 생각했지만 빠른 "사용법 찾기"가 사용되었습니다. 조심해.
szaske

37

상당히 쉬운 또 다른 솔루션이 있습니다. Android Studio 메뉴에서

리팩토링은> 사용하지 않는 리소스를 제거 ... .

여기에 이미지 설명을 입력하십시오

미사용 리소스가 무엇인지 확인하고 선택적으로 제거 하려면 미리보기 를 클릭하십시오 .


1
이것은 실제로 사용 된 많은 자원을 제거했습니다. 많은 것들을 수동으로 삭제 취소해야했습니다
stoefln

1
@stoefln에서 미리보기를 클릭하면 삭제할 항목을 선택하고 삭제할 수 없습니다.
Suragch

1
"사용되지 않은 @id 선언도 삭제하십시오"를주의하십시오. 내 코드가 실제로 사용하고있는 많은 id를 삭제했습니다 (Kotlin Android Extension 플러그인-활동, 조각 및보기에서보기를 복구 할 수있게 해줍니다)
Dan Alboteanu

28

필자의 경우 "사용하지 않은 리소스 제거"를 사용하고 있음에도 불구하고 "이름으로 검사 실행"이 작동하지 않았습니다.

해결책:

  1. strings.xml 열기
  2. 보조 클릭
  3. 리 팩터-> 사용하지 않는 리소스 제거

"사용하지 않은 리소스 제거"가 한 가지 방법으로 작동하지만 다른 방법으로 작동하지 않는 이유는 전혀 없습니다.


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는 사용되지 않는 문자열을 찾지 않으며 주장하지도 않습니다. 방금 완전히 임의의 ID를 가진 문자열을 추가하고 Lint를 실행하여 테스트했습니다. 평판이 충분하지 않기 때문에 위의 답변에 투표 할 수 없습니다. (.
Frank Harper

@FrankHarper가 말했듯이 이전에는 없었습니다. 플래시 경이 말했듯이 지금은 다음과 같습니다.Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
serv-inc

3

string.xml을 확인하려면

쉽습니다 (적어도 내 버전의 Eclipse에서는)

Android 용 Eclipse에서 (버전 v22.6.2-1085508이 있습니다)

  • "패키지 탐색기"에서 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하십시오.
  • "Android 도구"를 선택하십시오.
  • "린트 실행 : 일반적인 오류 확인"을 선택하십시오.

이제 strings.xml을 열면 사용되지 않는 문자열이 강조 표시됩니다.

다른 잠재적 인 문제를 해결할 수 있습니다.


기본 파일에 번역이없는 문자열을 찾는 데 유용합니다.
ePeace

3

Android Studio Press에서

Ctlr + Alt + Shift + i

선택-> 미사용 리소스
미사용 문자열과 아이콘이 표시됩니다.

고마워요 해피 코딩 :)


3

이것이 Android 3.3에서 수행 한 방법입니다.

저장되지 않은 변경 사항을 저장소에 체크인하십시오.

  • 앱 모듈을 마우스 오른쪽 버튼으로 클릭-> 리 팩터-> 사용하지 않는 리소스 제거-> 미리보기
  • 리팩토링 미리보기에서 두보기 ( '삭제할 항목'및 '사용하지 않은 자원 선언')를 모두 축소하십시오.
  • '삭제할 항목'을 마우스 오른쪽 버튼으로 클릭-> 제외
  • '사용하지 않은 리소스 선언'을 마우스 오른쪽 버튼으로 클릭-> 제외
  • 이제 '사용하지 않은 리소스 선언'을 확장하고 그 아래에서 앱 특정 strings.xml을 찾으십시오 (여러 개의 strings.xml이 있음)
  • 해당 strings.xml-> 포함을 마우스 오른쪽 단추로 클릭하십시오.
  • 리팩터링하십시오! xml 파일에서 사용되지 않은 모든 문자열이 삭제됩니다!

참고 : 프로젝트를 빌드하십시오. 컴파일에 실패하면 이러한 strings.xml이 일부 레이아웃 / 메뉴 xml에서 참조 될 가능성이 높습니다. 따라서 해당 레이아웃 xml을 수동으로 삭제할 수도 있습니다!

빌드하고 실행하십시오. 테스트!


-1

프로젝트의 루트에서이 스크립트를 실행하십시오.

`fins res / values ​​/ *. xml`의 리소스 파일; 하다
  `grep '. * / \ 1 / g'의 문자열 이름; 하다
    count1 =`grep -rc "R.string. $ {stringname}"src | egrep -v ': 0 $'| 화장실 -l`
    count2 =`grep -rc "@string / $ {stringname}"해상도 / 레이아웃 | egrep -v ': 0 $'| 화장실 -l`
    count3 =`grep -rc "@string / $ {stringname}"해상도 / 메뉴 | egrep -v ': 0 $'| 화장실 -l`
    count4 =`grep -rc "@string / $ {stringname}"AndroidManifest.xml | egrep -v '^ 0 $'| 화장실 -l`
    count5 =`grep -rc "@string / $ {stringname}"res / xml | egrep -v ': 0 $'| 화장실 -l`
    [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0] 인 경우; 그때
      echo $ resourcefile : $ 문자열 이름
    fi
  끝난
끝난

`find res / drawable * -type f -name '*. ???'`의 리소스 이름; 하다
  resource =`echo $ resourcename | xargs 기본 이름 | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g"`
  count1 =`grep -rc "R \ .drawable \. $ {resource}"src | egrep -v ': 0 $'| 화장실 -l`
  count2 =`grep -rc "@drawable / $ {resource}"해상도 / 레이아웃 | egrep -v ': 0 $'| 화장실 -l`
  count3 =`grep -rc "@drawable / $ {resource}"res / drawable * / *. xml | egrep -v ': 0 $'| 화장실 -l`
  count4 =`grep -rc "@drawable / $ {resource}"해상도 / 메뉴 | egrep -v ': 0 $'| 화장실 -l`
  count5 =`grep -rc "@drawable / $ {resource}"AndroidManifest.xml | egrep -v '^ 0 $'| 화장실 -l`
  [$ count1 -eq 0 -a $ count2 -eq 0 -a $ count3 -eq 0 -a $ count4 -eq 0 -a $ count5 -eq 0] 인 경우; 그때
      echo $ resourcename
  fi
끝난

`find res / layout / *. xml`의 리소스 이름; 하다
  resource =`echo $ resourcename | xargs 기본 이름 | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g"`
  count1 =`grep -rc "R \ .layout \. $ {resource}"src | egrep -v ': 0 $'| 화장실 -l`
  [$ count1 -eq 0]이면; 그때
      echo $ resourcename
  fi
끝난

그것은 나에게 이런 종류의 출력을 제공합니다 :

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 프로젝트 구조와 호환되도록 수정해야합니다.
Mohammad Jafar Mashhadi

-1

누락 된 번역의 경우 :

InteliJ를 사용하여 InteliJ의 패널 표시 줄을 클릭하십시오. "분석"> "이름으로 검사 실행"> 입력 : 불완전한 번역

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.