Firebase分析事件记录在多进程应用程序中

时间:2016-07-14 09:46:39

标签: android firebase firebase-analytics

我已将Firebase分析集成到我的应用中,该应用有两个流程:后台流程和 UI 流程。我使用Firebase的经历是,我能够从 UI 进程记录事件,但不能从后台进程记录事件。

我可以通过Android Studio控制台上的Firebase日志查看,但是当从背景进程中记录时,事件已记录但从未计划在Firebase控制台上上传。这是Firebase分析所遵循的行为 - 仅从单个进程记录事件吗?如果是,那么它如何决定从哪个进程记录事件?

我需要记录来自这两个进程的事件,以便了解完整的用户体验,他的app健康状况以及其他一些重要参数。

感谢所有帮助。

2 个答案:

答案 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秒您将看不到第二批上传的活动。在第二批活动上传前大约一小时。

如果您让模拟器保持运行,则后台事件应在几小时内显示在您的报告上。