Eclipse / ADT在Android库项目方面有多聪明?

所以,我的一些项目中有一些"Utility"样式类。 我很好奇我是否可以将它们移动到包含我所有或大部分非特定应用胶水代码(主要是包装和接口)的Android库项目。

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

我过去在Proguard中遇到过一些未使用过的课程的问题,所以我现在只是一次被咬过,两次对ADT感到害羞……

不幸的是,当库变大时,所有项目都会增长 – 即使不使用该库的大部分内容。 我通过创建应用程序A和库L来自己测试它。如果L是A中使用的库,那么如果添加更多类,则classes.dex文件(以及A.apk文件)也在增长 – 即使它们不是用过的。

总结一下:现在我将为某些小而且可能被许多项目使用的东西创建一个基本库,并为每个新组件创建一个新的库,这个组件将更大并且仅被某些项目使用。 新库的一个很好的候选者将是一个新的UI组件,其中包含在资源中定义的多个图像。 例如,基本库的一个很好的候选者是常用的方法和诸如文件高速缓存之类的东西。 Dalvik对编译的代码进行了大量压缩,您可以在此处看到。 (整个演示文稿实际上很有趣:-)

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

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

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

Android库项目是在项目之间共享代码的笨重方式,并且有许多缺点。 我发现使用图书馆项目完成的所有事情也可以通过符号链接完成(符号链接源到两个项目中)。 我还没有find一个用例,其中一个Android库项目提供了一些不容易用其他不那么脆弱的方法复制的东西。