java - tools - ¿Cuál es la forma correcta de establecer Android ID de aplicación cuando se utilizan dimensiones de sabor?
install gradle android studio (1)
Estoy usando dimensiones de sabor en mi proyecto, y he estado usando un bucle for para establecer el ID de aplicación en mis sabores generados:
flavorDimensions "appname", "brand"
productFlavors {
user {
dimension "appname"
}
installer {
dimension "appname"
}
branda {
dimension "brand"
}
brandb {
dimension "brand"
}
brandc {
dimension "brand"
}
brandd {
dimension "brand"
}
}
Un filtro de los que no apoyo en este momento:
variantFilter { variant ->
def names = variant.flavors*.name
if (names.contains("installer") && (names.contains("brandc") || names.contains("brancd")) ) {
variant.ignore = true
}
}
Luego actualizo la applicationId de acuerdo con el nombre del sabor:
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
}
Tengo dos preguntas:
1 - ¿Es esta la manera correcta de hacerlo? El complemento de Android no es compatible con una forma de configurar el Id de la aplicación usando saborDimensiones?
2 - La configuración que menciono aquí funciona en la mayoría de los casos, excepto, por ejemplo, si está usando google-services.json que tiene el paquete de la aplicación ya definido dentro. Para el uso simple del productoFlavor, la configuración funciona normalmente, pero si uso las dimensiones de sabor, gradle siempre se queja:
:app:processUserBrandaDebugGoogleServices
No matching client found for package name ''com.mycompany.product''
Básicamente, el ''com.mycompany.product'' es el paquete que se define de forma predeterminada en AndroidManifest.xml. Si miro en el
app/build/intermediates/manifests/full/userBranda/debug/AndroidManifest.xml
Puedo ver que el paquete fue reemplazado con éxito.
Lo que puedo concluir al respecto es que, solo para las dimensiones de sabor, de algún modo Gradle fusiona los manifiestos solo después del processUserBrandaDebugGoogleServices, lo que significa que en este punto, el paquete definido en el manifiesto todavía es el predeterminado.
¿Alguien con el mismo problema aquí? ¿Cómo solucionar este problema? ¿Es esto un error del plugin android gradle?
En resumen, la palabra clave es applicationIdSuffix
, así:
productFlavors {
pro {
applicationIdSuffix = ".pro"
}
free {
applicationIdSuffix = ".free"
}
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
Más poderoso, puedes hacer esto:
applicationVariants.all { variant ->
def flavorData = rootProject.ext[variant.buildType.name]
variant.mergedFlavor.setApplicationId(flavorData.applicationId)
//do other things
}