【问题标题】:How to add a dependent project to an android gradle project that builds a debug or release jar approprately如何将依赖项目添加到适当地构建调试或发布 jar 的 android gradle 项目
【发布时间】:2014-02-20 14:55:01
【问题描述】:

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

任意我的意思是它不能只使用“java”插件,因为据我所知它不支持 buildTypes。我目前正在为此使用“ant”任务,它有两个用于调试和发布的目标,但是我不知道如何将它与 Android 项目联系起来。

假设你的依赖项目必须通过两种方式构建纯Java源代码:

  1. 在“purejava.jar”中生成调试版本的调试版本
  2. 在“purejava.jar”中生成发布版本的发布版本 放置 jar 'purejava.jar' 以便 Android 项目(可能是一个多项目)能够在编译时引用它,因此它必须是正确的构建以支持调试和发布配置Android 项目。

应该如何解决这个问题?

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

Android项目应该如何依赖这个纯java项目?

【问题讨论】:

    标签: android build dependencies gradle android-gradle-plugin


    【解决方案1】:

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

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

    在修复该错误之前,或者如果您不愿意将普通 Java 库变成 android 库,我认为您唯一的方法是制作两个不同版本的库,将它们编译为不同的 jar 文件,然后有选择地拉取在依赖项中。

    【讨论】:

    • 是的,我想了解的是如何做到这一点? (根据Android构建类型选择性拉取不同的jar文件)。
    • 这是个好问题。进一步思考,解决方案对我来说并不明显。并不是说不可能,但它超出了我的 Gradle 知识范围。
    • 在 Android 文档中:tools.android.com/tech-docs/new-build-system/… 有一个“依赖二进制包”部分,他们提到他们有一个“debugCompile”和一个“releaseCompile”配置。如果遵循,可以相应地修改依赖于发布或调试 jar 的 android 项目的依赖项:在依赖项部分添加“debugCompile files ('libs/pure_d.jar')”和类似的“releaseCompile”。这目前不起作用,可能是由于您上面提到的错误。
    【解决方案2】:

    这是我的答案,项目结构如下:

    MyProject
        -- MyAndroidLib
            -- JarProject
    

    这表示 gradle 顶级项目“MyProject”,它有一个子项目“MyAndroidLib”,它依赖于一个纯 Java 项目“JarProject”,该项目使用不同的代码构建,用于调试而不是发布版本。

    我将利用 Android 的“debugCompile”和 'releaseCompile' 配置。在依赖 jars 的 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”定义是为了简化从 MyAndroidLib 项目中对其的访问。 (如果你知道更好的方法......)

    这样做的要点是为“debugCompile”和“releaseCompile”配置定义单独的调试和发布 jar 路径。 'debugJarName' 和 'releaseJarName' 在 JarProject 的 gradle.properties 文件中定义如下:

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

    在 JarProject 的 gradle 文件中定义一个任务,该任务构建由该属性文件命名的两个 jar 文件。就我而言,它们是由位于该项目中的 ant 构建文件的“编译”目标直接在项目文件夹中构建的。

    //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”插件,因为它定义了一个“编译”接口,但我还没有弄清楚如何从头开始构建它,甚至从“基础”插件。该项目利用了创建的自动“cleanBuildJars”任务,因为我在“buildJars”任务中定义了输出。这是必要的,以便根据需要构建它们。我可能也需要定义“输入”,因为如果它们改变......

    如果有人看到我在 gradle/Android 世界中的第一次绊脚石可以如何改进,请。根据需要添加 cmets。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多