Reputation: 53
I have a multi-module Android project. The Modules are: "app", "core", "auth", "coreAndroid", and various feature modules. I am trying to add Firebase Crashlytics to the "core" module that is kotlin-only, so that I can create a function like:
fun cLog(msg: String?){
FirebaseCrashlytics.getInstance().log(msg)
}
which will be accessed by all kotlin-only modules (like networking) to log error messages.
I have followed the official documentation but I can get the FirebaseCrashlytics Instance only in Android Modules. The google-services.json file is in the "app" module. I have been trying various solutions from the web for 3 days now but nothing seems to work.
The way that I have structured my gradle files is that I have an android-library-build.gradle and a library-build.gradle file, each of which act as a common ground for for their respective android and kotlin-only modules.
These are my gradle files:
(app) build.gradle.kts
plugins {
id("com.android.application")
kotlin("android")
kotlin("plugin.serialization") version Kotlin.version //"1.6.10"
kotlin("kapt")
id ("com.google.firebase.crashlytics")
id ("com.google.gms.google-services")
}
...
dependencies {
...
implementation (platform("com.google.firebase:firebase-bom:31.2.0"))
implementation ("com.google.firebase:firebase-analytics-ktx")
implementation ("com.google.firebase:firebase-crashlytics-ktx")
}
(project) build.gradle.kts
buildscript {
val kotlin_version by extra("1.8.0")
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
dependencies {
...
// Dependency for the Google services Gradle plugin
classpath("com.google.gms:google-services:4.3.15")
// Dependency for the Crashlytics Gradle plugin
classpath("com.google.firebase:firebase-crashlytics-gradle:2.9.4")
}
}
android-library-build.gradle
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'androidx.navigation.safeargs.kotlin'
...
dependencies {
...
implementation (platform("com.google.firebase:firebase-bom:31.2.0"))
implementation ("com.google.firebase:firebase-analytics-ktx")
implementation ("com.google.firebase:firebase-crashlytics-ktx")
}
library-build.gradle
apply plugin: 'java-library'
apply plugin: 'org.jetbrains.kotlin.jvm'
dependencies{
...
implementation (platform("com.google.firebase:firebase-bom:31.2.0"))
implementation ("com.google.firebase:firebase-analytics-ktx")
implementation ("com.google.firebase:firebase-crashlytics-ktx")
}
apply {
plugin("com.google.firebase.crashlytics")
plugin("com.google.gms.google-services")
}
(core) build.gradle.kts
apply {
from("$rootDir/library-build.gradle")
}
plugins {
kotlin(KotlinPlugins.serialization) version Kotlin.version
}
dependencies {
...
}
I have also tried:
I really can't figure it out. Any help would be deeply appreciated.
Upvotes: 0
Views: 1635
Reputation: 53
After the comments of @CommonsWare, it seems that its not possible to use directly the crashlytics library in a kotlin-only module.
I have found another way using an Interface in the koltin-only "core" module, and its implementation in the "app" module that has access to the crashlytics libraries.
Here is a simple example:
"core" module:
interface CrashlyticsService {
fun cLog(message: String?)
}
"app" module:
class FirebaseCrashlyticsService : CrashlyticsService {
override fun cLog(message: String?){
message?.let {
FirebaseCrashlytics.getInstance().log(it)
}
}
}
And then, wherever I want to use the cLog function in other modules that depend on "core" i just inject it in the constructor of the Class, i.e. :
class NetworkingServiceImpl(
private val httpClient: HttpClient,
private val crashlyticsService: CrashlyticsService
) : NetworkingService {
override suspend fun downloadVideo(videoUrl: String): ByteArray {
crashlyticsService.cLog("This is a crash test message")
return httpClient.get(videoUrl).body()
}
}
Upvotes: 0