查明是不是使用了资源

Posted

技术标签:

【中文标题】查明是不是使用了资源【英文标题】:Find out if resource is used查明是否使用了资源 【发布时间】:2011-04-15 04:09:36 【问题描述】:

我正在寻找一种有效的方法来确定资源(主要是可绘制对象)是否在 Java 或 XML 文件中使用。

问题是,在我当前的项目中,drawables 经常更改,现在我有一些drawables,可能永远不会使用。

有没有一种工具/方法可以在不搜索整个项目中的每个文件名的情况下找到那些未使用的可绘制对象?

【问题讨论】:

如果有这样的脚本就好了:) 好吧,看来我得写一篇了:) @MaxUsanin 感谢您向我的问题发送垃圾邮件。你的问题和我的问题有什么关系?这是垃圾邮件,我已将其标记。 对不起,我找到了你的答案......我明白你可以帮助我......但不知道如何问你...... 很抱歉来到这里,但我是@user177168。我已经更改了我的默认用户名。而且我不知道您为什么继续将我的名字视为默认名称。 【参考方案1】:

我写了一个基于python的工具来解决这个问题。由于这里不是直接分享的地方,所以我创建了一个现在离线的项目页面。

更新: 开发已经停止,因为 Lint 可以做同样的事情并且已经包含在 android SDK 中。

【讨论】:

嗯是我还是工具不工作?我为它提供了我的 android 项目的根文件夹的路径。但是现在它说没有文件/path/to/project/root/gen/R.java。这是正确的,因为 R.java 文件位于 gen/de/somepackage/anotherpackage/clientpackage/ 是否有解决此问题的方法? 我想最好在项目页面上创建一张票。我很活跃,所以我会尽快回复:) 不起作用,必须在“parseR(rclass)”处对我的目录进行硬编码,它在 C:\Workspace\Project_dir\gen\CVS\ 中寻找 R.java,我给了目录选项“-i C:\Workspace\Project_dir”。所以它需要更多的工作,但我至少让它工作了。 @JPM 我不明白。不是 C:\Workspace\Project_dir 不是您的项目目录吗?因为在这种情况下,gen 文件夹应该直接位于该项目文件夹中。请您在错误描述中更具体一点。 请注意,Lint 在 Android Studio 中通过 Analyze -> Inspect Code 执行。【参考方案2】:

检查这个: http://code.google.com/p/android-unused-resources

14.12.2011 更新:现在您可以尽可能简单地找到未使用的资源和更多资源。更新到 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.

【讨论】:

【参考方案3】:

我写这个 bash 脚本只是为了好玩:

PROJECT="/path/to/the/project"
for file in $(ls $PROJECT/res/drawable -l | awk ' print $8' | sed 's/\..\+//g'); do count=0; for SRCFILE in `find $PROJECT -name "*.xml" -print 2> /dev/null`; do let "count+=$(grep -c @drawable/$file $SRCFILE)"; done; for SRCFILE in `find $PROJECT -name "*.java" -print 2> /dev/null`; do let "count+=$(grep -c R.drawable.$file $SRCFILE)"; done; if [ $count -lt 1 ]; then echo -e "\e[0;31m$file\e[0m not used"; else echo -e "\e[0;32m$file\e[0m used"; fi; done; 

它工作正常,虽然我是一个 bash 新手,所以它可以得到很大的改进:

它仅搜索可绘制资源(@drawable/name 用于 XML 文件,R.drawable.name 用于 Java 文件)。

顺便说一句,我不知道我的项目中没有使用boxscorecalendarlogos。另一个有趣的事实是大多数用户不使用 Linux,所以这对太多人没有帮助。


对于 MacO 来说是这样的:

PROJECT="/path/to/the/project"
for file in $(ls -l $PROJECT/res/drawable | awk ' print $9' | sed 's/\..\+//g'); do count=0; for SRCFILE in `find $PROJECT -name "*.xml" -print 2> /dev/null`; do let "count+=$(grep -c @drawable/$file $SRCFILE)"; done; for SRCFILE in `find $PROJECT -name "*.java" -print 2> /dev/null`; do let "count+=$(grep -c R.drawable.$file $SRCFILE)"; done; if [ $count -lt 1 ]; then echo -e "$file not used"; else echo -e "$file used"; fi; done; 

【讨论】:

我用我编写的脚本的链接更新了我的问题。这个脚本对你来说可能也很有趣。 (我总是对编写 bash 脚本的人印象深刻……+1 :) OMFG!!!我刚刚试了一下,你做了很棒的工作!真的...谢谢,这将非常有帮助。 太棒了。对我来说效果很好。但是,我不得不将 8 更改为 9 来指定文件名。我还稍微更改了可绘制文件夹路径,因为有问题的应用程序使用额外的文件夹来进行像素密度和方向。 效果很好!虽然我不得不用cut -d \. -f1 替换sed 's/\..\+//g' - 前者返回完整的文件名,扩展名(.png.9.png)。那是在带有 zsh 的 Mac 上

以上是关于查明是不是使用了资源的主要内容,如果未能解决你的问题,请参考以下文章

\\***无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是不是有访问权限。

查明是不是通过 tcp 传递了消息

查明 C++ 对象是不是可调用

查明是不是存在默认查看器

查明输入文本是不是用于冠状病毒

查明 Mac 是不是支持 Force Touch