วิธีกำหนดการขึ้นต่อกันที่แตกต่างกันสำหรับรสชาติผลิตภัณฑ์ที่แตกต่างกัน


153

ฉันกำลังแปลงหนึ่งในแอพของฉันเป็น 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 ของตนเองที่รวมเข้ากับโฟลเดอร์ lib หลักที่มีไลบรารีทั่วไปสำหรับทั้งสองรสชาติหรือไม่

หากเป็นไปได้ฉันจะกำหนดโฟลเดอร์นี้ได้อย่างไร


เยี่ยมชมกระทู้นี้: stackoverflow.com/questions/24860659/…
อาลี

คำตอบ:


190

ในการกำหนดการพึ่งพาเฉพาะของรสชาติคุณสามารถใช้proCompileแทนcompileในส่วนการพึ่งพาของคุณ เมื่อคุณเรียกใช้คุณสมบัติการไล่ระดับสีคุณจะได้รับภาพรวมของการกำหนดค่าอัตโนมัติ

ไฟล์บิลด์ที่ถูกต้องมีลักษณะดังนี้:

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

2
ฉันพยายามทำสิ่งนี้และรับข้อผิดพลาดนี้Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(รสชาติที่ฉันพยายามเพิ่มการพึ่งพาคือ "แก้ว")
nmr

19
อ๊ะดูเหมือนว่าคุณจะต้องย้ายdependenciesบล็อกด้านล่างandroidบล็อก ใช้งานง่าย
nmr

14
โปรดทราบว่าการxxxCompileปิด Gradle ที่สร้างจะไม่ทำงานหากชื่อรสชาติเริ่มต้นด้วยอักษรตัวใหญ่
Jarett Millard

2
"packageName" ควรเป็น "applicationId"
Apperside

7
คุณจะจัดการไม่เรียกคลาสโฆษณาได้อย่างไร
Jared Burrows

26

กรอไปข้างหน้าถึงกลางปี ​​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
Leandro Ocampo

1
โปรดเพิ่มคำถามแยกต่างหากสำหรับสิ่งนี้ เชื่อมโยงได้ที่นี่ในส่วนความคิดเห็น โปรดเพิ่มรายละเอียดที่สมบูรณ์เกี่ยวกับสิ่งที่คุณพยายามทำ :)
user1506104

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

1
จะไปจากที่นั่นได้อย่างไร? วิธีการเปิดใช้งานการกำหนดค่าที่แตกต่างกันอย่างไร สิ่งนี้ใช้ได้กับ Android build เท่านั้นหรือไม่ เป็นไปได้หรือไม่ที่ไม่ใช่ Android builds
koppor

9

แก้ไข:ฉันแนะนำให้ใช้หนึ่งในเทคนิคอื่น ๆ !

ทางเลือกอื่นสำหรับคำตอบที่ยอมรับคือ:

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

2
ที่ไม่อนุญาตให้คุณสร้างหลายรสชาติพร้อมกันซึ่งเป็นตัวแบ่งข้อตกลงสำหรับเราส่วนใหญ่ นอกจากนี้มันอาจทำงานได้ไม่ดีกับ android studio ด้วย
Rene Groeschke

3
สิ่งนี้อยู่ในบล็อกการพึ่งพาหรือไม่
user1743524

2
บล็อกนี้ขึ้นอยู่กับการพึ่งพาหรือไม่
Karacago

อืม ... ไม่ได้ขนาดที่เหมาะสมกับ 10 หรือ 50 รสชาติใช่มั้ย
Ewoks

@ Ewoks ฉัน hava ที่จะทำให้รสชาติมากมายคุณมีความคิดที่ดีกว่า
Vikash Parajuli

6

ง่าย:

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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.