多进程应用程序中的 Firebase 分析事件日志记录

Firebase analytics event logging in multi-process app

我已经将 Firebase 分析集成到我的应用程序中,它有两个进程:一个 Background 进程和一个 UI 进程。我使用 Firebase 的体验是,我能够记录来自 UI 进程的事件,但不能记录来自 Background 进程的事件。

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

我需要记录这两个进程的事件,以便了解完整的用户体验、他的应用运行状况和其他一些重要参数。

感谢所有帮助。

Firebase Analytics 支持多进程应用。您是在使用 Google Play 服务的设备上还是在模拟器 w/o Google Play 服务上测试您的应用程序。捕获启用调试日志记录的 logcat 输出将回答大部分问题。

为了保护电池耗尽事件,上传频率不超过每小时一次。如果您已经记录了来自主进程的事件等待查看上传(这通常发生在设备 w/o Google Play 服务上记录第一个事件后 15 秒)然后从辅助进程记录更多事件并等待另一个15 秒后您将看不到正在上传的第二批事件。距离第二批事件上传大约还有一个小时。

如果您离开了模拟器 运行,后台事件应该会在几个小时内出现在您的报告中。

要记录来自多个进程的 Firebase Analytics 事件,您需要在第二个进程中手动初始化 Firebase。半自动化的 Firebase 设置在很大程度上需要单进程应用程序,并且对于大多数 API(崩溃报告除外)需要额外的设置工作。

假设您通过 google-services.json 文件和 Google 服务 Gradle 插件配置了 Firebase,基本上您会在第二个进程初始化时调用以下命令:

FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context))

稍微棘手的部分可能是如何确保只调用一次,并且只在第二个进程中调用。一种方法是模仿 Firebase 本身为第一个过程所做的事情(通过 Manifest merging)——定义一个 ContentProvider。因此,在您的清单中添加如下内容:

<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 可确保代码 运行 在流程初始化期间的所有其他内容之前,并且仅在您指定的流程中。