在 Android Studio 和 Gradle 的 Android App Module 中使用不同构建类型的 Library Module

Posted

技术标签:

【中文标题】在 Android Studio 和 Gradle 的 Android App Module 中使用不同构建类型的 Library Module【英文标题】:Use different build types of Library Module in Android App Module in Android Studio and Gradle 【发布时间】:2015-03-20 20:03:42 【问题描述】:

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

我想利用 Gradle 中的构建变体系统并使用值资源(布尔值、字符串等)来避免构建脚本替换我的类中的文本。

由于在我的所有应用产品中为所有构建类型复制不同的值会让人头疼,因此我想将它们放在我的公共库中的构建类型中。我试过了,但无论我在我的应用程序模块中使用哪种构建类型,应用程序模块都会拉入公共库模块的发布版本。

有什么方法可以让应用模块的不同构建类型使用库模块的相应构建类型?

这是从 Android Studio 运行的,其中 Build Variants 工具窗口显示两个模块都使用调试变体。图像应读取应用程序和库的调试。

【问题讨论】:

【参考方案1】:

更新:publishNonDefault 已弃用且不再有效。所有变体现已发布。

文档取自 Gradle Plugin User Guide 中的 Library Publication 章节。

默认情况下,库仅发布其发布变体。这个变种 将被所有引用该库的项目使用,无论哪个 他们自己构建的变体。这是一个暂时的限制,因为 我们正在努力消除 Gradle 限制。

不管怎样,这个问题是有解决办法的。

全部发布 - 可以通过在您的库项目中添加以下行来发布您的库项目的所有构建变体:

android 
    publishNonDefault true

那么你应该在app项目中修改你的依赖如下:

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

    // This is also possible
    customCompile project(path: ':yourLibrary', configuration: 'custom')

更改默认值 - 您可以通过在库项目中添加以下行来更改从库中发布的变体:

android 
    defaultPublishConfig "debug"

在这种情况下,您不必更改应用程序的依赖项,因为它总是会得到 debug 构建变体。

【讨论】:

这是目前最好的解决方法。非常感谢! 这是我们最终使用的解决方法。 @aga 的答案中的链接中提到了它。 升级到 AS3.0 后,这对我不起作用。导入对我来说似乎坏了。我无法再访问我的图书馆。 在 AS3.0 中实现 project(':yourLibrary') 足以 releaseCompile project(path: ':yourLibrary', configuration: 'release') debugCompile project(path: ':yourLibrary', configuration : '调试') @ArkadiuszCieśliński 有没有机会告诉我你是如何得出这样的结论的,从而帮助我更好地学习 Gradle?【参考方案2】:

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

更多信息可以在这里找到:Use variant-aware dependency management

【讨论】:

当您的应用包含库依赖项不包含的构建类型时,使用matchingFallback 选项似乎是最简单、最有效的解决方案。【参考方案3】:

好吧,Gradle Android 插件根本无法构建依赖库模块的调试version。这是well-known,老问题,尚未解决。 您可以尝试使用我提到的讨论中的一些解决方法,特别是查看帖子 #35 和 #38。

【讨论】:

#35 是@Aleksander Ilic 的回答中提到的解决方案。【参考方案4】:

只需链接https://issuetracker.google.com/issues/36967265

//in library Project build.gradle (lib): 
apply plugin: 'com.android.library' 

android  
    publishNonDefault true 
... 
    buildTypes  
        release  
... 
         
        debug  
... 
         
     
 
dependencies  
... 
 


//in main Project build.gradle (application) 
apply plugin: 'com.android.application' 

android  
... 
    buildTypes  
        release  
... 
         
        debug  
... 
         
     
 
dependencies  
    debugCompile project(path: ':libName', configuration: "debug") 
    releaseCompile project(path: ':libName', configuration: "release") 
... 
 

【讨论】:

【参考方案5】:

如果您只想分离调试和发布构建类型,可以使用releaseImplementationdebugImplementation

例如:

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'
    ...

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

【讨论】:

请注意,您必须为定义的所有构建类型添加xxxImplementation。例如,如果有一个构建类型为test ... ,那么依赖项必须包含这个testImplementation 'some test library' 是的,没错

以上是关于在 Android Studio 和 Gradle 的 Android App Module 中使用不同构建类型的 Library Module的主要内容,如果未能解决你的问题,请参考以下文章

android studio gradle dependencies 包存放在哪儿

如何建立与 Android studio和 gradle android 库

如何在android studio中查看当前使用的gradle版本和gradle插件版本

如何在android studio中查看当前使用的gradle版本和gradle插件版本

如何在android studio中查看当前使用的gradle版本和gradle插件版本

如何在android studio中查看当前使用的gradle版本和gradle插件版本