¿Puedo inicializar Firebase sin usar google-services.json?

EDIT: Debo enfatizar, tengo sabores, para los cuales no quiero usar ninguno de estos servicios de Google, e intentar aplicar el plugin google-services en tal caso, sin tener un google-services.json aplicable, sería Resultan en una compilación fallida.

Quisiera poder inicializar el SDK de Firebase, específicamente utilizar la configuración alejada, SIN usar google-services.json.

Veo que FirebaseApp tiene un método initialize, que recibe un objeto FirebaseOptions.

He construido FirebaseOptions con los valores proporcionados en google-services.json, y después de llamar a FirebaseApp.initialize con estas opciones, siempre obtengo

FirebaseInitProvider: FirebaseApp initialization unsuccessful 

Sé que es la forma recomendada de usar el archivo google-services.json, pero necesito poder hacer que la aplicación llame a diferentes proyectos de Firebase, dependiendo de las compilaciones de depuración / lanzamiento, manteniendo el nombre del paquete igual.

La forma en que me gustaría hacer esto es tener un par de depuración / release para todos los valores necesarios para inicializar Firebase, y luego hacer la inicialización dinámicamente.

  FirebaseOptions options = new FirebaseOptions.Builder() .setApplicationId(appId) .setApiKey(apiKey) .setGcmSenderId(appContext.getString( isDebug ? R.string.firebase_testing_gcm_sender_id : R.string.firebase_production_gcm_sender_id)) .setDatabaseUrl(appContext.getString( isDebug ? R.string.firebase_testing_database_url : R.string.firebase_production_database_url)) .setStorageBucket( appContext.getString( isDebug ? R.string.firebase_testing_storage_bucket : R.string.firebase_production_storage_bucket)) .build(); FirebaseApp.initializeApp(appContext, options); 

Hasta ahora no parece funcionar.

¡Toda ayuda es muy apreciada!

Aquí hay algunos punteros sobre cómo usar múltiples aplicaciones / bases de datos de firebase en el mismo proyecto android Blog de Firebase y nuevos documentos de configuración

Sin embargo, estos hablan sobre el uso de una aplicación secundaria, además de la aplicación predeterminada – que todavía utiliza el google-services.json. Hice un poco de investigación y metiéndose en su canal Slack. Firebase utiliza un ContentProvider llamado FirebaseInitProvider. Utiliza google-services.json para inicializar la aplicación DEFAULT al iniciar. Se barfs si el archivo json no está presente. Hice los siguientes pasos:

  • Se ha eliminado el servicio google-services.json
  • Se ha eliminado el complemento com.google.gms.google-services. Este plugin siempre busca el archivo json.
  • FirebaseInitProvider se añade mediante la combinación de manifiesto. Sin embargo, en el manifiesto de nivel superior se puede especificar un nodo = eliminar etiqueta para eliminar esto de ser agregado en el manifiesto final.

     <provider android:authorities="${applicationId}.firebaseinitprovider" android:name="com.google.firebase.provider.FirebaseInitProvider" android:exported="false" tools:node="remove"/> 

Sin embargo, incluso después de esto, todavía veo una excepción:

 java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process myfirebasedemo.net. Make sure to call FirebaseApp.initializeApp(Context) first. at com.google.firebase.FirebaseApp.getInstance(Unknown Source) at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source) at com.google.firebase.iid.FirebaseInstanceIdService.zza(Unknown Source) at com.google.firebase.iid.FirebaseInstanceIdService.zzm(Unknown Source) at com.google.firebase.iid.zzb$2.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 

Parece que FirebaseInstanceIdService sigue buscando la aplicación de instancia. Si deshabilita el servicio, utilizando la misma técnica de eliminación de nodo de manifiesto, esta excepción desaparece. Pero creo que este servicio hace cosas importantes de sincronización / mensajería. Así que no estoy seguro si su sabio para quitar esto. Larga historia corta – Todavía estoy buscando la solución perfecta para deshabilitar la aplicación predeterminada / no usando google-services.json. Cualquier puntero adicional será apreciado profundamente.

ACTUALIZAR:

Parece que esta solución funciona después de todo – sin deshabilitar el FirebaseInstanceIdService y sólo la eliminación de FirebaseInitProvider como se mencionó anteriormente. Sólo tiene que asegurarse de que el Firebase.initializeApp llamado lo primero en Application :: onCreate método.

 FirebaseApp.initializeApp(context, new FirebaseOptions.Builder().setApiKey("<VAL>"). setApplicationId("<VAL>"). setDatabaseUrl("<VAL>"). setGcmSenderId("<VAL>"). setStorageBucket("<VAL>").build()); 

He encontrado una solución interesante. Prueba lo siguiente: pon tu google-services.json en cualquier aplicación de ejemplo que google proporciona para la integración de Firebase. Compilarlo.

Eche un vistazo a la ruta de acceso de la app/build/generated/res/google-services/debug/values/ debería generarse archivo values.xml con un montón de cadenas mencionadas en los errores que describió. Copie estas cadenas al archivo value.xml de su proyecto. Eso es.

También estoy usando variantes de construcción para aplicar diferentes configuraciones para diferentes entornos. Tuve el mismo problema, ya que algunas de las variantes no tenían una entrada adecuada en el archivo google-services.json . Que causó que algunas de mis compilaciones fallaran al generar un paquete de aplicación que no estaba configurado en firebase.

Mi solución para esto fue añadir entradas de aplicaciones ficticias para los paquetes que faltan en los proyectos de firebase pertinentes, en el panel de control de firebase y luego obtener el archivo google-services.json actualizado de él.

Puede que no sea la mejor práctica, pero hizo el trabajo en mi caso.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.