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

时间:2015-01-22 05:30:44

标签: android build gradle android-studio

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

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

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

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

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

debug debug

5 个答案:

答案 0 :(得分:30)

Library PublicationGradle Plugin User Guide章节中获取的文档。

  

默认情况下,库仅发布其版本变体。这个变种   将被引用库的所有项目使用,无论哪个   变种他们自己建立。由于这是暂时的限制   我们正努力消除的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')
}

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

android {
    defaultPublishConfig "debug"
}

在这种情况下,您不必更改应用的依赖关系,因为它始终会获得debug构建版本。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

只需链接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") 
... 
} 

答案 3 :(得分:1)

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

可以在此处找到更多信息:Migrate to Android Plugin for Gradle 3.0.0

答案 4 :(得分:0)

如果您只想将调试和发布构建类型分开,您可以使用 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'
    ...
}

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