使用ant构建Android项目时,一个库项目依赖于另一个库项目。

15

我可能有一个不太常见的设置:

(> = 依赖关系)
Android项目 > Android库项目1 > Android库项目2
所以我有一个Android库项目,它依赖于另一个库项目。

当我在Eclipse中构建项目时,一切正常,但我无法使用Ant构建项目。

首先,Ant编译Android库项目2,生成一个classes.jar文件并将其放入bin文件夹中。
然后,Ant尝试编译Android库项目1,但我收到错误消息,因为它缺少来自Android库项目2的类。

嗯,这不是很奇怪,因为libs文件夹中没有包含jar文件。 但是在project.properties中,我已经对库项目2进行了依赖性声明,那么为什么Ant不会将classes.jar复制到库项目1的libs文件夹中呢?

好吧,我可以想出使用Ant任务将文件复制到libs文件夹的解决方案,但那样我就必须修改build.xml文件,而我不喜欢这样做。

**编辑

问题在于缺少R类,当我查看classes.jar时,这个Java文件不包含R类。因此,我的解决方案可能行不通。


遇到了同样的问题。最近尝试使用当前 SDK 工具重新编译旧项目时,遇到了这个问题。之前当构建使用源代码合并时,这不是一个问题,但现在编译 JAR 文件并且由于某种原因省略了 R 类。没有任何“答案”是真正的答案。在我的情况下,我有一个付费版和免费版的应用程序,并使用两个项目和一个公共库的推荐模式。我不认为顶层项目必须管理公共库的所有依赖关系是一个好模式。 - Lionel Port
5个回答

2
这种行为是由构建工具的R17版本更改引起的:http://tools.android.com/recent/dealingwithdependenciesinandroidprojects。简而言之,库的R文件不再打包在该库的classes.jar中。但是,由于父库(例如您示例中的project1)的parent.R还包含对“子”库(例如您示例中的project2)的资源引用,因此您无需引用child-R即可使用它。将project1中所有的project2.R-import语句替换为project1.R import语句即可解决问题。

1

这听起来像是一个非常脆弱的设置 - 你可能有充分的理由,但你能否解耦库之间的依赖关系呢?

例如:实现桥接模式来翻译两个库之间的调用,并使调用Android项目附加它们。这样,你在任何一个库中都没有代码依赖于另一个库,唯一需要处理依赖关系设置的项目是你的主项目。

使用库的主要原因之一是使代码可重用,这种方法确保某人(你、同事、你的继任者...)可以插入一个库并创建自己的另一个库的实现。

这里还有一篇关于在Java中应用桥接模式的好文章:http://java.dzone.com/articles/design-patterns-bridge


1

问题在于缺少 R 类。

因此,我删除了两个库项目之间的 R 类依赖关系。

我不知道这是否可以修复,但我认为这是不好的做法。

没有这个依赖项,Ant 构建正常。


1

如果要使用ant进行编译,请在ant.properties中添加依赖项。 例如:

android.library.reference.1=../path/to/library

1
是的,我已经创建了这个引用。这适用于普通的Android项目,但当我从一个库项目引用到另一个库项目时就不起作用了。 - user1051892
你在库项目中添加了ant.properties文件吗?你也可以尝试通过在引用库根目录下运行“android update project -l "lib ref" -p .”来更新库项目。 - Tarun
Android更新项目没有创建ant.properties文件。我手动添加了ant.properties文件,但是没有任何变化。我不知道ant是否读取该文件,因为我是从另一个文件夹(Android普通项目)构建的。 - user1051892
一旦我将google-play-services-lib添加到我的项目中,就遇到了同样的问题。似乎无法弄清如何配置ant.properties以让Jenkins构建它。可能会转向Maven,因为它似乎更好地处理这些问题。 - JPM
我在使用Team City时遇到了相同的问题。 - thechrisberry

0

虽然这是一个老问题,但像我一样,其他人可能也在为此而苦恼...

官方答案是“无法完成”,具体来说:

在构建时,库会逐个与应用程序合并,从最低优先级到最高优先级。 请注意,库本身不能引用另一个库,并且在构建时,库与彼此不会合并,而是在与应用程序合并之前

(摘自官方文档:"引用库项目")。

这意味着任何方法都可以,因为工具没有“干净”的方法来实现(只能使用“脏”方法)。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接