update tools studio configurar actualizar java android gradle android-gradle

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 }