使用ant / teamcity构建一个引用android库项目的android项目

时间:2012-04-05 21:24:02

标签: android ant teamcity

我有一个android项目说项目A ..现在这个项目项目A取决于一个Android lib项目说LibX。现在LibX依赖于另一个Android库项目LibY。如何使用ant构建我的项目。

这是我引用的android文档 -

http://developer.android.com/guide/developing/projects/projects-cmdline.html

这就是它所说的

在构建时,库一次一个地与应用程序合并,从最低优先级到最高优先级。 请注意,库本身不能引用另一个库,并且在构建时,库在与应用程序合并之前不会彼此合并。

有解决方法吗?

1 个答案:

答案 0 :(得分:0)

由Android开发者网站:http://developer.android.com/tools/projects/index.html中的来源,图书馆项目部分:

  

“...在结构上,图书馆项目类似于标准的Android   应用项目。例如,它包含一个清单文件   项目根目录,以及src /,res /和类似目录。该   project可以包含与a相同类型的源代码和资源   标准的Android项目,以相同的方式存储。例如,来源   库项目中的代码可以通过其R访问自己的资源   类。

     

但是,库项目与标准Android应用程序不同   项目,你不能直接将其编译到自己的.apk并运行   它在Android设备上。同样,您无法导出库   将项目转换为自包含的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资源来使用文件夹assets / ,并使组件使用Rajawali来验证AsseptManager打开资源。该解决方案导出了JAR文件夹,其中包含内部资产/和字节码( .Class)和我们的LIB Rajawali。

通过Fat-JAR Eclipse PlugIn(或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:\Development\lib3d_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>