我正在使用ant工具来构建android库项目,我需要指定多个源目录。
我试图通过在ant.properties文件中交替添加这些行来指定多个源目录
source.dir=src:src2
source.dir=src;src2
但在这两种情况下都无法构建,在这两种情况下都生成了.class,但是在创建jar文件时,我收到此错误
BUILD FAILED
C:Program FilesAndroidandroid-sdktoolsantbuild.xml:681: The following error occurred while executing this line:
C:Program FilesAndroidandroid-sdktoolsantbuild.xml:749:
C:workareaAndroidPackagestestsrc;src2 does not exist.
谁能告诉我如何在ant.properties中指定多个源目录来构建Android库项目?
这为我完成了诀窍,而无需修改 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>
我已经以一种棘手的方式解决了这个问题;在这里
要在 android 中使用多个源目录构建库项目,首先转到 ant.properties 文件(对于 linux 它是 build.properties)并添加 source.dir
source.dir=first_source_dir ;second_source_dir ; third_source_dir
对于 lib 项目,ant 使用.class在 ant.properties 或 build.properties 文件中指定的 out.dir 目录的目录 bin/classes 创建 jar 库;
在创建 jar 时,ant 会从 jar 中删除所有.java源文件,如果程序员将任何.java源文件保存在 out.dir 目录中,并在 source.dir 中指定该目录,则这些文件可能包含在 jar 中;
现在要删除这些.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 Open 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>
现在构建您的项目;
- 在项目目录中创建一个目录(例如build_src)。
- 进入那个目录 (CD build_src)
- 创建软链接(ln -s TARGET linkname),build_src到要包含的所有源目录例如:如果您最初的问题是包含 SRC1、SRC2 以及标准 SRC 目录,请创建 SRC1、SRC2 软链接到build_src
- 使用 source.dir=build_src 创建 ant.properties
这对我来说效果很好,我认为是最干净的方法(也因为这些是指向实际源的软链接,因此您没有源的多个副本)
- 我的一个项目有.aidl文件,AIDL抱怨。我没有创建到 src 的软链接,而是创建了到 src/com 的软链接并解决了这个问题。
至少在更高版本的构建工具上,问题是放入此属性的值被传递到<property name="source.absolute.dirs" location="source.dirs"/>
中。location
属性不知道如何处理冒号/分号分隔的路径。
修复非常简单,只需使用:
source.absolute.dirs=src1:src2:src3
等,而不是:
source.dirs=src1:src2:src3