在Android Studio和Gradle的Android应用程序模块中使用不同构建类型的库模块

在Android Studio和Gradle的Android应用程序模块中使用不同构建类型的库模块,android,build,gradle,android-studio,Android,Build,Gradle,Android Studio,我有一个包含几个不同应用程序的工作区和一个公共库项目,我希望将其从Eclipse转换为Android Studio,从Ant转换为Gradle。目前,在我们的ant脚本中,我们会在编译之前替换一些类中的文本,这取决于构建是用于调试目的、QA、Beta/客户验收测试还是用于发布到Google Play 我想利用Gradle中的构建变量系统,并使用值资源(布尔值、字符串等)防止构建脚本替换类中的文本 由于在我的所有应用程序产品中复制所有构建类型的不同值将是一个维护难题,因此我想将它们放在我的公共库中

我有一个包含几个不同应用程序的工作区和一个公共库项目,我希望将其从Eclipse转换为Android Studio,从Ant转换为Gradle。目前,在我们的ant脚本中,我们会在编译之前替换一些类中的文本,这取决于构建是用于调试目的、QA、Beta/客户验收测试还是用于发布到Google Play

我想利用Gradle中的构建变量系统,并使用值资源(布尔值、字符串等)防止构建脚本替换类中的文本

由于在我的所有应用程序产品中复制所有构建类型的不同值将是一个维护难题,因此我想将它们放在我的公共库中的构建类型中。我尝试了这一点,但无论我在我的应用程序模块中使用哪种构建类型,应用程序模块都会引入公共库模块的发布版本

是否有任何方法可以让应用程序模块的不同构建类型使用库模块的相应构建类型

这是从AndroidStudio运行的,其中BuildVariants工具窗口显示了使用调试变量的两个模块。应用程序和库的映像都应为debug


好吧,Gradle Android插件根本无法构建依赖库模块的调试版本。这是一个老问题,尚未解决。

您可以尝试使用我提到的讨论中的一些变通方法,特别是查看帖子35和38。

更新:
publishNonDefault
已被弃用,不再有效。所有变体现在都已发布

文件摘自中的第章

默认情况下,库只发布其版本变体。这种变体 将由引用库的所有项目使用,无论是哪一个项目 他们自己建造的变体。这是由于以下原因造成的临时限制: 我们正在努力消除的渐变限制

无论如何,这个问题有解决办法

全部发布-通过向库项目添加以下行,可以发布库项目的所有生成变体:

android {
    publishNonDefault true
}
android {
    defaultPublishConfig "debug"
}
然后,您应该在app project中修改依赖项,如下所示:

dependencies {
    releaseCompile project(path: ':yourLibrary', configuration: 'release')
    debugCompile project(path: ':yourLibrary', configuration: 'debug')

    // This is also possible
    customCompile project(path: ':yourLibrary', configuration: 'custom')
}
更改默认值-您可以通过在库项目中添加以下行来更改从库中发布的varaint:

android {
    publishNonDefault true
}
android {
    defaultPublishConfig "debug"
}
在这种情况下,您不必更改应用程序的依赖项,因为它将始终获得
debug
构建变量。

只需链接即可


从Android Gradle Plugin v3.0.0开始,该插件可以根据正在为应用程序编译的构建类型,为子模块库选择要编译的构建类型。因此,
debug
将编译
debug
库类型,
release
将编译
release
库类型。此外,还添加了使用
matchingFallback
missingDimensionStrategy
解析非标准构建类型或风格的扩展


更多信息可以在这里找到:

如果您想分离调试和发布生成类型,可以使用
releasemployment
debugemployment

例如:

android {
  ...
   buildTypes {
       release {
          ...
        }
       debug {
          ...
        }
    }
 ...
}

repositories {
   ...
}

dependencies {
    ...
    ...
    releaseImplementation 'some release library'
    debugImplementation 'some debug library'

    implementation 'some lib which will be available in all build types'
    ...
}

请注意此解决方案可能导致的实现差异。强烈建议您避免使用上述解决方案,除非您非常了解它们。

这是目前最好的解决方法。非常感谢!这就是我们最终使用的解决方案。@aga的答案中的链接中提到了这一点。在我升级到AS3.0后,这对我不起作用。在我看来,这台机器坏了。我无法再访问我的库。AS3.0中的实现项目(':yourLibrary')足以发布编译项目(路径:':yourLibrary',配置:'release')调试编译项目(路径:':yourLibrary',配置:'debug'))@ArkadiuszCieśliński你能告诉我你是如何得出这样的结论来帮助我更好地了解Gradle吗?#35是@Aleksander Ilic的答案中提到的解决方案。当你的应用程序包含库依赖项不包含的构建类型时,使用
匹配回退
选项似乎是最简单、最有效的解决方案。