如何为Android库项目指定多个源目录

时间:2013-01-30 14:05:52

标签: java android ant jar compilation

我使用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 个答案:

答案 0 :(得分:9)

在没有修改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>

答案 1 :(得分:8)

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

要在具有多个源目录的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 库> ant.properties build.properties 文件中指定的 out.dir 目录;

创建 jar 时, ant 会从 jar 中删除所有 .java 源文件,该文件可能包含在内如果编码器在 out.dir 目录中保留任何 .java 源文件,则使用 jar ,并在 source.dir <中指定该目录/ strong>;

现在删除那些 .java ant ,使用以下命令转到 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>

现在建立你的项目;

答案 2 :(得分:1)

  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
  5. 创建ant.properties

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

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

答案 3 :(得分:0)

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

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

source.absolute.dirs=src1:src2:src3

等,而不是:

source.dirs=src1:src2:src3