如何在Android Studio中为模块添加flavors?

37
我有一套项目,它们使用相同的模块,该模块几乎包含了所有实际代码。项目的设置如下:
project/
  - app/
    - build.gradle
  - libraries/
    - module/
      - build.gradle
  - build.gradle
  - settings.gradle

依赖项都已正确设置,我可以很好地构建和运行应用程序,但是我只能将口味添加到项目中,这不是理想的解决方案。 settings.gradle 包含以下内容:
include ':app', ':libraries:module'

在应用程序目录的build.gradle文件中,我添加了以下代码块:
productFlavors {
    alpha
    production
}

使用gradle 0.11,它同步并创建assembleAlphaDebugassembleAlphaReleaseassembleProductionDebugassembleProductionRelease任务。但是当我尝试在模块中执行此操作时,会出现以下错误:

找不到与给定名称匹配的资源(在“主题”处的值为“@style/MyCustomTheme”)

在构建的app/src/main/AndroidManifest.xml中。由于某种原因,该模块未被构建,因此自定义主题无法正常工作。我做错了什么?


根据我的理解,即使应用程序也是一个模块,就像你的“模块”一样,将口味放入任何一个模块中都可以工作。在编译代码时,您遇到了什么错误? - Piyush Agarwal
你的模块是一个库项目吗?意思是它有“android-library”或“android”作为插件吗? - Piyush Agarwal
@pyus13 我看到了,但我认为它已经过时了。这表明它应该得到支持:http://tools.android.com/tech-docs/new-build-system/migrating_to_09 - Phil
@ScottBarta 感谢您的建议。我已经更新了问题。 - Phil
更详细的问答请参见:基于多种口味库的多口味应用程序? - Top-Master
显示剩余7条评论
2个回答

83
在库模块的build.gradle文件中,您需要添加几行额外的代码来告诉它导出风味(flavors),并指定默认使用哪个构建版本(如果在从另一个模块包含时未指定)。
android {
    defaultPublishConfig "productionRelease"
    publishNonDefault true

    productFlavors {
        alpha {
        }
        production {
        }
    }
}

那个publishNonDefault位只有在有人想依赖于productionRelease变体之外的东西时才是必要的。如果您一开始就在库中设置了多个风味,那么这可能是这种情况。

现在,如果您通过以下方式在另一个模块中添加依赖项,则可以:

dependencies {
    compile project(':module')
}

默认情况下,它将依赖于productionRelease变体。如果您想依赖于非默认变体:

dependencies {
    compile project(path: ':module', configuration:'alphaDebug')
}

2
是否可能仅依赖于口味而不是构建类型? - Valerio Santinelli
我猜你的意思是 编译项目( - Blundell
这篇文章帮了我很多。到目前为止,我已经在这上面浪费了很多时间。我现在注意到的一件事是,在defaultPublishConfig中指定的构建模式是现在从Android Studio中唯一可以构建的东西。还有其他人也遇到这种情况吗? - oddmeter
刚刚得到了我想要的东西 :) 谢谢 :) - Ramya K Sharma

3
  1. 首先,在您的app/build.gradle文件中添加以下Gradle代码段:
flavorDimensions "env"
productFlavors {
    dev {
        dimension "env"
    }
    pre {
        dimension "env"
    }
    prod {
        dimension "env"
    }
}

其次,在您的module/build.gradle文件中添加以下gradle代码片段:
flavorDimensions "env"
productFlavors {
    register("dev")
    register("pre")
    register("prod")
}

我已经在这篇使用不同的库模块为每个Android口味的回答中发布了答案。


详情请参见:stackoverflow.com/如何使用多种口味库创建多口味应用程序? - Top-Master
1
你能解释一下这里的'register'具体是做什么的吗?这只是更简洁的方式,而不必在每个中添加{'dimension "env" },与'dev { }'完全相同吗? - mawalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接