2015-11-24 17 views
6

Tôi đang sử dụng kích thước hương vị trong dự án của tôi, và tôi đã được sử dụng một vòng lặp for để thiết lập applicationId để hương vị tạo của tôi:Cách chính xác để đặt ứng dụng AndroidId khi sử dụng kích thước hương vị là gì?

flavorDimensions "appname", "brand" 

productFlavors { 

    user { 
     dimension "appname" 
    } 

    installer { 
     dimension "appname" 
    } 

    branda { 
     dimension "brand" 
    } 

    brandb { 
     dimension "brand" 
    } 

    brandc { 
     dimension "brand" 
    } 

    brandd { 
     dimension "brand" 
    } 

} 

An Tôi lọc những người mà tôi không hỗ trợ ngay bây giờ:

variantFilter { variant -> 
    def names = variant.flavors*.name 

    if (names.contains("installer") && (names.contains("brandc") || names.contains("brancd"))) { 
     variant.ignore = true 
    } 
} 

Sau đó, tôi cập nhật applicationId theo tên hương vị:

applicationVariants.all { variant -> 
def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName() 
def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor(); 

switch (flavorString) { 
/** 
* user 
*/ 
case "userBranda": 
    mergedFlavour.setApplicationId("com.mycompany.product.user.someName") 
    mergedFlavour.setVersionName("1.0.0") 
    break 
case "userBrandb": 
    mergedFlavour.setApplicationId("com.mycompany.product.user.b") 
    mergedFlavour.setVersionName("2.0.0") 
break 
case "userBrandc": 
    mergedFlavour.setApplicationId("com.mycompany.product.user.otherName") 
    mergedFlavour.setVersionName("1.5.0") 
    break 
case "userBrandd": 
    mergedFlavour.setApplicationId("com.mycompany.product.user.d") 
    mergedFlavour.setVersionName("1.0.1") 
    break 
/** 
* installer 
*/ 
case "installerBranda": 
    mergedFlavour.setApplicationId("com.mycompany.product.installer.marketingName") 
    mergedFlavour.setVersionName("1.0.0") 
    break 
case "installerBrandb": 
    mergedFlavour.setApplicationId("com.mycompany.product.installer.b") 
    mergedFlavour.setVersionName("1.0.0") 
    break 
default: 
    throw new GradleException("flavor ${flavorString} is not supported, please configure it first...") 
    break 
} 

tôi có hai câu hỏi:

- Đây có phải là cách phù hợp để thực hiện không? Các plugin android không hỗ trợ một cách để cấu hình applicationId bằng cách sử dụng flavorDimensions?

- Cấu hình tôi đề cập ở đây hoạt động trong hầu hết các trường hợp, ngoại trừ ví dụ nếu bạn đang sử dụng google-services.json có gói ứng dụng đã được xác định bên trong. Đối với việc sử dụng productFlavor đơn giản, cấu hình hoạt động bình thường, nhưng nếu tôi sử dụng thứ nguyên hương vị, gradle luôn phàn nàn:

:app:processUserBrandaDebugGoogleServices 
No matching client found for package name 'com.mycompany.product' 

Về cơ bản các 'com.mycompany.product' là gói phần mềm đó được xác định bởi mặc định trong AndroidManifest. xml. Nếu tôi nhìn vào

app/build/intermediates/manifests/full/userBranda/debug/AndroidManifest.xml 

tôi có thể thấy rằng các gói đã được thay thế bằng sự thành công.

Những gì tôi có thể kết luận về nó là, chỉ cho kích thước hương vị, bằng cách nào đó gradle sáp nhập các biểu hiện chỉ sau processUserBrandaDebugGoogleServices, có nghĩa là tại thời điểm này, gói được xác định trong tệp kê khai vẫn là mặc định.

Bất kỳ ai có cùng sự cố ở đây? Cách khắc phục sự cố này? Đây có phải là lỗi plugin android gradle không?

+0

Xem http://tools.android.com/tech- tài liệu/new-build-system/applicationid-vs-packagename để biết thêm chi tiết về điều này. –

+0

Tài liệu không nói bất cứ điều gì về việc thiết lập applicationId cho flavorDimensions. –

+0

Vì vậy, http://stackoverflow.com/a/26585241/4310905 gần như giống nhau nên mã của bạn có vẻ OK. –

Trả lời

4

Nói tóm lại, từ khóa là applicationIdSuffix, như thế này:

productFlavors { 
    pro { 
     applicationIdSuffix = ".pro" 
    } 
    free { 
     applicationIdSuffix = ".free" 
    } 
} 

buildTypes { 
    debug { 
     applicationIdSuffix ".debug" 
    } 
} 

Mạnh mẽ hơn, bạn có thể làm như thế này:

applicationVariants.all { variant -> 
    def flavorData = rootProject.ext[variant.buildType.name] 

    variant.mergedFlavor.setApplicationId(flavorData.applicationId) 
    //do other things 
} 
Các vấn đề liên quan