我已将Firebase分析集成到我的应用中,该应用有两个流程:后台流程和 UI 流程。我使用Firebase的经历是,我能够从 UI 进程记录事件,但不能从后台进程记录事件。
我可以通过Android Studio控制台上的Firebase日志查看,但是当从背景进程中记录时,事件已记录但从未计划在Firebase控制台上上传。这是Firebase分析所遵循的行为 - 仅从单个进程记录事件吗?如果是,那么它如何决定从哪个进程记录事件?
我需要记录来自这两个进程的事件,以便了解完整的用户体验,他的app健康状况以及其他一些重要参数。
感谢所有帮助。
答案 0 :(得分:5)
要从多个流程记录Firebase Analytics事件,您需要在第二个流程中手动初始化Firebase。半自动Firebase设置主要需要单进程应用程序,并且除了大多数API(崩溃报告除外)之外还需要额外的设置工作。
基本上,在第二个进程初始化时调用以下内容,假设您通过google-services.json
文件和Google Services Gradle插件配置了Firebase:
FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context))
稍微棘手的部分可以是如何确保仅调用一次,并且仅在第二个过程中调用。一种方法是模仿Firebase本身对第一个进程的影响(通过Manifest merging) - 定义一个ContentProvider。所以在你的Manifest中添加如下内容:
<provider
android:name=".MyFBProvider"
android:authorities="org.mydomain.mytestapp.MyFBProvider"
android:process=":myexternalprocess"
android:exported="false"
android:syncable="false" />
您的ContentProvider看起来基本上是这样的,加上所有抽象方法的空覆盖:
public class MyFBProvider extends ContentProvider {
private static boolean created = false;
@Override
public boolean onCreate() {
if (created) {
// Workaround for https://issuetracker.google.com/issues/37045392
return false;
}
Context context = getContext();
FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context));
created = true;
// Return false to mimic behavior of FirebaseInitProvider.
// It should keep the pseudo ContentProvider from being a real one.
return false;
}
...
}
使用ContentProvider可确保代码在进程初始化期间的所有其他代码之前运行,并且仅在您指定的进程中运行。
答案 1 :(得分:0)
Firebase Analytics支持多进程应用。您是使用Google Play服务在设备上测试过的,还是在没有Google Play服务的模拟器上测试过您的应用。使用启用的调试日志记录捕获logcat输出将回答大部分问题。
为了节省电池消耗事件,不是每隔一小时上传一次。如果您有来自主进程的已记录事件等待查看上传(通常在没有Google Play服务的设备上记录第一个事件后15秒),则会从辅助进程记录更多事件并等待另外15秒您将看不到第二批上传的活动。在第二批活动上传前大约一小时。
如果您让模拟器保持运行,则后台事件应在几小时内显示在您的报告上。