Bagaimana mendefinisikan dependensi yang berbeda untuk rasa produk yang berbeda


153

Saya mengonversi salah satu aplikasi saya ke Gradle dan ingin menggunakan fitur rasa baru untuk mendapatkan rasa berbayar dan berbasis iklan gratis.

Saya hanya menginginkan versi berbasis iklan untuk bergantung pada AdMob SDK.

File build saya terlihat seperti ini:

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

Apakah ada cara untuk mengkonfigurasi ketergantungan pada rasa produk gratis untuk memiliki folder lib sendiri yang digabungkan dengan folder lib utama yang berisi perpustakaan umum untuk kedua rasa?

Jika ini memungkinkan, bagaimana saya mendefinisikan folder ini?


Jawaban:


190

Untuk menentukan ketergantungan rasa khusus yang dapat Anda gunakan proCompilealih-alih compiledi bagian ketergantungan Anda. Ketika Anda menjalankan properti gradle Anda mendapatkan gambaran umum tentang konfigurasi yang dibuat secara otomatis.

File build yang benar terlihat seperti ini:

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
Saya mencoba ini dan mendapatkan kesalahan ini, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(Rasa yang saya coba tambahkan ketergantungan adalah "gelas".)
nmr

19
Ahh, sepertinya kamu harus memindahkan dependenciesblok di bawah androidblok. Sangat intuitif.
nmr

14
Perhatikan bahwa xxxCompilepenutupan yang dihasilkan Gradle tidak akan berfungsi jika nama rasa dimulai dengan huruf kapital.
Jarett Millard

2
"packageName" harus "applicationId"
Apperside

7
Bagaimana Anda menangani tidak memanggil kelas Iklan?
Jared Burrows

26

Maju cepat ke pertengahan 2018. Anda harus menambahkan 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'
}

Juga perhatikan:

Konfigurasi 'kompilasi' sudah usang dan telah diganti dengan 'implementasi' dan 'api'. Itu akan dihapus pada akhir 2018. Untuk informasi lebih lanjut, lihat: http://d.android.com/r/tools/update-dependency-configurations.html


Apakah Anda tahu cara melakukannya dengan buildVariants? seperti proDebugImplementation.
Leandro Ocampo

1
tolong tambahkan pertanyaan terpisah untuk ini. tautkan di sini di bagian komentar. tolong tambahkan rincian lengkap tentang apa yang ingin Anda capai. :)
user1506104

11

Anda perlu menambahkan konfigurasi secara manual untuk setiap rasa. Contoh

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
Bagaimana cara melanjutkan dari sana? Bagaimana cara mengaktifkan konfigurasi yang berbeda? Apakah ini hanya berlaku untuk Android build? Apakah mungkin dengan non-Android build?
koppor

9

Sunting: Saya sarankan menggunakan salah satu teknik lain!

Alternatif untuk jawaban yang diterima adalah ini:

    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
itu tidak memungkinkan Anda untuk membangun beberapa rasa sekaligus, yang merupakan semacam pemecah kesepakatan bagi kebanyakan dari kita. Selain itu mungkin tidak bekerja dengan baik dengan android studio juga
Rene Groeschke

3
ini di blok dependensi?
user1743524

2
Apakah blok ini dalam ketergantungan?
Karacago

hmm ... tidakkah skala baik dengan 10 atau 50 rasa bukan?
Ewoks

@Ewoks Saya ingin membuat banyak rasa, apakah Anda punya ide yang lebih baik?
Vikash Parajuli

6

Sederhana:

dependencies {

    ....
    ....

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

    ....
    ....
}

atau hanya:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.