如何避免 Android 库项目中未使用的资源和代码进入我的 APK?

发布于 2024-10-30 18:58:24 字数 530 浏览 0 评论 0原文

我的 Eclipse 工作区中有一个 Android 库项目,我将其用作独特的工具箱。一次偶然的机会(1),我刚刚发现库中的资源(xml 动画、xml 布局、甚至可绘制对象!!!)被打包到使用该库的项目的 APK 中,即使我不使用它们。

阅读android是否总是打包未使用的资源?后,我想知道如果正常的话。我怎样才能避免这种情况?拥有不同的图书馆项目是唯一的方法吗?

编辑:我发现,反编译.dex,未使用的代码也将其放入apk中。

(1) 我试图为我的应用程序测试一个新图标 /res/drawable/icon.png,但默认图标会继续出现。我删除了图像,它仍然显示默认图标!它必须是库中的 /res/drawable-mdpi/icon.png

I have an Android Library Project in my Eclipse workspace, that I use as a unique toolbox. By chance(1), I just discovered that resources from the library (xml animations, xml layouts, even drawables!!!) are packed into the APK's of the projects that use the library, even if I don't use them.

After reading Does android always package unused resources?, I wonder if it's normal. How can I avoid this? Is the only way having different library projects?

EDIT: I've found, decompiling the .dex, that unused code too makes it into the apk.

(1) I was trying to test a new icon for my app, /res/drawable/icon.png, but the default icon would keep appearing. I removed the image and it kept showing the default icon! It had to be the /res/drawable-mdpi/icon.png from the library.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不回头走下去 2024-11-06 18:58:24

新的 Android 构建系统内置了资源剥离机制其中可以作为构建过程的最后一步运行。除了删除 lint 识别的资源之外,还可以使用它。

请注意,资源剥离机制与 Proguard(也与构建系统捆绑在一起)结合使用时特别有用,并且当您在您的项目中使用库。这个想法是:

  • Proguard 删除您不使用的类,包括来自库的类。
  • 上述过程可以删除对这些库中包含的资源的代码引用。
  • 因此,可以从 APK 中删除那些未引用的资源,因为不再有代码使用它们。

删除 lint 识别的未使用资源仍然有用,因为删除它们:

  • 加快构建速度
  • 减少项目的维护负担。

The new Android build system has a resource stripping mechanism built in that can be run as a final step on the build process. Use it in addition to removing resources that lint identifies.

Note that the resource stripping mechanism is particularly useful in conjunction with Proguard (also bundled with the build system) and when you're using libraries in your project. The idea is:

  • Proguard removes classes that you're not using, including those that came from libraries.
  • The above process can delete code references to resources included with those libraries.
  • Those unreferenced resources can thus be stripped from the APK, because there's no code that uses them anymore.

Removing unused resources that lint identifies is still useful because removing them:

  • Speeds up your build
  • Reduces your project's maintenance burden.
最丧也最甜 2024-11-06 18:58:24

Proguard 可以删除未使用的代码。

但它不会对未使用的资源做任何事情,而且还会混淆您的代码。在使用它之前你必须考虑一下。

Proguard can strip unused code.

But it won't do anything about unused resources and it'll also obfuscate your code. You have to give it some thought before using it.

霓裳挽歌倾城醉 2024-11-06 18:58:24

正如有人之前所说, Proguard 可以删除未使用的代码。

要删除未使用的资源,您可以使用 ADT 16 中的 Android Lint 工具。它不仅可以帮助您删除未使用的资源,同时也能发现潜在的bug。这段话来自其官方网站:

以下是它查找的错误类型的一些示例:

  • 缺少翻译(以及未使用的翻译)
  • 布局性能问题(旧的layoutopt工具用来查找的所有问题,等等)
  • 未使用的资源
  • 数组大小不一致(当在多个配置中定义数组时)
  • 辅助功能和国际化问题(硬编码字符串、缺少内容描述等)
  • 图标问题(例如密度缺失、重复图标、尺寸错误等)
  • 可用性问题(例如未在文本字段上指定输入类型)
  • 明显错误等等。

As somebody said before, Proguard can strip unused code.

To remove unused resources you can use Android Lint tool from ADT 16. It will help you not only to remove unused resources, but also to find potential bugs. This quote is from its official site:

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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文