3

我正在使用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 库项目

4

4 回答 4

9

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

蚂蚁属性:

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>
于 2014-01-24T15:38:48.953 回答
8

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

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

    source.dir=first_source_dir ;second_source_dir ; third_source_dir

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

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

现在要删除那些.java蚂蚁,请使用以下命令转到source.dir目录

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

使用此命令,蚂蚁实际上试图进入目录

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标记中的最后一个文件集标记

    <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>

现在构建你的项目;

于 2013-02-09T07:54:44.053 回答
1
  1. 在您的项目目录中创建一个目录(比如 build_src)。
  2. 进入那个目录(cd build_src)
  3. 在 build_src 中创建指向要包含的所有源目录的软链接(ln -s TARGET linkname),例如:如果您的原始问题是包含 src1、src2 和标准 src 目录,则创建指向 build_src 下的 src1、src2 软链接
  4. 使用 source.dir=build_src 创建 ant.properties

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

  1. 我的一个项目有 .aidl 文件并且 AIDL 抱怨。我没有创建指向 src 的软链接,而是创建了指向 src/com 的软链接并修复了该问题。
于 2014-03-10T22:17:04.443 回答
0

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

修复非常简单,只需使用:

source.absolute.dirs=src1:src2:src3

等,而不是:

source.dirs=src1:src2:src3
于 2014-01-10T06:48:19.300 回答