【问题标题】:Building multiple android projects via a master ANT build file通过一个主 ANT 构建文件构建多个 android 项目
【发布时间】:2012-01-10 16:50:36
【问题描述】:

我有一个主构建文件,用于构建一系列 Android 项目。这些 Android 项目中的每一个都引用同一个 Android 库项目(我将其称为 CoreLibrary)。以下是我的子任务。

 <target name="build" description="Builds (only) all applications">
    <subant>
        <target name="debug" />
        <fileset refid="all-applications" />
    </subant>
</target>

问题:我可以做些什么来防止 CoreLibrary 为我的子任务的所有应用程序文件集中的每个 Android 项目重新构建?这将大大加快我的构建时间,所以我希望我能做点什么。

【问题讨论】:

  • 现在,我不这么认为。下一个主要工具版本可能支持将库项目作为 JAR 分发。在这种情况下,您可以让 Ant 脚本构建库项目并让其他项目引用 JAR,而不是直接引用库项目。至少在理论上。
  • 谢谢。我曾希望防止重复构建库的新构建过程可以在这里有所帮助。换句话说,我知道如果我有 Lib A 和 Lib B 引用 Lib C,那么现在在构建一个引用 Lib A 和 B 的项目时,Lib C 只会构建一次。我希望如果我能想办法利用有这个问题。
  • @CommonsWare 我更新了您可能想要查看的答案。据我所知,它应该可以正常工作,但我不确定 nodeps 目标何时添加到 SDK。
  • nodeps 将是构建工具的一部分,而不是 SDK 本身。因此,只要它适用于当前工具,每个人都应该能够使用它。关于是否会长期支持nodeps,您可能想在adt-dev Google Group 上询问。
  • 好主意。他们似乎在构建库时在内部使用它,因为它们实际上按依赖顺序解析库,因此不需要自动解析和构建依赖项。无论如何,对于任何使用主构建文件的人来说,我建议的应该可行。

标签: android ant compilation multiple-projects subant


【解决方案1】:

其实,我最近才想出了解决这个问题的方法。基本思想是,我的 ANT 文件找到所有库项目,首先构建它们,然后使用 nodeps 目标构建我的其余项目。这有效地防止了 CoreLibrary 不断重新编译的情况。

<?xml version="1.0" encoding="UTF-8"?>
<project name="MasterBuild">

 <!-- A property for the name of the file that contains 'android.library=true' (which is how we find library projects) -->
<property name="library.setting.file.name" value="project.properties" />

<filelist id="normal-projects" dir=".">
    <!-- You want to add your own projects here -->
    <file name="./MyProject/build.xml" />
    <file name="./MyProject2/build.xml" />
    <file name="./MyProject3/build.xml" />
</filelist>

<fileset id="all-libraries-properties" dir=".">
    <include name="*/${library.setting.file.name}" />
    <contains casesensitive="true" text="android.library=true" />
</fileset>

<pathconvert property="all-libraries" refid="all-libraries-properties">
    <globmapper from="*${library.setting.file.name}" to="*build.xml" />
</pathconvert>    

<target name="-set-debug-mode">
    <property name="build.target" value="debug" />
    <property name="install.target" value="installd" />
</target>

<target name="-set-release-mode">
    <property name="build.target" value="release" />
    <property name="install.target" value="installr" />
</target>

<target name="-build-dependencies" unless="built.dependencies">
    <property name="built.dependencies" value="true" />
    <subant buildpath="${all-libraries}" target="${build.target}" inheritall="false" />
</target>

<target name="-build-normal-projects" depends="-build-dependencies">
    <subant inheritall="false">
        <target name="nodeps" />
        <target name="${build.target}" />
        <resources refid="normal-projects" />
    </subant>
</target>

<target name="-install-normal-projects">
    <subant inheritall="false">
        <target name="${install.target}" />
        <resources refid="normal-projects" />
    </subant>
</target>

<target name="debug" depends="-set-debug-mode, -build-normal-projects" description="Builds (only) a debug-key signed application" />
<target name="release" depends="-set-release-mode, -build-normal-projects" description="Builds (only) a release-key signed application" />

<target name="installd" depends="-set-debug-mode, -install-normal-projects" description="Installs (only) a debug-key signed application" />
<target name="installr" depends="-set-release-mode, -install-normal-projects" description="Installs (only) a release-key signed application" />

</project>

注意如果我编写了一个实际找到库依赖顺序的任务,则可以改进此解决方案,以便我可以使用 nodeps 目标构建库。此外,可能有一种方法可以自动检测“正常项目”,但我还不需要。最后,我从我的普通 ANT 文件中展开了很多东西,把它带到这里,所以希望我没有错过任何东西。然而,这个概念是存在的。

【讨论】:

    【解决方案2】:

    如果您使用 Android Maven 插件,您可以单独或作为模块一起构建所有相应的部分,然后将核心库作为 jar 或 apklib(如果它们有资源等)重用。 Maven 的内置依赖机制将负责集成不同的库。

    看看例如RoboGuice 或 ActionBarSherlock 以及他们的示例应用程序,看看它是如何工作的。

    此外,如果您随后使用存储库管理器并在那里部署库,您的所有团队成员都可以从那里获取库,他们可以例如由 CI 服务器构建。

    【讨论】:

    • 你知道这个插件在幕后实际上在做什么吗?目前,我们的团队不使用 Maven,但我想他们正在做一些与我的回答类似的事情。
    • 是的,我知道。我是它的核心贡献者、作者和演讲者。它使用依赖管理从存储库中提取工件......并可以部署到它们。它对将项目组合在一起等提供一流的支持。在google代码上查看网站。根据 Xavier 的说法,Android SDK 将在未来版本之一中实现这些方面。
    • 我明白了。 Maven 是否使用完全自定义的构建系统将所有内容编译在一起?换句话说,它是否只是使用原始可执行工具并以这种方式构建所有内容(而不是 ANT / eclipse)?如果是这样,那可能会有问题,因为我确实有某些项目需要以自定义方式构建。无论如何,当我有机会时,我会看看你的插件能做什么。
    • 否 .. 它重用 SDK .. 只是不是 ant 任务,而是可执行文件或直接与 sdk 一起提供的 jar .. 它适用于很多情况.. 随时询问如果您需要更多详细信息,请在邮件列表中。
    【解决方案3】:

    如果您的库项目是纯 java(无资源),您可以将其作为 jar 分发 - 并且使用 ivy + ivy ant 任务管理依赖项以解决构建文件中的依赖项。但它们仍然会从类构建到 dex 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多