15

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

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

当我在 Eclipse 中构建项目时,一切正常,但我无法让我的构建与 Ant 一起工作。

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

好吧,这并不奇怪,因为 jar 文件不包含在 libs 文件夹中。但是在 project.properties 中,我已经对库项目 2 建立了依赖关系,那么为什么 Ant 不将 classes.jar 复制到库项目 1 的 libs 文件夹中呢?

好吧,我可以想到一个使用 Ant 任务将文件复制到 libs 文件夹的解决方案,但是我必须修改我不喜欢的 build.xml。

** 编辑

问题是缺少 R 类,当我查看 classes.jar 时,这个 java 文件不包含 R 类。所以我的解决方案将无法正常工作。

4

5 回答 5

2

此行为是由构建工具 R17 中的更改引起的:http ://tools.android.com/recent/dealingwithdependenciesinandroidprojects

简而言之:库的 R 文件不再打包在该库的 classes.jar 中。但是,由于父库(在您的示例中为 project1)的 parent.R 还包含“子”库(在您的示例中为 project2)的资源引用,因此您不必引用 child-R .

用 project1.R import 语句替换 project1 中的所有 project2.R-import 语句,你应该没问题。

于 2013-06-10T11:47:52.227 回答
1

这听起来像是一个非常脆弱的设置——你可能有充分的理由这样做,但是你可以解耦库之间的依赖吗?

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

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

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

于 2012-05-14T10:15:49.237 回答
1

为了让 ant 编译在 ant.properties 中添加依赖。例如:

android.library.reference.1=../path/to/library
于 2012-05-14T10:03:18.937 回答
1

那么问题是缺少R类。
所以我删除了两个库项目之间的 R 类依赖关系。
我不知道这是否可以解决,但我认为无论如何都是不好的做法。

没有这种依赖,Ant 可以正常构建。

于 2012-05-15T09:48:01.943 回答
0

老问题,但像我一样,其他人可能会在这个问题上猛烈抨击......

官方的回答是“做不到”,具体来说:

在构建时,这些库一次一个地与应用程序合并,从最低优先级到最高优先级。请注意,一个库本身不能引用另一个库,并且在构建时,库在与应用程序合并之前不会相互合并

(摘自官方文档:“Reference a Library Project”)。

这意味着任何事情都会发生,因为使用工具没有“干净”的方法(并且肮脏的方法是有序的)。

希望能帮助到你

于 2014-11-25T20:32:03.530 回答