【问题标题】:Is there any simple way to find out unused strings in Android project?有没有什么简单的方法可以找出 Android 项目中未使用的字符串?
【发布时间】:2011-06-08 11:51:01
【问题描述】:

我有一个巨大的 Android 项目,其中在 strings.xml 中声明了许多字符串。我想删除strings.xml 中未使用的字符串。

有什么简单的方法吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    Android Studio 上:

    菜单 -> 分析 -> 按名称运行检查 -> 未使用的资源

    选中文件掩码复选框并将strings.xml放在文本字段中。

    【讨论】:

    • 然后你可以定义Custom scope,选择Production classes -> app -> values 查找未使用的字符串、颜色...
    • 使用 SDK 工具 26.0.2 这不会找到我未使用的字符串,而“查找用法”没有显示它们的任何用法(它确实适用于那些实际使用的字符串)。
    • 顺便说一句,当实际使用字符串时(在代码中动态引用),您可以使用 tools:ignore="UnusedResources" 抑制 linter 警告
    • 这个没有按预期工作。我尝试添加未使用的字符串并进行检查,但无法识别它
    • 这似乎坏了,它认为我的一堆字符串没有使用,但快速“查找用法”找到了用途。小心。
    【解决方案2】:

    这是另一个相当简单的解决方案。在 Android Studio 菜单中转到

    重构 > 删除未使用的资源...

    点击预览查看未使用的资源并有选择地删除它们。

    【讨论】:

    • 这删除了很多实际使用的资源。不得不手动取消删除很多东西
    • @stoefln,如果你点击预览,你可以手动选择删除和​​不删除的内容。
    • 注意“也删除未使用的@id 声明”。它删除了我很多我的代码实际使用的 id(Kotlin Android 扩展插件 - 这将允许从活动、片段和视图中恢复视图)
    【解决方案3】:

    在我的情况下,“按名称运行检查”不起作用,尽管我使用的是“删除未使用的资源”。

    解决方案:

    1. 打开 strings.xml
    2. 二次点击
    3. 重构 --> 删除未使用的资源

    我不知道为什么“删除未使用的资源”以一种方式起作用,而另一种则不起作用。

    【讨论】:

    • 您也可以在项目资源管理器中进行,选择您想要的模块,然后右键单击并重构>删除未使用的资源,删除任何类型的资源,如未使用的drawables
    【解决方案4】:

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

    【讨论】:

    • 从 ADT 20.0.2 开始,Android Lint 没有找到未使用的字符串,也没有声称可以找到。我只是通过添加一个具有完全随机 id 的字符串然后运行 ​​Lint 来测试它。我无法在上面投票回复,因为我没有足够的声誉:(。
    • 正如@FrankHarper 所说:以前没有。正如闪电勋爵所说,现在可以了:Warning: The resource R.string.... appears to be unused [UnusedResources] [lint] <string name="...">some text</string>
    【解决方案5】:

    这就是我在 Android 3.3 上的做法。

    签入对您的存储库的任何未保存的更改。

    • 右键单击您应用的模块 -> 重构 -> 删除未使用的资源 -> 预览
    • 在重构预览中,折叠两个视图(“要删除的项目”和“未使用的资源声明”)
    • 右键单击“要删除的项目”-> 排除
    • 右键单击“未使用的资源声明”-> 排除
    • 现在展开“未使用的资源声明”并在其下找到您的应用程序特定的 strings.xml(会有多个 strings.xmls)
    • 右键单击该strings.xml -> 包含
    • 进行重构! xml 文件中所有未使用的字符串都将被删除!

    注意:尝试构建项目。如果编译失败,很可能这些 strings.xml 是从一些布局/菜单 xml 中引用的,而这些布局/菜单 xml 本身是未使用的。 所以那些layout xmls也可以手动删除!

    构建并运行。测试!

    【讨论】:

      【解决方案6】:

      检查 string.xml。

      这很容易(至少在我的 Eclipse 版本中)

      在 Eclipse for Android 中(我有版本 v22.6.2-1085508)

      • 右键单击“包资源管理器”中的项目名称
      • 选择“Android 工具”。
      • 选择“运行 Lint:检查常见错误”。

      现在,当您打开 strings.xml 时,您会看到未使用的字符串被突出显示。

      您可以解决其他潜在问题。

      【讨论】:

      • 这对于查找默认文件中没有翻译的字符串很有用
      【解决方案7】:

      在 Android Studio 中按

      Ctrl+Alt+Shift+i

      选择 -> 未使用的资源
      它向您显示未使用的未使用的字符串和图标。

      感谢快乐编码:)

      【讨论】:

        【解决方案8】:

        从项目的根目录运行此脚本。

        对于`find res/values/*.xml`中的资源文件;做 对于 `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 ];然后 回显 $resourcefile : $stringname 菲 完毕 完毕 对于`find res/drawable* -type f -name '*.???'`中的资源名称;做 资源=`回显 $resourcename | xargs 基本名称 | 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 ];然后 回声$资源名称 菲 完毕 `find res/layout/*.xml` 中的资源名称;做 资源=`回显 $resourcename | xargs 基本名称 | sed "s/^\(.*\)\....$/\1/g"` count1=`grep -rc "R\.layout\.${resource}" src | egrep -v ':0$' |厕所-l` 如果 [ $count1 -eq 0 ];然后 回声$资源名称 菲 完毕

        它给了我这种输出:

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

        【讨论】:

        • 很酷的方法,但它是否检查资源名称是否不在 cmets 或字符串中?它也需要一些修改才能与新的 Android Studio 项目结构兼容。
        【解决方案9】:

        仅适用于缺少的翻译:

        使用 InteliJ,点击你的 InteliJ 的面板栏:“分析”>“按名称运行检查”>输入:不完整的翻译

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-05
          • 1970-01-01
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          相关资源
          最近更新 更多