ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在将我的一个应用程序转换为 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')
}

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

如果这是可能的,我将如何定义这个文件夹?


S
Sébastien

要定义特定风味的依赖项,您可以在依赖项部分使用 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'
}

我正在尝试这个并得到这个错误,Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(我试图添加依赖的味道是“玻璃”。)
啊,看来您必须将 dependencies 块移到 android 块下方。多么直观。
请注意,如果风味名称以大写字母开头,Gradle 生成的 xxxCompile 闭包将不起作用。
“packageName”应该是“applicationId”
你如何处理不调用广告类?
u
user1506104

快进到 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'
}

另外,请注意:

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


你知道如何用 buildVariants 来代替吗?像 proDebugImplementation。
请为此添加一个单独的问题。在评论部分链接它。请添加您要实现的目标的完整详细信息。 :)
n
nnyerges

简单的:

dependencies {

    ....
    ....

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

    ....
    ....
}

要不就:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'

A
Arkadiusz Konior

您需要为每种风味手动添加配置。例子

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'
}

从那里怎么走?如何激活不同的配置?这是否仅适用于 Android 版本?非Android版本有可能吗?
J
Jordy

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

接受的答案的替代方法是:

    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.+'
    }

这不允许您一次构建多种口味,这对我们大多数人来说是一种破坏交易的方式。此外,它也可能不适用于 android studio
这是在依赖项块中吗?
这个块是依赖的吗?
嗯...不能很好地适应 10 或 50 种口味,是吗?
@Ewoks 我有很多口味,你有更好的主意吗?
M
Miloš Černilovský

如果您将 Gradle 与 Kotlin 一起使用,则可以添加自定义风味的依赖项,如下所示:

dependencies {
    "freeImplementation"("com.google.android.gms:play-services-ads:7.5.0")
}

它有效,但为什么它是一个有效的答案?有什么来源吗?

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅