如何将依赖项目添加到适当构建调试或发布jar的android gradle项目中

时间:2014-01-29 01:25:07

标签: android build dependencies gradle android-gradle

我需要一个明确的示例,说明如何使用任意项目扩展Android Gradle项目。

任意我的意思是它不能只使用'java'插件,因为据我所知它不支持buildTypes。我目前正在使用“ant”任务,它有两个调试和发布目标,但是我没有看到如何将它绑定到Android项目中。

假设您的依赖项目必须以两种方式构建纯Java源:

  1. 在'purejava.jar'中生成调试版本的调试版本
  2. 发布版本,在'purejava.jar'中生成发布版本 jar'purejava.jar'的放置使得Android项目(可能是一个多项目)能够在编译时引用它,因此它必须是正确的构建,以支持调试和发布配置Android项目。
  3. 应如何解决这个问题?

    由于我是Android Studio和Gradle的新手,我不清楚如何操纵Android插件生成的扩展,这些扩展在项目评估之后才可用。

    如何使Android项目依赖于这个纯Java项目?

2 个答案:

答案 0 :(得分:1)

如果不是因为您需要调试和发布库的版本,那么您的Android应用程序可能依赖于普通的Java模块 - 您可以使用java设置库插件并在应用的compile project中添加dependencies语句,它会正常工作。

但是,Java插件永远不会理解Android的构建类型概念(除非GradleWare在某些时候添加它),因此您无法将其传播到Java模块。您可以将普通Java项目设置为Android库并使用android-library插件(您必须将清单和其他特定于Android的内容假设在Android库中看到),但是你会遇到另一个问题:https://code.google.com/p/android/issues/detail?id=52962是一个错误,报告构建类型没有传播到库模块。

在修复bug之前,或者如果你不愿意将你的普通Java库变成一个android库,我认为你唯一的方法就是创建两个不同版本的库,将它们编译成不同的jar文件,然后选择性地拉出来在依赖中。

答案 1 :(得分:1)

这是我的答案,具有以下项目结构:

MyProject
    -- MyAndroidLib
        -- JarProject

这代表了gradle top项目'MyProject',它有一个子项目'MyAndroidLib',它依赖于一个纯java项目'JarProject',它使用不同的代码进行调试而不是发布版本。

我会利用Android的'debugCompile'和 'releaseCompile'配置。在依赖于jar的Android子项目('MyAndroidLib')中,将以下行添加到依赖项中:

//MyAndroidLib build.gradle
def jarProject = project(':MyProject:MyAndroidLib:JarProject')
def jarPath = pcfProject.projectDir.toString()
dependencies {
    ....
    compile jarProject
    debugCompile files(jarPath + '/' + jarProject.debugJarName)
    releaseCompile files(jarPath + '/' + jarProject.releaseJarName)
}

定义'jarProject'def以简化从MyAndroidLib项目访问它。 (如果你知道更好的方法......)

这一点的主要目的是为'debugCompile'和'releaseCompile'配置定义一个单独的调试和释放jar路径。 'debugJarName'和'releaseJarName'在JarProject的gradle.properties文件中定义如下:

//JarProject gradle.properties
debugJarName=jarproject_d.jar
releaseJarName=jarproject_r.jar

在JarProject的gradle文件中,定义一个构建由此属性文件命名的BOTH jar文件的任务。在我的例子中,它们是在项目文件夹中由位于该项目中的ant构建文件的“compile”目标构建的。

//JarProject build.gradle
apply plugin: 'java'

project.ext.set("debugJar", file(projectDir.toString() + "/" + debugJarName))
project.ext.set("releaseJar",file(projectDir.toString() + "/" + releaseJarName))

task buildJars(type: Exec)  {
    description 'Build the debug and release jars for the JarProject'
    outputs.files debugJar,releaseJar
    commandLine 'ant', 'compile'
}

task compileJava.dependsOn('buildJars')

artifacts {
    buildJars
}

clean.dependsOn('cleanBuildJars')

clean << {
    exec {
        commandLine 'ant', 'clean'
    }
}

我利用了'java'插件,因为它定义了一个'compile'接口,我还没有弄清楚如何从头开始构建它,甚至是'base'插件。该项目利用了自动创建的“cleanBuildJars”任务,因为我在“buildJars”任务中定义了输出。这是必要的,以便根据需要构建它们。我可能也需要定义'输入',因为如果它们改变了......

如果有人看到我在gradle / Android世界中的第一个障碍如何得到改善,请等一下。根据需要添加评论。