2011-02-10 40 views
11

所以,我在我的一些项目中有几个"Utility"风格类。我很好奇,如果我可以将它们移动到一个Android库项目,其中包含所有或大部分非特定于应用程序的胶水代码(主要是包装和界面)。关于Android库项目,Eclipse/ADT有多聪明?

所以,我的问题是在该库中不需要的文件会发生什么情况。我知道Android库项目基本上只是将他们的代码复制到另一个项目中,所以如果我说在我的“通用”库中使用25%的代码,我的应用程序是否实际上包含所有100%的字节码,它只是我需要的东西。

我曾与在过去未使用的类在Proguard的一些问题,所以我只是曾经被蛇咬,与现在的ADT怕井绳......

回答

4

不幸的是,当库是所有项目将增长变得更大 - 即使该库的大部分内容都未被使用。我通过创建一个应用程序A和一个库L来自己测试它。如果L是A中使用的库,那么classes.dex文件(因此A.apk文件)会增加,如果我添加更多的类 - 即使它们不是用过的。总结:现在,我将创建一个基本的库,用于某些小型项目,这些项目可能会被许多项目使用,并为每个新的组件创建一个新的库,这些新的组件将会变得更大,并且只会被使用由一些项目。新库的一个很好的候选者将是一个新的UI组件,其中有多个图像定义在资源中。例如,基础库的一个很好的候选者是常用的方法和诸如文件缓存之类的东西。对于Dalvik,编译后的代码被压缩得相当严重,您可以看到here.(整个演示实际上很有趣:-)

编辑:如果激活ProGuard,它也会为您删除未使用的代码。默认的proguard.cfg就足够了。它不会在构建的(默认)调试版上运行,但是当最终的.apk被编译时。所以它实际上是可能的!

+0

感谢您的好奇心,您是否使用ProGuard进行测试? - 我听说它可以删除未使用的类,我很好奇它是如何发挥作用的。我在图书馆里的大部分东西都是代码,而不是资源图片,所以我认为你说得对,这不是一个大问题。 – camperdave 2011-02-11 01:01:56

0

请注意,Android库项目在处理资源时也会受到很大影响。 ADT将为每个库重建R.java一次,并且每个R.java将包含所有库的所有资源ID的副本。这里的核心问题是整个项目都会重新生成资源,并且没有办法为依赖关系“构建jar”,正如普通“库”所预期的那样。我们尝试与OpenFeint集成,并且处理各种图书馆和依赖关系。我想我们最终只是将所有OpenFeint源代码和资源文件合并到我们自己的项目中,并放弃了“库”项目,因为它提供的价值不大。

Android库项目是一种在项目之间共享代码的笨重方式,并且有许多缺点。我发现用一个库项目完成的一切都可以通过符号链接(符号链接源代码到两个项目)来完成。我还没有找到一个用例,其中Android Library项目提供了一些不易用其他较脆弱手段复制的内容。

1

我已经成功地使用了3级深度的Android库项目,尽管它有点痛苦。主要用例是当您想要在几个项目中共享一组资源和类时。由于我使用版本控制系统,我宁愿不使用符号链接。