มีวิธีง่ายๆในการค้นหาสตริงที่ไม่ได้ใช้ในโครงการ Android หรือไม่?


152

ผมมีโครงการขนาดใหญ่ที่มี Android strings.xmlสตริงหลายประกาศใน strings.xmlผมอยากจะเอาสายที่ไม่ได้ใช้ใน

มีวิธีง่าย ๆ ในการทำเช่นนั้น?

คำตอบ:


238

บนAndroid Studio :

เมนู -> วิเคราะห์ -> เรียกใช้การตรวจสอบตามชื่อ ->ทรัพยากรที่ไม่ได้ใช้

ตรวจสอบหน้ากากไฟล์ (s)ช่องทำเครื่องหมายและใส่strings.xmlในช่องข้อความ


2
จากนั้นคุณสามารถกำหนดCustom scopeเลือกProduction classes-> app-> valuesเพื่อค้นหาสตริงที่ไม่ได้ใช้สี ...
Jemshit Iskenderov

2
ด้วยเครื่องมือ SDK 26.0.2 สิ่งนี้จะไม่พบสตริงที่ไม่ได้ใช้ของฉันในขณะที่ "ค้นหาประเพณี" ไม่แสดงการใช้งานใด ๆ ของไฟล์เหล่านั้น
user905686

BTW เมื่อใช้สตริงจริง (อ้างอิงในโค้ดแบบไดนามิก) คุณสามารถระงับคำเตือน linter ด้วยtools:ignore="UnusedResources"
jakub.g

4
อันนี้ไม่ทำงานตามที่คาดไว้ ฉันได้ลองเพิ่มสตริงที่ไม่ได้ใช้และตรวจสอบแล้ว แต่ไม่สามารถระบุได้
chikka.anddev

ดูเหมือนว่าจะใช้งานไม่ได้เพราะคิดว่าสตริงของฉันไม่ได้ใช้ แต่พบ "การใช้ประโยชน์" อย่างรวดเร็ว ระวัง.
szaske

37

นี่เป็นอีกวิธีการหนึ่งที่ค่อนข้างง่าย ในเมนู Android Studio ให้ไปที่

Refactor> นำทรัพยากรที่ไม่ได้ใช้ ...

ป้อนคำอธิบายรูปภาพที่นี่

คลิกดูตัวอย่างเพื่อดูว่าทรัพยากรที่ไม่ได้ใช้คืออะไร


1
สิ่งนี้ลบทรัพยากรจำนวนมากซึ่งใช้งานจริง ต้องยกเลิกการลบข้อมูลจำนวนมากด้วยตนเอง
แก้ปัญหาเมื่อ

1
@stoefln หากคุณคลิกดูตัวอย่างคุณสามารถเลือกสิ่งที่จะลบและไม่ลบได้ด้วยตนเอง
Suragch

1
โปรดระมัดระวังด้วย "ลบการประกาศ @ id ที่ไม่ได้ใช้ด้วย" มันลบรหัสประจำตัวของฉันจำนวนมากที่รหัสของฉันใช้งานจริง (ปลั๊กอินเสริม Kotlin สำหรับ Android - ที่จะช่วยให้สามารถกู้คืนมุมมองจากกิจกรรมชิ้นส่วนและมุมมอง)
Dan Alboteanu

28

ในกรณีของฉัน "Run Inspection by Name" ไม่ทำงานแม้ว่าฉันจะใช้ "ลบทรัพยากรที่ไม่ได้ใช้"

สารละลาย:

  1. เปิด strings.xml
  2. คลิกรอง
  3. Refactor -> ลบทรัพยากรที่ไม่ได้ใช้

ฉันไม่มีเงื่อนงำว่าทำไม "นำทรัพยากรที่ไม่ได้ใช้" ออกใช้งานได้ทางเดียว แต่ไม่ใช่วิธีอื่น


2
คุณสามารถทำมันได้ใน project explorer เลือกโมดูลที่คุณต้องการจากนั้นคลิกขวาและสร้างใหม่> ลบทรัพยากรที่ไม่ได้ใช้ออกลบทรัพยากรชนิดใด ๆ เช่น drawable ที่ไม่ได้ใช้
FRL

22

ด้วย ADT 16 คุณสามารถทำได้ง่ายที่สุด Update เพื่อ ADT 16 และการใช้งานAndroid ผ้าสำลี มันเป็นเครื่องมือที่น่าทึ่งจริงๆ มันสามารถค้นหาทรัพยากรที่ไม่ได้ใช้งานทั้งหมด (ไม่เพียง แต่สตริง) และอีกมากมาย จากเว็บไซต์อย่างเป็นทางการ:

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 ไม่พบสตริงที่ไม่ได้ใช้และไม่ได้อ้างสิทธิ์ ฉันเพิ่งทดสอบมันโดยการเพิ่มสตริงที่มีรหัสสุ่มสมบูรณ์แล้วเรียกใช้ผ้าสำลี ฉันไม่สามารถลงคะแนนตอบกลับด้านบนเพราะฉันไม่มีชื่อเสียงเพียงพอ :(
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 รุ่นของฉัน)

ใน Eclipse สำหรับ Android (ฉันมีรุ่น v22.6.2-1085508)

  • คลิกขวาที่ชื่อโครงการใน "Package explorer"
  • เลือก "เครื่องมือ Android"
  • เลือก "Run Lint: ตรวจสอบข้อผิดพลาดทั่วไป"

ตอนนี้เมื่อคุณเปิด strings.xml คุณจะเห็นว่ามีการเน้นสตริงที่ไม่ได้ใช้

คุณสามารถแก้ไขปัญหาที่อาจเกิดขึ้นอื่น ๆ


สิ่งนี้มีประโยชน์ในการค้นหาสตริงที่ไม่มีการแปลในไฟล์เริ่มต้น
ePeace

3

ใน Android Studio Press

Ctlr + Alt + Shift + i

เลือก -> ทรัพยากรที่ไม่ได้ใช้
มันจะแสดงสตริงและไอคอนที่ไม่ได้ใช้ที่ไม่ได้ใช้

ขอบคุณ Happy coding :)


3

นี่คือวิธีที่ฉันทำกับ Android 3.3

ตรวจสอบการเปลี่ยนแปลงที่เก็บที่ไม่ได้บันทึกใด ๆ ของคุณ

  • คลิกขวาที่โมดูลแอปของคุณ -> ตัวสร้างซ้ำ -> ลบทรัพยากรที่ไม่ได้ใช้ -> ดูตัวอย่าง
  • ในการแสดงตัวอย่าง Refactoring ยุบทั้งมุมมอง ('รายการที่จะลบ' & 'การประกาศทรัพยากรที่ไม่ได้ใช้')
  • คลิกขวา 'รายการที่จะลบ' -> ยกเว้น
  • คลิกขวา 'การประกาศทรัพยากรที่ไม่ได้ใช้' -> ยกเว้น
  • ตอนนี้ขยาย 'การประกาศทรัพยากรที่ไม่ได้ใช้' และภายใต้ที่ค้นหา strings.xml เฉพาะแอปของคุณ (จะมีหลาย strings.xmls)
  • คลิกขวาที่ strings.xml -> รวม
  • สนใจ Refactor! สตริงที่ไม่ได้ใช้ทั้งหมดจากไฟล์ xml จะถูกลบ!

หมายเหตุ: ลองสร้างโครงการ หากการรวบรวมล้มเหลวเป็นไปได้มากที่สุดที่ strings.xml เหล่านี้จะถูกอ้างอิงจากเค้าโครง / เมนู xml บางตัวซึ่งไม่ได้ใช้งาน ดังนั้นรูปแบบ xml เหล่านั้นจึงสามารถลบได้ด้วยตนเอง!

สร้างและเรียกใช้ ทดสอบ!


-1

เรียกใช้สคริปต์นี้จากรากของโครงการของคุณ

สำหรับ resourcefile ใน `find res / values ​​/ *. xml`; ทำ
  สำหรับ stringname ใน 'grep'. * / \ 1 / g'`; ทำ
    count1 = `grep -rc" R.string. $ {stringname} "src | egrep -v ': 0 $' | ห้องสุขา -l`
    count2 = `grep -rc" @string / $ {stringname} "res / layout | egrep -v ': 0 $' | ห้องสุขา -l`
    count3 = `grep -rc" @string / $ {stringname} "res / menu | 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: $ stringname
    Fi
  เสร็จแล้ว
เสร็จแล้ว

สำหรับ resourcename ใน `find res / drawable * -type f -name '*. ???' '; ทำ
  ทรัพยากร = `echo $ resourcename | xargs basename | sed "s / ^ \ (. * \) \ .... $ / \ 1 / g" `
  count1 = `grep -rc" R \ .drawable \. $ {resource} "src | egrep -v ': 0 $' | ห้องสุขา -l`
  count2 = `grep -rc" @drawable / $ {resource} "res / layout | egrep -v ': 0 $' | ห้องสุขา -l`
  count3 = `grep -rc" @drawable / $ {resource} "res / drawable * / *. xml | egrep -v ': 0 $' | ห้องสุขา -l`
  count4 = `grep -rc" @drawable / $ {resource} "res / menu | 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
เสร็จแล้ว

สำหรับ resourcename ใน `find res / layout / *. xml`; ทำ
  ทรัพยากร = `echo $ resourcename | xargs basename | 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.