如何将分析添加到 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;
}
}
我有一个使用 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;
}
}