【问题标题】:Building Android project with ant having a library project dependency on another library project使用 ant 构建 Android 项目,其中一个库项目依赖于另一个库项目
【发布时间】:2012-05-21 19:18:05
【问题描述】:

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

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

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

First 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 类。所以我的解决方案可能无法正常工作。

【问题讨论】:

  • 遇到了同样的问题。最近尝试使用当前的 sdk 工具重新编译旧项目并遇到此问题。以前,当构建使用源代码合并时,这不是问题,但现在编译 jar 并且由于某种原因省略了 R 类。没有一个“答案”是真正的答案。就我而言,我有一个付费和免费版本的应用程序,并使用推荐的模式,即拥有两个项目和一个公共库。我不认为顶级项目必须管理公共库的所有依赖项是一个好的模式。

标签: android ant


【解决方案1】:

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

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

将 project1 中的所有 project2.R-import 语句替换为 project1.R 导入语句,就可以了。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,我做了这个参考。这适用于普通的 Android 项目,但当我从一个库项目引用另一个库项目时则不行。
    • 您是否在库项目中添加了 ant.properties?您也可以尝试通过在您的 ref lib 根文件夹中运行 "android update project -l "lib ref" -p . 来更新库项目
    • Android udpate 项目没有创建 ant.properties。我手动添加了 ant.properties,但没有任何改变。我不知道 ant 是否读取文件,因为我正在从另一个文件夹构建(Android 普通项目)
    • 将 google-play-services-lib 添加到我的项目中后,我遇到了同样的问题。似乎无法弄清楚如何配置 ant.properties 让 Jenkins 构建它。可能会切换到 Maven,因为它似乎可以更好地处理这些问题。
    • 我在团队城市遇到了同样的问题。
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        老问题,但像我一样,其他人可能会在这个问题上大发雷霆……

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

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

        (摘自官方文档:"Referencing a Library Project")。

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

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2013-07-19
          • 2020-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-11
          • 1970-01-01
          • 1970-01-01
          • 2017-10-26
          相关资源
          最近更新 更多