繁体   English   中英

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

[英]Use different build types of Library Module in Android App Module in Android Studio and Gradle

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

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

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

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

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

调试调试

更新: 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构建变体。

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

更多信息可以在这里找到: 使用变体感知依赖管理

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM