From bb8a5ef57cd7d69c766dda6351c5c7c093d063d2 Mon Sep 17 00:00:00 2001 From: Surbhi Maheshwari Date: Mon, 21 Aug 2023 16:00:57 -0700 Subject: [PATCH] Added logic to disable instrumentation for background task --- .../android/sample/SampleApplication.java | 1 + .../splunk/rum/BackgroundProcessDetector.java | 26 +++++++++++++++++++ .../main/java/com/splunk/rum/ConfigFlags.java | 9 +++++++ .../main/java/com/splunk/rum/SplunkRum.java | 10 ++++--- .../java/com/splunk/rum/SplunkRumBuilder.java | 12 +++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 splunk-otel-android/src/main/java/com/splunk/rum/BackgroundProcessDetector.java diff --git a/sample-app/src/main/java/com/splunk/android/sample/SampleApplication.java b/sample-app/src/main/java/com/splunk/android/sample/SampleApplication.java index cb21dc851..9f5ed8bad 100644 --- a/sample-app/src/main/java/com/splunk/android/sample/SampleApplication.java +++ b/sample-app/src/main/java/com/splunk/android/sample/SampleApplication.java @@ -42,6 +42,7 @@ public void onCreate() { .setRumAccessToken(getResources().getString(R.string.rum_access_token)) .enableDebug() .enableDiskBuffering() + .disableBackgroundTaskReporting(BuildConfig.APPLICATION_ID) .setSlowRenderingDetectionPollInterval(Duration.ofMillis(1000)) .setDeploymentEnvironment("demo") .limitDiskUsageMegabytes(1) diff --git a/splunk-otel-android/src/main/java/com/splunk/rum/BackgroundProcessDetector.java b/splunk-otel-android/src/main/java/com/splunk/rum/BackgroundProcessDetector.java new file mode 100644 index 000000000..9e22ee12b --- /dev/null +++ b/splunk-otel-android/src/main/java/com/splunk/rum/BackgroundProcessDetector.java @@ -0,0 +1,26 @@ +package com.splunk.rum; + +import android.annotation.SuppressLint; +import android.app.Application; +import android.os.Build; +import java.lang.reflect.Method; + +public class BackgroundProcessDetector { + public static Boolean isBackgroundProcess(String applicationId) { + String applicationProcessName = ""; + if (Build.VERSION.SDK_INT >= 28) + applicationProcessName = Application.getProcessName(); + else { + try { + @SuppressLint("PrivateApi") + Class activityThread = Class.forName("android.app.ActivityThread"); + String methodName = "currentProcessName"; + @SuppressLint("PrivateApi") Method getProcessName = activityThread.getDeclaredMethod(methodName); + applicationProcessName = (String) getProcessName.invoke(null); + } catch (Exception e) { + } + } + + return applicationProcessName != null && applicationProcessName.equals(applicationId); + } +} diff --git a/splunk-otel-android/src/main/java/com/splunk/rum/ConfigFlags.java b/splunk-otel-android/src/main/java/com/splunk/rum/ConfigFlags.java index d3134fbca..ef1bab0ed 100644 --- a/splunk-otel-android/src/main/java/com/splunk/rum/ConfigFlags.java +++ b/splunk-otel-android/src/main/java/com/splunk/rum/ConfigFlags.java @@ -26,6 +26,7 @@ class ConfigFlags { private boolean networkMonitorEnabled = true; private boolean anrDetectionEnabled = true; private boolean slowRenderingDetectionEnabled = true; + private boolean backgroundTaskInstrumentationEnabled = true; void enableDebug() { debugEnabled = true; @@ -55,10 +56,18 @@ void disableSlowRenderingDetection() { slowRenderingDetectionEnabled = false; } + public void disableBackgroundTaskDetection() { + backgroundTaskInstrumentationEnabled = false; + } + boolean isDebugEnabled() { return debugEnabled; } + boolean isBackgroundTaskInstrumentationEnabled() { + return backgroundTaskInstrumentationEnabled; + } + boolean isAnrDetectionEnabled() { return anrDetectionEnabled; } diff --git a/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRum.java b/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRum.java index 710afe521..6ba762e9a 100644 --- a/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRum.java +++ b/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRum.java @@ -100,9 +100,13 @@ static SplunkRum initialize( return INSTANCE; } - INSTANCE = - new RumInitializer(builder, application, startupTimer) - .initialize(currentNetworkProviderFactory, Looper.getMainLooper()); + if(builder.isBackgroundTaskReportingEnabled()) { + INSTANCE = NoOpSplunkRum.INSTANCE; + } else { + INSTANCE = + new RumInitializer(builder, application, startupTimer) + .initialize(currentNetworkProviderFactory, Looper.getMainLooper()); + } if (builder.isDebugEnabled()) { Log.i( diff --git a/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRumBuilder.java b/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRumBuilder.java index 1b826a1e6..609517f20 100644 --- a/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRumBuilder.java +++ b/splunk-otel-android/src/main/java/com/splunk/rum/SplunkRumBuilder.java @@ -314,6 +314,14 @@ public SplunkRum build(Application application) { return SplunkRum.initialize(this, application, CurrentNetworkProvider::createAndStart); } + public SplunkRumBuilder disableBackgroundTaskReporting(String applicationId) { + Boolean isBackgroundProcess = BackgroundProcessDetector.isBackgroundProcess(applicationId); + if(isBackgroundProcess) { + configFlags.disableBackgroundTaskDetection(); + } + return this; + } + // one day maybe these can use kotlin delegation ConfigFlags getConfigFlags() { return configFlags; @@ -350,4 +358,8 @@ boolean isDiskBufferingEnabled() { boolean isReactNativeSupportEnabled() { return configFlags.isReactNativeSupportEnabled(); } + + boolean isBackgroundTaskReportingEnabled() { + return configFlags.isBackgroundTaskInstrumentationEnabled(); + } }