2015-11-24 99 views
6

我使用香味尺寸在我的項目,我一直在使用一個for循環的applicationID設置爲我的口味產生:使用flavor的大小時,設置Android applicationId的正確方法是什麼?

flavorDimensions "appname", "brand" 

productFlavors { 

    user { 
     dimension "appname" 
    } 

    installer { 
     dimension "appname" 
    } 

    branda { 
     dimension "brand" 
    } 

    brandb { 
     dimension "brand" 
    } 

    brandc { 
     dimension "brand" 
    } 

    brandd { 
     dimension "brand" 
    } 

} 

的我過濾那些我現在不支持:

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

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

然後我的applicationID根據風味名的更新:

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 
} 

我有兩個問題:

- 這是正確的方法嗎? android插件不支持使用flavorDimensions配置applicationId的方法?

- 我在這裏提到的配置適用於大多數情況,例如,如果您使用的是已經定義了應用程序包的google-services.json。對於簡單的productFlavor使用,配置工作正常,但如果我用香精方面,gradle這個總是在抱怨:

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

基本上「com.mycompany.product」是默認的AndroidManifest定義的包。 XML。 如果我看在

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

我可以看到,包已成功取代。

我可以得出的結論是,只爲味道維度,不知何故,gradle會在processUserBrandaDebugGoogleServices之後合併清單,這意味着此時在清單中定義的包仍然是默認包。

這裏有同樣問題的人嗎?如何解決此問題?這是一個Android gradle插件錯誤?

+0

見http://tools.android.com/tech- docs/new-build-system/applicationid-vs-packagename瞭解更多細節。 –

+0

該文檔沒有提到有關爲flavorDimensions設置applicationId的任何信息。 –

+0

所以http://stackoverflow.com/a/26585241/4310905幾乎是一樣的,所以你的代碼看起來不錯。 –

回答

4

總之,關鍵詞是applicationIdSuffix,這樣的:

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

buildTypes { 
    debug { 
     applicationIdSuffix ".debug" 
    } 
} 

更強大,你可以這樣做:

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

    variant.mergedFlavor.setApplicationId(flavorData.applicationId) 
    //do other things 
} 
相關問題