我有一个安卓项目说项目 A.现在这个项目A依赖于一个Android lib项目,比如LibX。现在 LibX 依赖于另一个 android 库项目 LibY。 如何使用 ant 构建我的项目。
这是我引用的安卓文档 -
http://developer.android.com/guide/developing/projects/projects-cmdline.html
这是它说的
在生成时,库与应用程序一次合并一个,从最低优先级到最高优先级开始。请注意,一个库本身不能引用另一个库,并且在生成时,库在与应用程序合并之前不会相互合并。
有没有办法解决这个问题?
by Android 开发者网站: 源代码 in http://developer.android.com/tools/projects/index.html , 库项目部分:
"...在结构上,库项目类似于标准 Android 应用项目。例如,它包含一个清单文件,位于 项目根目录,以及 src/、res/和类似的目录。这 项目可以包含与 标准的安卓项目,以相同的方式存储。例如,源 库项目中的代码可以通过其 R 访问自己的资源 .class。
但是,库项目不同于标准的 Android 应用程序 项目,因为您无法将其直接编译为自己的.apk并运行 它在安卓设备上。同样,您无法导出库 投影到一个独立的 JAR 文件,就像你对 true 所做的那样 图书馆。相反,您必须通过以下方式间接编译库 在依赖应用程序中引用库并构建该库 应用。
生成依赖于库项目的应用程序时, SDK 工具将库编译为临时 JAR 文件,并在 主项目,然后使用结果生成.apk。在案例中 其中,资源 ID 在应用程序和 库,这些工具确保在 应用程序获得优先级,并且库项目中的资源 未编译到应用程序.apk中。这为您的应用程序提供了 灵活地使用或重新定义任何资源行为,或者 在任何库中定义的值。
若要进一步组织代码,应用程序可以添加对 多个库项目,然后指定 每个库中的资源。这使您可以建立资源 以累积方式实际在您的应用程序中使用。当两个 从应用程序引用的库定义相同的资源 ID, 这些工具从库中选择优先级更高的资源 并丢弃另一个。
一旦您将对库项目的引用添加到您的 Android 项目,您可以设置它们的相对优先级。在构建时, 库一次与应用程序合并一个,从 从最低优先级到最高优先级。
库项目可以引用其他库项目,也可以导入 以正常方式使用外部库 (JAR)。..."
我在使用Rajawali库(0.9版)时遇到了类似的问题。有必要分发一个文件。单个 jar 和应用程序将使用此 JAR 来显示 3D 屏幕。问题是我们的图书馆是使用图书馆资源 Rajawali 的自定义。因此创建了两个项目结构(例如库项目)。生成时。由于上面解释的原因,使用这些资源的 JAR 应用程序不起作用),这是因为该库使用图像的 Rajawali 功能来加载目标应用程序版本中无法识别的 ID。
单个JAR的解决方案可以通过修改代码来验证,通过R.raw.X(Android方法)不使用Rajawali资源,以使用文件夹资产/,并使组件使用Rajawali AsseptManager打开资源。解决方案已导出包含内部资产/和字节码 (.类)和我们的 LIB 拉贾瓦利。
通过 Fat-JAR Eclipse 插件(或 0.0.31 +)[更新站点 http://kuruczgrafika.de/fatjar] 可以生成单个 JAR 并在目标应用程序中使用它。ANT 脚本用于运行下面的 XML,并生成了一个 JAR 文件。文件"lib3d_NAME_HERE.jar"(.JAR) 将在/build/lib3d_NAME_HERE.jar
<?xml version="1.0"?>
<project name="lib3d_NAME_HERE" default="main" basedir=".">
<property name="projectPath" value="D:Developmentlib3d_NAME_HERE"/>
<!-- this file was created by Fat-Jar Eclipse Plug-in -->
<!-- the ANT-Export is in a very early stage, so this -->
<!-- is only experimental, ANT 1.6 or above is -->
<!-- required, feedback is always welcome: -->
<!-- http://sourceforge.net/projects/fjep -->
<!-- uncomment the following lines if using ANT outside Eclipse -->
<!--
<property name="fjepPath" value="reference:file:plugins/net.sf.fjep.fatjar_0.0.31/fatjar.jar"/>
<taskdef name="fatjar.build" classname="net.sf.fjep.anttask.FJBuildTask" classpath="${fjepPath}"/>
<typedef name="fatjar.manifest" classname="net.sf.fjep.anttask.FJManifestType" classpath="${fjepPath}"/>
<typedef name="fatjar.exclude" classname="net.sf.fjep.anttask.FJExcludeType" classpath="${fjepPath}"/>
<typedef name="fatjar.jarsource" classname="net.sf.fjep.anttask.FJJarSourceType" classpath="${fjepPath}"/>
<typedef name="fatjar.filesource" classname="net.sf.fjep.anttask.FJFileSourceType" classpath="${fjepPath}"/>
-->
<!-- uncomment the above lines to use ANT outside of Eclipse -->
<target name="main">
<fatjar.build output="build/lib3d_NAME_HERE.jar">
<fatjar.manifest/>
<fatjar.filesource path="${projectPath}/bin/classes" relpath=""/>
<fatjar.filesource path="${projectPath}/assets/" relpath="assets"/>
</fatjar.build>
</target>
</project>