다른 제품 맛에 대해 서로 다른 종속성을 정의하는 방법


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 폴더와 병합되는 자체 libs 폴더를 갖도록 무료 제품 플레이버에서 종속성을 구성하는 방법이 있습니까?

이것이 가능한 경우이 폴더를 어떻게 정의합니까?


이 스레드를 방문하십시오 : stackoverflow.com/questions/24860659/…
Ali

답변:


190

특징 별 종속성을 정의하려면 종속성 섹션 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'
}

2
나는 이것을 시도 하고이 오류가 발생합니다 Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(의존성을 추가하려는 풍미는 "유리"입니다.)
nmr

19
아, 당신은 dependencies블록 아래로 android블록 을 이동 해야하는 것 같습니다 . 직관적입니다.
nmr

14
xxxCompile플레이버 이름이 대문자로 시작하면 Gradle이 생성 하는 클로저가 작동하지 않습니다.
Jarett Millard 2012

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

또한 다음 사항에 유의하십시오.

'compile'구성은 더 이상 사용되지 않으며 'implementation'및 '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 빌드에만 적용됩니까? Android 이외의 빌드에서도 가능합니까?
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
한 번에 여러 가지 맛을 만들 수 없으므로 대부분의 거래 차단기입니다. 또한 너무 안드로이드 스튜디오 잘 작동하지 않을 수 있습니다
르네 Groeschke

3
이것은 dependencies 블록에 있습니까?
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.