【问题标题】:How to specify multiple source directory for Android library project如何为Android库项目指定多个源目录
【发布时间】:2013-01-14 09:08:13
【问题描述】:

我正在使用ant工具构建android库项目, 我需要指定多个源目录。

我尝试通过在 ant.properties 文件中交替添加这些行来指定多个源目录

source.dir=src:src2    
source.dir=src;src2

但在这两种情况下都无法构建, 在这两种情况下 .class 都生成了,但是在创建 jar 文件时我得到了这个错误

BUILD FAILED

C:\Program Files\Android\android-sdk\tools\ant\build.xml:681: The following error occurred while executing this line:

C:\Program Files\Android\android-sdk\tools\ant\build.xml:749:

C:\workarea\Android\Packages\test\src;src2 does not exist.

谁能告诉我如何在ant.properties中指定多个源目录来构建Android库项目

【问题讨论】:

  • 如果您确定Android的构建文件提供了这样的功能,请检查您的分隔符-可能是,而不是;。否则,您可能需要修改构建文件。请在此处发布更多信息以获得更好的帮助。
  • 不支持,,可能需要修改ant\build.xml文件,谢谢帮助。
  • 所以发布更多内容,例如构建文件和属性文件的一部分

标签: java android ant jar compilation


【解决方案1】:

在不修改 SDK 文件的情况下,这对我有用:

ant.properties:

source.absolute.dir = tmp-src

custom_rules.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="CustomRules">
    <target name="-pre-build" >
        <copy todir="tmp-src" >
            <fileset dir="src" includes="**" />
            <fileset dir="src-1" includes="**" />
            <fileset dir="src-2" includes="**" />
            <fileset dir="src-3" includes="**" />
            <fileset dir="src-4" includes="**" />
        </copy>
    </target>

    <target name="-post-build" >
        <delete dir="tmp-src" />
    </target>
</project>

【讨论】:

  • 这是最好的答案。修改 SDK 文件完全是个坏消息。
  • 这对我来说也很完美。如果您只需要将其他源文件夹附加到构建中,这是最佳解决方案。
  • 这是解决方案,而不是选择的解决方案。
【解决方案2】:

我以一种棘手的方式解决了这个问题;这里是

要在具有多个源目录的 android 中构建库项目,首先转到 ant.properties 文件(对于 linux,它是 build.properties)并添加 source.dir

    source.dir=first_source_dir ;second_source_dir ; third_source_dir

对于 lib 项目,ant 使用从目录 bin/classes 编译的 .class 文件创建 jar 库> out.dir 目录在 ant.propertiesbuild.properties 文件中指定;

在创建 jar 时,ant 会从 jar 中删除所有 .java 源文件,这些源文件可能会包含在内如果 coder 将任何 .java 源文件保存在 out.dir 目录中,则使用 jar,并在 source.dir;

现在要删除那些 .javaant 使用以下命令转到 source.dir 目录

        <property name="source.absolute.dir" location="${source.dir}" />
        dir="${source.absolute.dir}" 

用这个命令ant实际上试图去目录

cd   <your_project_root_dir>/first_source_dir ;second_source_dir ; third_source_dir

不存在的...

解决方案:

步骤1.首先确保你的源目录(source.dir)和构建目录(out.dir)是不同的;

步骤 2. 转到 C:\Program Files\Android\android-sdk\tools\ant 打开 build.xml 然后转到 jar 标签

    <jar destfile="${out.library.jar.file}">                        
       <fileset dir="${out.classes.absolute.dir}"
         includes="**/*.class"
         excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/Manifest.class ${project.app.package.path}/Manifest$*.class ${project.app.package.path}/BuildConfig.class"/>
       <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
   </jar>

现在注释或删除 jar 标签中的最后一个 fileset 标签

    <jar destfile="${out.library.jar.file}">                        
       <fileset dir="${out.classes.absolute.dir}"
            includes="**/*.class"
            excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/Manifest.class ${project.app.package.path}/Manifest$*.class ${project.app.package.path}/BuildConfig.class"/>
       <!--fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /-->
    </jar>

现在构建您的项目;

【讨论】:

  • 这是否必须在 ant.properties 文件中完成?不能在build.xml中完成吗?
  • 我觉得我必须修改 build.xml 文件很荒谬。你确定这是正确的吗?为什么android不再处理分号/冒号了?
  • 澄清一下,这个 build.xml 位于 Android SDK 中。它不在我的版本控制存储库中。那么您将如何与多个开发人员一起管理这个问题。让每个人都修改他们的 SDK 工具没有意义吗?
  • @AshokSoThree 您可以将 Android build.xml 复制到您的项目中,重命名为 android_patched_build.xml,然后修改您的 build.xml 以包含这个其他文件,而不是来自 ${sdk.dir} 的文件。
【解决方案3】:
  1. 在您的项目目录中创建一个目录(比如 build_src)。
  2. 进入该目录 (cd build_src)
  3. 在 build_src 中创建指向要包含的所有源目录的软链接(ln -s TARGET linkname) 例如:如果您最初的问题是包含 src1、src2 和标准 src 目录,则创建 src1、src2 到 build_src 下的软链接
  4. 使用 source.dir=build_src 创建 ant.properties

这对我来说很好,我认为这是最干净的方法(而且因为这些是指向实际源的软链接,所以你没有源的多个副本)

  1. 我的一个项目有 .aidl 文件并且 AIDL 抱怨。我没有创建指向 src 的软链接,而是创建了指向 src/com 的软链接并修复了该问题。

【讨论】:

    【解决方案4】:

    至少在更高版本的构建工具中,问题在于放入此属性的值被传递到&lt;property name="source.absolute.dirs" location="source.dirs"/&gt;location 属性不知道如何处理冒号/分号分隔的路径。

    修复很简单,只需使用:

    source.absolute.dirs=src1:src2:src3
    

    等,而不是:

    source.dirs=src1:src2:src3
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2018-04-05
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      相关资源
      最近更新 更多