Firebase(Android版)中的session_start出错
在我的Android应用中遇到一个随机问题:在大多数Firebase崩溃日志里,突然出现大量来自 session_start 的事件,简直离谱。这在我其他项目中从未见过,并且是随机开始的。我也搞不清楚为什么会有这么多。我把会话超时设置为30分钟,然而它却一直这样发生。我真的不太明白这是怎么回事。
在我的应用中,我得到的是:
private lateinit var analytics: FirebaseAnalytics
private lateinit var crashlytics: FirebaseCrashlytics
以及在 onCreate
analytics = Firebase.analytics
analytics.setSessionTimeoutDuration(30 * 60 * 1000L)
crashlytics = Firebase.crashlytics
此外,还有一个遗留的跟踪对象也在使用它:
import com.google.firebase.analytics.analytics
import com.google.firebase.crashlytics.crashlytics
object Tracker : KoinComponent {
private val firebaseAnalytics: FirebaseAnalytics = Firebase.analytics
private val firebaseCrashlytics: FirebaseCrashlytics = Firebase.crashlytics
...
}
除此之外,它们在代码中没有出现在其他地方。我使用AGP 9.2,并搭配当前的Firebase BOM 34.13.0,以及Koin和 KoinAnnotations。我尝试了很多方法:
- 用Koin注入Firebase
- 设置会话超时
- 清理我的主Activity(MainActivity)
- 回退到较旧的Firebase版本(回到没有发生问题的版本,但后来还是发生了)
我有点束手无策,因为这让统计会话和得到合理的统计数据变得非常困难。还有人遇到过这种情况吗,或者知道如何解决这个问题?
解决方案
Check your AndroidManifest.xml (and merged manifests) for anything containing android:process. If you intentionally have a multi-process app, you must disable Firebase Analytics in the non-main processes.
Update your main Application class (or where you initialize Koin) to guard Firebase initialization:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (isMainProcess()) {
// Initialize Koin and any Firebase configurations here
Firebase.analytics.setSessionTimeoutDuration(30 * 60 * 1000L)
} else {
// Disable analytics for background/secondary processes
Firebase.analytics.setAnalyticsCollectionEnabled(false)
}
}
private fun isMainProcess(): Boolean {
return packageName == getProcessName()
}
}
你提到你有一个遗留的Tracker对象:
object Tracker : KoinComponent {
private val firebaseAnalytics: FirebaseAnalytics = Firebase.analytics
// ...
}
Instead of using a static object that pulls dependencies implicitly, migrate it to a standard class and let Koin manage it as a single instance initialized on startup.
// Change from 'object' to 'class'
class Tracker(
private val firebaseAnalytics: FirebaseAnalytics,
private val firebaseCrashlytics: FirebaseCrashlytics
) {
// Your tracking logic
}
// In your Koin module:
val appModule = module {
single { Firebase.analytics }
single { Firebase.crashlytics }
single { Tracker(get(), get()) }
}
用于验证与调试
adb shell setprop logcat.dest.log.tag.FA VERBOSE
adb shell setprop logcat.dest.log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
请尝试这个,看看是否对你有用,并告诉我结果。