waiting studio solucion queda problemas iniciar for finish error con comunes android gradle android-gradle build.gradle

studio - problemas sdk android



¿Cómo resolver el error de compilación para el sabor del producto, cuando no se encuentra una fuente/recurso referenciado pero innecesario? (4)

Está haciendo referencia al paquete paid paquete free , ya sea que lo use o no:

if(!BuildConfig.FREE) { PaidOperationClass.doSomeStuff(); }

Así que sugiero una de dos opciones:

1.
Entonces, si tiene un código que nunca se usa, ¿por qué lo guarda allí? Quítalo y reemplázalo con:

if(!BuildConfig.FREE) { // Do something within the imported packages. }

De lo contrario, debe importar el paquete paid .

2.
O tener dos versiones de paquetes free

free_paid y free_no_paid y elimine la referencia a paid en free_no_paid y use esto cuando free_no_paid sin paid y use el paquete free_paid cuando free_paid con paid .

Tengo un proyecto y tiene 2 versiones de productos con sus propios directorios:

build.gradle:

android { ... productFlavors { free { applicationId "com.sample.free" buildConfigField "boolean", "free", "true" } paid { applicationId "com.sample" buildConfigField "boolean", "free", "false" } } }

Y tengo una clase (como PaidOperationClass ) que solo se usa en la PaidOperationClass paid . Entonces, puse esa clase en el directorio src/paid/java . Y tengo otra clase (como CommonClass ) que es utilizada por ambos sabores. Así que puse eso bajo el directorio src/main/java :

src/main/ --> has CommonClass src/free/ src/paid/ --> has PaidOperationClass

En CommonClass tengo un método como:

if(!BuildConfig.FREE) { PaidOperationClass.doSomeStuff(); }

Por lo PaidOperationClass se hace referencia a PaidOperationClass (tiene una importación) pero nunca se usa en la compilación libre.

Si construyo la aplicación para el sabor paid todo funciona perfectamente. Pero si trato de compilarlo para free sabor free , falla porque no se encuentra la clase referenciada pero innecesaria. ¿Cómo solucionas esto sin la replicación de código (clase / método) (como poner una PaidOperationClass ficticia bajo sabor free )? ¿Hay alguna opción de gradle que ignore este tipo de errores de compilación al construir?

Edición: Necesito una solución de Gradle que no necesite la replicación de código. Tal vez un script personalizado basado en anotaciones, que elimina el código innecesario para los sabores del producto en el momento de la compilación.


La solución más sencilla podría ser crear una clase: IPaidOperations que se encuentra en el directorio / src / main que implementa PaidOperationClass. Luego solo usa la interfaz en el CommonClass.


No puede hacerlo, porque la declaración de importación está dentro de CommonClass y no puede resolver PaidOperationClass en la PaidOperationClass gratuita.

Una forma de lograrlo es:

Crear una clase vacía en sabor libre :

public class PaidOperationClass{ public static void doSomeStuff(){ //do nothing.. } }


Otra solución es crear dos CommonClass , tanto en conjunto de fuentes free como de paid (pero no en el main ) que contengan código específico para un sabor particular. Por ejemplo: src/free/java/.../CommonClass.java :

doSomeStuff() { doSomeFreeStuff(); }

src/paid/java/.../CommonClass.java :

doSomeStuff() { doSomePaidStuff(); }

En tal caso, el código ubicado en el conjunto de fuente main puede hacer referencia a CommonClass#doSomeStuff() sin importar qué sabor se CommonClass#doSomeStuff() . Sólo se CommonClass una CommonClass para un sabor particular. En otras palabras, en lugar de usar ifs manualmente, le permite a gradle elegir la clase apropiada para compilar.

También puede extraer código realmente común (que no depende de nada específico ni free ni paid ) de CommonClass a clase abstracta, es decir. BaseCommonClass coloca en el conjunto de fuente main y permite que CommonClass amplíe.