Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Construir sabores para diferentes versiones de la misma clase

Tengo un proyecto estructurado de la siguiente manera:

project/ | |---src/ |---flavorA2/ | | | |---java/ | | |---com.abc.flavorA.mk2 | | |-----classA.java | | |-----classB.java | |---res/ | |---AndroidManifest.xml | |---main | |---java/ | | |---com.abc.flavorA | | |-----classA.java | | |-----classB.java | | |-----classC.java | | |-----classD.java | |---res/ | | |---drawable/ | | |---layout/ | | |---values/ | | | |---AndroidManifest.xml | |---flavorA 

flavorA utilizará la fuente y los activos de la main completamente, mientras que flavorA2 tiene algunos pequeños cambios en classA y classB y el nombre del paquete también se cambia a com.abc.flavorA.mk2 .

Tuve el archivo build.gradle como este:

 ... buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } productFlavors { flavorA2 { packageName "com.abc.flavorA.mk2" versionCode 2 versionName "1.0.1" } flavorA { packageName "com.abc.flavorA" } } ... 

flavorA2 el código seleccionando la variante de construcción a flavorA2 . Sin embargo, los resultados corrientes muestran que el gradle sigue eligiendo las clases ( classA y classB ) de main lugar de usar la versión modificada dentro de flavorA2 .

¿Me estoy perdiendo de algo?

  • No se pudo resolver: com.android.support:cardview-v7:26.0.0 android
  • Butterknife 8.1.0 no funciona con JDK 1.8 en Android Studio 2.1.2
  • Múltiples advertencias al crear usando Proguard
  • El elemento uses-sdk no puede tener un atributo "tools: node"
  • Se produjo un error de tarea Gradle en el proyecto de estudio android
  • Falló la ejecución de Gradle 2.2.0: SymbolForDebug
  • Confused sobre testCompile y androidTestCompile en Android Gradle
  • Android ¿Cuál es la diferencia entre Android Support Repository vs Android Support Library vs Repositorio de Google vs Google Play Services
  • 3 Solutions collect form web for “Construir sabores para diferentes versiones de la misma clase”

    Puesto que usted tiene las clases en 2 paquetes diferentes, estas son clases totalmente diferentes. Así que las clases no se están reemplazando.

    Con los sabores, no puede anular archivos de clase. Por lo tanto, una manera de lograr lo que quieres es mover estas clases fuera de main , y en flavorA .

    Así que usted tendría algo como esto:

     project/ | |---src/ |---flavorA2/ | | | |---java/ | | |---com.abc | | |-----classA.java | | |-----classB.java | |---res/ | |---AndroidManifest.xml | |---main/ | |---java/ | | |---com.abc.flavorA | | |-----classC.java | | |-----classD.java | |---res/ | | |---drawable/ | | |---layout/ | | |---values/ | | | |---AndroidManifest.xml | |---flavorA/ | |---java/ | | |---com.abc | | |-----classA.java | | |-----classB.java 

    De esta manera, siempre que elija un sabor, sólo una versión de ClassA y ClassB será visible.

    En la variante de construcción principal, la clase A es com.abc.flavorA.classA , y en flavorA2 es com.abc.flavorA.mk2.classA . Estos son dos nombres de clase completamente calificados diferentes y por lo tanto dos clases diferentes.

    Realmente no puedes anular clases enteras en un sabor. Dependiendo de lo que desee hacer, es posible que desee examinar el mecanismo BuildConfig . En resumen, se trata de una clase generada por el sistema de compilación que puede tener valores o instrucciones que varían dependiendo del tipo de construcción y el sabor. Puede tener código de tiempo de ejecución que mira constantes en esa clase y varía su comportamiento.

    Ver Android Studio Update 0.4.0 no pudo encontrar buildConfig () para obtener más información sobre la sintaxis, pero en resumen, se ve así:

     productFlavors { flavor { buildConfigField "boolean", "MY_FLAG", "true" } } 

    Es necesario especificar los conjuntos de sourceSets en el archivo de compilación. Debes modificar la estructura de tu directorio para que solo los nombres de las carpetas sean diferentes, todo bajo el directorio java debe ser el mismo, así que elimina el mk2 del nombre de la clase. No estoy seguro de si la sintaxis es totalmente correcta, pero debería tener este aspecto:

     android { sourceSets { flavorA { java { srcDirs = ['src/flavorA/java'] } } flavorA2 { java { srcDirs = ['src/flavorA2/java'] } } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.