diff --git a/packages/react-native/android/src/main/java/backtrace/library/BacktraceDatabase.java b/packages/react-native/android/src/main/java/backtrace/library/BacktraceDatabase.java index 00a0f152..db620963 100644 --- a/packages/react-native/android/src/main/java/backtrace/library/BacktraceDatabase.java +++ b/packages/react-native/android/src/main/java/backtrace/library/BacktraceDatabase.java @@ -9,4 +9,6 @@ public static native boolean initialize(String url, String databasePath, String public static native void addAttribute(String name, String value); + + public static native void addAttachment(String attachmentPath); } diff --git a/packages/react-native/android/src/main/java/backtrace/library/BacktraceReactNative.java b/packages/react-native/android/src/main/java/backtrace/library/BacktraceReactNative.java index f8b51b14..4c3577e4 100644 --- a/packages/react-native/android/src/main/java/backtrace/library/BacktraceReactNative.java +++ b/packages/react-native/android/src/main/java/backtrace/library/BacktraceReactNative.java @@ -14,7 +14,10 @@ import android.content.Context; import java.io.File; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; import backtraceio.library.nativeCalls.*; import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; @@ -33,6 +36,8 @@ public class BacktraceReactNative extends ReactContextBaseJavaModule { private final Context context; + private final Set registeredAttachments = new HashSet<>(); + public BacktraceReactNative(ReactApplicationContext reactContext) { super(reactContext); this.context = reactContext.getApplicationContext(); @@ -58,6 +63,8 @@ public Boolean initialize(String minidumpSubmissionUrl, String databasePath, Rea String[] keys = attributes.keySet().toArray(new String[0]); String[] values = attributes.values().toArray(new String[0]); + String[] attachments = attachmentPaths.toArrayList().toArray(new String[0]); + BacktraceCrashHandlerWrapper nativeCommunication = new BacktraceCrashHandlerWrapper(); Boolean result = nativeCommunication.initializeJavaCrashHandler( minidumpSubmissionUrl, @@ -65,9 +72,11 @@ public Boolean initialize(String minidumpSubmissionUrl, String databasePath, Rea crashHandlerConfiguration.getClassPath(), keys, values, - attachmentPaths.toArrayList().toArray(new String[0]), + attachments, crashHandlerConfiguration.getCrashHandlerEnvironmentVariables(this.context.getApplicationInfo()).toArray(new String[0]) - ); + ); + + this.registeredAttachments.addAll(Arrays.asList(attachments)); return result; } @@ -85,6 +94,18 @@ public void useAttributes(ReadableMap readableAttributes) { } + @ReactMethod() + public void useAttachments(ReadableArray attachmentPaths) { + for (int attachmentIndex = 0; attachmentIndex < attachmentPaths.size(); attachmentIndex++) { + String attachmentPath = attachmentPaths.getString(attachmentIndex); + if (attachmentPath == null || !this.registeredAttachments.add(attachmentPath)) { + continue; + } + BacktraceDatabase.addAttachment(attachmentPath); + } + } + + @ReactMethod() public void crash() { BacktraceBase.crash(); diff --git a/packages/react-native/src/crashReporter/CrashReporter.ts b/packages/react-native/src/crashReporter/CrashReporter.ts index a88db712..9b724696 100644 --- a/packages/react-native/src/crashReporter/CrashReporter.ts +++ b/packages/react-native/src/crashReporter/CrashReporter.ts @@ -61,7 +61,6 @@ export class CrashReporter { if (!this._enabled) { return; } - // Android does not expose useAttachments. if (typeof CrashReporter.BacktraceReactNative.useAttachments !== 'function') { return; }