如何为不同的产品风格定义不同的依赖关系

Jan*_*usz 138 android gradle android-build

我正在将我的一个应用程序转换为Gradle,并希望使用新的构建风格功能来获得付费和免费的广告风格.

我只希望基于广告的版本依赖于admob SDK.

我的构建文件如下所示:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }

    productFlavors {
        Pro {
            packageName "de.janusz.journeyman.zinsrechner.pro"
        }
        Free { 
            dependencies {

            }
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    compile fileTree(dir: 'libs', include: '*.jar')
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在免费产品风格中配置依赖项,使其拥有自己的libs文件夹,该文件夹与包含两种风格的通用库的主libs文件夹合并?

如果可能,我该如何定义此文件夹?

Ren*_*hke 175

要定义特定于风味的依赖项,可以使用proCompile而不是compile在依赖项部分中使用.运行gradle属性时,您将获得自动创建配置的概述.

正确的构建文件如下所示:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 22
    }

    productFlavors {
        pro {
            packageName "de.janusz.journeyman.zinsrechner.pro"
        }
        free { }
    }
}

dependencies {
    compile 'com.android.support:support-v4:22.2.0'
    freeCompile 'com.google.android.gms:play-services-ads:7.5.0'
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,看起来你必须移动`android`块下面的`dependencies`块.多么直观. (17认同)
  • 请注意,如果flavor名称以大写字母开头,则Gradle生成的`xxxCompile`闭包将不起作用. (11认同)
  • 你如何处理不调用广告类? (7认同)
  • 我正在尝试这个并得到这个错误,`错误:(28,0)构建脚本错误,找不到支持的Gradle DSL方法:'glassCompile()'!`(我试图添加依赖的味道是"玻璃" ".) (2认同)
  • "packageName"应为"applicationId" (2认同)
  • @JaredBurrows将不同版本的类调用不同版本的Ad类.可能最好有一个中央课程,你可以称之为. (2认同)

use*_*104 19

快进到2018年中。您将需要添加flavorDimensions

android {
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions "dimensionName"
    productFlavors {
        pro {
            dimension "dimensionName"
        }
        free {
            dimension "dimensionName"
        }
    }
}

dependencies {
    implementation 'com.android.support:support-v4:22.2.0'
    freeImplementation 'com.google.android.gms:play-services-ads:15.0.1'
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意:

配置“编译”已过时,已被“实现”和“ api”替换。它将在2018年底删除。有关更多信息,请参见:http : //d.android.com/r/tools/update-dependency-configurations.html


Ark*_*ior 11

您需要为每种风格手动添加配置.例

configurations {
    proCompile
    freeCompile
}

dependencies {
    compile 'com.parse.bolts:bolts-tasks:1.3.0'

    proCompile 'com.android.support:design:23.1.1'
    freeCompile 'com.parse:parse-android:1.12.0'
}
Run Code Online (Sandbox Code Playgroud)

  • 如何从那里继续?如何激活不同的配置?这是否仅适用于 Android 版本?非 Android 版本可以做到这一点吗? (2认同)

Mil*_*ský 10

如果您将 Gradle 与 Kotlin (build.gradle.kts) 一起使用,则可以按如下方式添加自定义风格的依赖项:

dependencies {
    "freeImplementation"("com.google.android.gms:play-services-ads:7.5.0")
}
Run Code Online (Sandbox Code Playgroud)


nny*_*ges 9

简单的:

dependencies {

    ....
    ....

    gradle.startParameter.getTaskNames().each { task ->
        if(task.contains("free")) {
             implementation 'com.google.android.gms:play-services-ads:17.2.0'
        }
    }

    ....
    ....
}
Run Code Online (Sandbox Code Playgroud)

要不就:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Run Code Online (Sandbox Code Playgroud)


Jor*_*rdy 6

编辑:我建议使用其他技术之一!

接受答案的替代方案是:

    ext {
        flavorType = ""
    }


    gradle.startParameter.getTaskNames().each { task ->

        if(task.contains("flavor1")){
            flavorType = "flavor1"
        } else if (task.contains("flavor2")){
            flavorType = "flavor2"
        } else {
            flavorType = "flavor3"
        }

    }

 if(flavorType == 'flavor1' || flavorType == 'flavor2') {
        compile 'com.android.support:support-v4:18.0.+'
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是在依赖块中? (3认同)
  • 不允许您一次建立多种口味,这对我们大多数人来说都是一个破坏交易的因素。此外,它可能也不适用于android studio (2认同)
  • 这块是依赖的吗? (2认同)