在 Android Studio 和 Gradle 的 Android App 模块中使用不同构建类型的库模块
Use different build types of Library Module in Android App Module in Android Studio and Gradle
我有一个工作区,其中包含几个不同的应用程序和一个公共库项目,我希望将其从 Eclipse 转换为 Android Studio 并从 Ant 转换为 Gradle。目前,在我们的 ant 脚本中,我们在编译之前替换了一些 类 中的文本,具体取决于构建是用于调试目的、QA、Beta/Customer 验收测试还是打算发布到 Google播放.
我想利用 Gradle 中的构建变体系统并使用值资源(布尔值、字符串等)来避免让构建脚本替换我 类 中的文本。
由于在我的所有应用程序产品中复制所有构建类型的不同值会是一个令人头疼的维护问题,因此我想将它们放入我的公共库中的构建类型中。我试过了,但无论我在我的应用程序模块中使用哪种构建类型,应用程序模块都会引入公共库模块的发布版本。
有什么方法可以让应用程序模块的不同构建类型使用库模块的相应构建类型?
这是 运行 来自 Android Studio 的构建变体工具 window 显示两个模块都使用调试变体。该图像应读取应用程序和库的调试。
嗯,Gradle Android 插件根本无法构建 debug version
依赖库模块。这是一个 well-known 老问题,尚未解决。
您可以尝试使用我提到的讨论中的一些解决方法,具体请查看帖子 #35 和 #38。
更新:publishNonDefault
已弃用,不再有效。所有变体现已发布。
文档取自 Library Publication chapter in Gradle Plugin User Guide。
By default a library only publishes its release variant. This variant
will be used by all projects referencing the library, no matter which
variant they build themselves. This is a temporary limitation due to
Gradle limitations that we are working towards removing.
总之,这个问题是有解决办法的。
全部发布 - 可以通过向您的库项目添加以下行来发布您的库项目的所有构建变体:
android {
publishNonDefault true
}
那么你应该在应用项目中修改你的依赖如下:
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
构建变体。
就linkhttps://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")
...
}
从 Android Gradle 插件 v3.0.0 开始,插件可以根据为应用程序编译的构建类型选择要为 sub-module 库编译的构建类型。因此 debug
将编译 debug
类型的库,而 release
将编译 release
类型的库。此外,甚至还添加了使用 matchingFallback
或 missingDimensionStrategy
.
解析 non-standard 构建类型或风格的扩展
可在此处找到更多信息:Use variant-aware dependency management
如果您只想分离调试和发布构建类型,您可以使用 releaseImplementation
或 debugImplementation
。
例如:
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'
...
}
请注意此解决方案可能导致的库在实现方面的差异。强烈建议避免使用上述解决方案,除非您非常了解它们。
我有一个工作区,其中包含几个不同的应用程序和一个公共库项目,我希望将其从 Eclipse 转换为 Android Studio 并从 Ant 转换为 Gradle。目前,在我们的 ant 脚本中,我们在编译之前替换了一些 类 中的文本,具体取决于构建是用于调试目的、QA、Beta/Customer 验收测试还是打算发布到 Google播放.
我想利用 Gradle 中的构建变体系统并使用值资源(布尔值、字符串等)来避免让构建脚本替换我 类 中的文本。
由于在我的所有应用程序产品中复制所有构建类型的不同值会是一个令人头疼的维护问题,因此我想将它们放入我的公共库中的构建类型中。我试过了,但无论我在我的应用程序模块中使用哪种构建类型,应用程序模块都会引入公共库模块的发布版本。
有什么方法可以让应用程序模块的不同构建类型使用库模块的相应构建类型?
这是 运行 来自 Android Studio 的构建变体工具 window 显示两个模块都使用调试变体。该图像应读取应用程序和库的调试。
嗯,Gradle Android 插件根本无法构建 debug version
依赖库模块。这是一个 well-known 老问题,尚未解决。
您可以尝试使用我提到的讨论中的一些解决方法,具体请查看帖子 #35 和 #38。
更新:publishNonDefault
已弃用,不再有效。所有变体现已发布。
文档取自 Library Publication chapter in Gradle Plugin User Guide。
By default a library only publishes its release variant. This variant will be used by all projects referencing the library, no matter which variant they build themselves. This is a temporary limitation due to Gradle limitations that we are working towards removing.
总之,这个问题是有解决办法的。
全部发布 - 可以通过向您的库项目添加以下行来发布您的库项目的所有构建变体:
android {
publishNonDefault true
}
那么你应该在应用项目中修改你的依赖如下:
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
构建变体。
就linkhttps://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")
...
}
从 Android Gradle 插件 v3.0.0 开始,插件可以根据为应用程序编译的构建类型选择要为 sub-module 库编译的构建类型。因此 debug
将编译 debug
类型的库,而 release
将编译 release
类型的库。此外,甚至还添加了使用 matchingFallback
或 missingDimensionStrategy
.
可在此处找到更多信息:Use variant-aware dependency management
如果您只想分离调试和发布构建类型,您可以使用 releaseImplementation
或 debugImplementation
。
例如:
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'
...
}
请注意此解决方案可能导致的库在实现方面的差异。强烈建议避免使用上述解决方案,除非您非常了解它们。