El código Gradle de Android implementa el canal especificado sin introducir referencias

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.

Supongo que te gusta

Origin blog.csdn.net/vistaup/article/details/131681626
Recomendado
Clasificación