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.