所以,我的一些项目中有一些"Utility"
样式类。我很好奇我是否可以将它们移动到包含我所有或大部分非特定应用胶水代码(主要是包装和接口)的Android库项目。
所以,我的问题是该库中不需要的文件会发生什么。我知道Android Library Projects基本上只是将他们的代码复制到另一个项目中,所以如果我说在我的“通用”库中使用25%的代码,我的应用程序实际上是否包含所有100%的字节码,或者它是否正确剥离这只是我需要的东西。
我过去在Proguard中使用过未使用过的类有一些问题,所以我只是曾经被咬过一次,现在两次对ADT感到害羞...
答案 0 :(得分:4)
不幸的是,当库变大时,所有项目都会增长 - 即使不使用该库的大部分内容。我通过创建应用程序A和库L来自己测试它。如果L是A中使用的库,那么如果添加更多类,则classes.dex文件(以及A.apk文件)也在增长 - 即使它们不是使用
总结:现在我要为某些小而且可能被许多项目使用的东西创建一个基本库,并为每个新组件创建一个新的库,这个组件将更大并且仅由一些项目。新库的一个很好的候选者将是一个新的UI组件,其中包含在资源中定义的多个图像。例如,基本库的一个很好的候选者是常用的方法和诸如文件高速缓存之类的东西。 Dalvik对编译的代码进行了大量压缩,你可以看到here.(整个演示实际上很有趣: - )
编辑:如果激活ProGuard,它也会删除未使用的代码。默认的proguard.cfg就足够了。它不会在构建的(默认)调试上运行,但是在编译最终的.apk时。所以它实际上是可能的!
答案 1 :(得分:1)
我已经成功使用了3级深度Android库项目,虽然这有点痛苦。主要用例是当您要在一些项目中共享一组资源和类时。由于我使用版本控制系统,我宁愿不使用符号链接。
答案 2 :(得分:0)
请注意,Android库项目在处理资源时也会受到很大影响。 ADT将为每个库重建一次R.java,每个R.java将包含来自所有库的所有资源ID的副本。这里的核心问题是整个项目的资源都是重新生成的,并且没有办法像普通的“库”那样为依赖关系“构建一个jar”。我们尝试与OpenFeint集成,并且有各种各样的地狱处理库和依赖项。我认为我们最终只是将所有OpenFeint源和资源文件合并到我们自己的项目中,而放弃了“Library”项目,因为它提供的价值很小。
Android库项目是在项目之间共享代码的笨重方式,并且有许多缺点。我发现使用图书馆项目完成的所有事情也可以通过符号链接完成(符号链接源到两个项目)。我还没有找到一个用例,其中一个Android库项目提供了一些不容易用其他不那么脆弱的方法复制的东西。