如何将分析添加到 Android 应用程序,在其自己的进程中使用库

How to add analytics to an Android application with a library in its own process

我有一个使用 Google 分析的 Android 应用程序。作为 recommended by Google, it overrides android.app.Application 并在其 AndroidManifest.xml 中提供 class 名称:

<application
    android:name=".MyApplication">

我的应用程序依赖于一个库,该库包含一个必须 运行 在其自己的进程中的服务。因此,它的 AndroidManifest.xml 有:

<application>
    <service
        android:name="org.myservice"
        android:enabled="true"
        android:exported="false"
        android:process=":myservice">

当 运行ning 时,我发现 MyApplication 的第二个独立实例在库的进程中启动。这会尝试设置分析等。但是图书馆从来没有要求过这个 class 也不需要它。

我试图在库的 AndroidManifest.xml 中声明一个不同的应用程序 class,但这会导致 "Manifest merger failed" 构建错误。

如何使库进程不依赖于 MyApplication

因为清单合并在一起,所以只能有一个由 android:name 指定的 class(在一个库或主应用程序中)。每个进程将实例化这些对象之一。

我的解决方案是让主应用程序 class 检测进程名称是否与 APPLICATION_ID 匹配。这仅适用于主进程,不适用于任何其他进程。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // The print library has its own process but will use this class.
        // Only set up analytics if we are in the main process.
        if (isMainProcess()) {
            // Once-per-app code here
        }
    }

    public boolean isMainProcess() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == android.os.Process.myPid()) {
                return TextUtils.equals(BuildConfig.APPLICATION_ID,
                        processInfo.processName);
            }
        }
        return false;
    }
}