Gav*_*iel 11 dependencies android gradle android-gradle-plugin android-productflavors
有没有办法在Android Studio(build.gradle)中通过多种口味编译依赖项?
我有2个flavorGroups,每2个变种.在4种可能的组合中,我希望能够依赖于lib,只要我是最新的和免费的.latestCompile或freeCompile有效,但latestFreeCompile没有.这是我的build.gradle的相关部分:
android {
defaultConfig {
minSdkVersion 7
targetSdkVersion 19
versionCode 15
versionName "1.9." + versionCode
}
flavorGroups 'sdk', 'cost'
productFlavors {
latest {
flavorGroup 'sdk'
minSdkVersion 8
}
sdk7 {
flavorGroup 'sdk'
minSdkVersion 7
versionName android.defaultConfig.versionName + ".sdk7"
}
free {
flavorGroup 'cost'
}
pro {
flavorGroup 'cost'
}
}
}
dependencies {
// this works:
freeCompile files('libs/StartAppInApp-2.2.1.jar')
// and I would like something like this:
latestFreeCompile 'com.google.android.gms:play-services:4.1.32' // minSdkVersion:8
}
Run Code Online (Sandbox Code Playgroud)
如果我愿意的话:
latestCompile 'com.google.android.gms:play-services:4.1.32'
Run Code Online (Sandbox Code Playgroud)
那么它也将被包含在latestPro中(不需要),如果我使用:
freeCompile 'com.google.android.gms:play-services:4.1.32'
Run Code Online (Sandbox Code Playgroud)
然后它也将包含在sdk7Free中(虽然它需要SDK 8)
正如官方Android 开发人员网站上所述,如果您想声明产品风格和构建类型的特定组合的依赖项,您需要首先声明该配置。
例如对于free
口味和debug
类型:
configurations {
freeDebugImplementation {}
}
dependencies {
freeDebugImplementation 'com.google.firebase:firebase-ads:9.8.0'
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的应用程序具有多个风味维度,则必须创建与完整构建变体(所有风味,然后是构建类型)相对应的配置,如下所示:
flavorDimensions "money", "image"
productFlavors {
free { dimension "money" }
paid { dimension "money" }
picasso { dimension "image" }
glide { dimension "image" }
}
configurations {
freePicassoDebugImplementation {}
freeGlideDebugImplementation {}
}
dependencies {
freePicassoDebugImplementation 'com.google.firebase:firebase-ads:9.8.0'
freeGlideDebugImplementation 'com.google.firebase:firebase-ads:9.8.0'
}
Run Code Online (Sandbox Code Playgroud)
我有同样的问题。我用 build.gradle 中的一些 gradle 代码解决了这个问题:
// global variables
ext {
buildType = ""
groupCost = ""
groupSdk = ""
}
def splitCamelCase(String word) {
def result = []
int nextStart = 0;
for (int i = 1; i < word.length(); i++) {
if(word.charAt(i).isUpperCase()) {
result.add(word.substring(nextStart, i));
nextStart = i;
}
}
result.add(word.substring(nextStart));
return result;
}
// start parameters
println "Start parametes: tasks = " + gradle.startParameter.getTaskNames()
gradle.startParameter.getTaskNames().each { task ->
// This line is needed to skip other projects' tasks
// You can safely remove it if you have only one project
if(!task.startsWith(':<your_application_name>:')) return;
def taskParts = splitCamelCase(task.split(":").last());
def groupCostPrefix = taskParts[taskParts.size() - 3];
def groupSdkPrefix = taskParts[taskParts.size() - 2];
def buildTypePrefix = taskParts[taskParts.size() - 1];
if("Debug".startsWith(buildTypePrefix)) {
buildType = 'debug';
}
else if("Release".startsWith(buildTypePrefix)) {
buildType = 'release';
}
else {
return; // do not process tasks that are not ending with proper build type.
}
if("Free".startsWith(groupCostPrefix)) {
groupCost = 'free';
}
else if("Pro".startsWith(groupCostPrefix)) {
groupCost = 'pro';
}
if("Sdk7".startsWith(groupSdkPrefix)) {
groupSdk = 'froyo';
}
else if("Latest".startsWith(groupSdkPrefix)) {
groupSdk = 'latest';
}
}
Run Code Online (Sandbox Code Playgroud)
然后您所需要做的就是在“依赖项”部分中添加以下代码:
if(groupSdk == 'latest' && groupCost == 'free') {
compile 'com.google.android.gms:play-services:4.1.32'
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5375 次 |
最近记录: |