Cách xác định các phụ thuộc khác nhau cho các hương vị sản phẩm khác nhau


153

Tôi đang chuyển đổi một trong những ứng dụng của mình sang Gradle và muốn sử dụng các tính năng hương vị xây dựng mới để có hương vị dựa trên quảng cáo trả tiền và miễn phí.

Tôi chỉ muốn phiên bản dựa trên quảng cáo phụ thuộc vào SDK admob.

Tệp xây dựng của tôi trông như thế này:

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

Có cách nào để cấu hình sự phụ thuộc trong hương vị sản phẩm miễn phí để có thư mục libs riêng được hợp nhất với thư mục libs chính chứa các thư viện chung cho cả hai hương vị không?

Nếu điều này là có thể, làm thế nào tôi có thể xác định thư mục này?


truy cập chủ đề này: stackoverflow.com/questions/24860659/ Kẻ
Ali

Câu trả lời:


190

Để xác định một phụ thuộc cụ thể hương vị, bạn có thể sử dụng proCompilethay vì compiletrong phần phụ thuộc của bạn. Khi bạn chạy các thuộc tính lớp, bạn có được một cái nhìn tổng quan về các cấu hình được tạo tự động.

Tệp xây dựng chính xác trông như thế này:

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
Tôi đang thử điều này và nhận được lỗi này, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(Hương vị tôi đang cố gắng thêm một phụ thuộc vào là "thủy tinh".)
nmr

19
Ahh, có vẻ như bạn phải di chuyển dependencieskhối bên dưới androidkhối. Làm thế nào trực quan.
nmr

14
Lưu ý rằng các bao xxxCompileđóng mà Gradle tạo ra sẽ không hoạt động nếu tên hương vị bắt đầu bằng chữ in hoa.
Jarett Millard

2
"packName" phải là "applicationId"
Xuất hiện vào

7
Làm thế nào để bạn xử lý không gọi các lớp quảng cáo?
Jared Burrows

26

Chuyển nhanh đến giữa năm 2018. Bạn sẽ cần phải thêm 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'
}

Ngoài ra, hãy lưu ý:

Cấu hình 'biên dịch' đã lỗi thời và đã được thay thế bằng 'triển khai' và 'api'. Nó sẽ bị xóa vào cuối năm 2018. Để biết thêm thông tin, hãy xem: http://d.android.com/r/tools/update-dependency-configurations.html


Bạn có biết làm thế nào để làm điều đó với buildVariants thay thế? như proDebugImcellenceation.
Leandro Ocampo

1
xin vui lòng thêm một câu hỏi riêng cho việc này liên kết nó ở đây trong phần bình luận. vui lòng thêm chi tiết đầy đủ về những gì bạn đang cố gắng để đạt được. :)
user1506104

11

Bạn cần phải tự thêm cấu hình cho từng hương vị. Thí dụ

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
Làm thế nào để đi từ đó? Làm thế nào để kích hoạt các cấu hình khác nhau? Điều này chỉ áp dụng cho bản dựng Android? Có thể làm điều đó với các bản dựng không phải Android?
koppor

9

Chỉnh sửa: Tôi khuyên bạn nên sử dụng một trong những kỹ thuật khác!

Một thay thế cho câu trả lời được chấp nhận là:

    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
điều đó không cho phép bạn xây dựng nhiều hương vị cùng một lúc, đây là loại công cụ giảm giá đối với hầu hết chúng ta. Hơn nữa, nó cũng có thể không hoạt động tốt với studio android
Rene Groeschke

3
Đây là trong khối phụ thuộc?
dùng1743524

2
Là khối này trong sự phụ thuộc?
Karacago

hmm ... không quy mô tốt với 10 hoặc 50 hương vị phải không?
Ewoks

@Ewoks Tôi hava để tạo ra nhiều hương vị, bạn có ý tưởng nào tốt hơn không?
Vikash Parajuli

6

Đơn giản:

dependencies {

    ....
    ....

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

    ....
    ....
}

hoặc chỉ:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.