referencia:
Resumen de diferentes configuraciones multicanal de Gradle - Nuggets
En primer lugar, me gustaría agradecer al jefe de GitLqr por compartir desinteresadamente Gradle lo escribió en detalle a través de múltiples canales. Yo uso un poco aquí.
gradle proporciona productFlavors para implementar diferentes canales.
También es muy sencillo introducir diferentes referencias a través de diferentes canales.Puede especificar las bibliotecas que deben referenciarse por separado para cada canal.
Pero si hay docenas de canales, uno de ellos debe hacer referencia a diferentes bibliotecas. Debido a esto, no es posible escribir docenas de referencias, por lo que los cambios posteriores también son muy problemáticos, por lo que debe realizarse a través de la configuración.
Primero suponga que existen estos canales
productFlavors {
channel1 {}
channel2 {}
channel3 {}
channel4 {}
channel5 {}
// ... channel xxx 假定非常多
}
Luego, puede usar el siguiente código para presentar diferentes contenidos a diferentes canales:
En este momento, el canal 1 agrega directamente la biblioteca remota al paquete y otros canales no ingresan.
Nota: El código de ejemplo es biblioteca, por lo que se utilizan libraryVariants. Si es apk, debe cambiarse a applicationVariants
dependencies {
def aar1='com.xxx.xxx:aaaa:1.0.0-SNAPSHOT'
def aar2='com.xxx.xxx:bbbb:1.0.0-SNAPSHOT'
android.libraryVariants.all { variant ->
variant.productFlavors.each { flavors ->
// println(flavors.name)
if (flavors.name.equals("channel1")) {
dependencies.add("${variant.flavorName}Embed", aar1)
dependencies.add("${variant.flavorName}Embed", aar2)
} else {
dependencies.add("${variant.flavorName}CompileOnly", aar1)
dependencies.add("${variant.flavorName}CompileOnly", aar2)
}
// 示例
// 本地引用1
// dependencies.add("${variant.flavorName}Implementation", project(':DroidPluginFix'))
// 本地引用2
// dependencies.add("${variant.flavorName}Implementation", fileTree(include: ['*.aar'], dir: 'libs_xxx_1'))
// 远程引用1
// dependencies.add("${variant.flavorName}Implementation", 'com.xxx.xxx:aaaa:1.0.0-SNAPSHOT')
// 远程引用2
// dependencies.add("${variant.flavorName}Embed", 'com.xxx.xxx:aaaa:1.0.0-SNAPSHOT')
// 远程引用3
// dependencies.add("${variant.flavorName}CompileOnly", 'com.xxx.xxx:bbbb:1.0.0-SNAPSHOT@aar')
}
}
// others xxx
}
Hay otro método que es más simple de escribir, pero no perfecto :
dependencies {
gradle.startParameter.getTaskNames().each { task ->
// printf("====================================================")
// println("print task : " + task)
if (task.contains('Channel1')) {
embed ('com.xxx.aaa:asd:1.0.0')
} else {
compileOnly ('com.xxx.bbb:asd:1.0.0')
}
}
// others xxx
}
Esto se distingue por tarea:
No hay problema cuando se reproduce un solo canal: gradle clean ensamblarChannel1/ensamblarChannel2 puede distinguir el Canal1 en este momento.
Pero si desea acceder a todos los canales, use algo como gradle clean assebmleRelease
En este momento, la tarea está limpia y ensamblada, y no se puede activar el if. Así que este método no es perfecto.