Skip to content

Commit c978477

Browse files
authored
refactor: move native SDK init and close to SentryNativeBinding (#2030)
* refactor: move native SDK init and close to SentryNativeBinding * fixup * rename test file * test files cleanup
1 parent 6fedcab commit c978477

12 files changed

+362
-329
lines changed
Lines changed: 17 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,26 @@
11
import 'dart:async';
22

3-
import 'package:flutter/services.dart';
43
import 'package:sentry/sentry.dart';
4+
import '../native/sentry_native.dart';
55
import '../sentry_flutter_options.dart';
66

77
/// Enables Sentry's native SDKs (Android and iOS) with options.
88
class NativeSdkIntegration implements Integration<SentryFlutterOptions> {
9-
NativeSdkIntegration(this._channel);
9+
NativeSdkIntegration(this._native);
1010

11-
final MethodChannel _channel;
1211
SentryFlutterOptions? _options;
12+
final SentryNative _native;
1313

1414
@override
1515
Future<void> call(Hub hub, SentryFlutterOptions options) async {
1616
_options = options;
17+
1718
if (!options.autoInitializeNativeSdk) {
1819
return;
1920
}
20-
try {
21-
await _channel.invokeMethod('initNativeSdk', <String, dynamic>{
22-
'dsn': options.dsn,
23-
'debug': options.debug,
24-
'environment': options.environment,
25-
'release': options.release,
26-
'enableAutoSessionTracking': options.enableAutoSessionTracking,
27-
'enableNativeCrashHandling': options.enableNativeCrashHandling,
28-
'attachStacktrace': options.attachStacktrace,
29-
'attachThreads': options.attachThreads,
30-
'autoSessionTrackingIntervalMillis':
31-
options.autoSessionTrackingInterval.inMilliseconds,
32-
'dist': options.dist,
33-
'integrations': options.sdk.integrations,
34-
'packages':
35-
options.sdk.packages.map((e) => e.toJson()).toList(growable: false),
36-
'diagnosticLevel': options.diagnosticLevel.name,
37-
'maxBreadcrumbs': options.maxBreadcrumbs,
38-
'anrEnabled': options.anrEnabled,
39-
'anrTimeoutIntervalMillis': options.anrTimeoutInterval.inMilliseconds,
40-
'enableAutoNativeBreadcrumbs': options.enableAutoNativeBreadcrumbs,
41-
'maxCacheItems': options.maxCacheItems,
42-
'sendDefaultPii': options.sendDefaultPii,
43-
'enableWatchdogTerminationTracking':
44-
options.enableWatchdogTerminationTracking,
45-
'enableNdkScopeSync': options.enableNdkScopeSync,
46-
'enableAutoPerformanceTracing': options.enableAutoPerformanceTracing,
47-
'sendClientReports': options.sendClientReports,
48-
'proguardUuid': options.proguardUuid,
49-
'maxAttachmentSize': options.maxAttachmentSize,
50-
'recordHttpBreadcrumbs': options.recordHttpBreadcrumbs,
51-
'captureFailedRequests': options.captureFailedRequests,
52-
'enableAppHangTracking': options.enableAppHangTracking,
53-
'connectionTimeoutMillis': options.connectionTimeout.inMilliseconds,
54-
'readTimeoutMillis': options.readTimeout.inMilliseconds,
55-
'appHangTimeoutIntervalMillis':
56-
options.appHangTimeoutInterval.inMilliseconds,
57-
});
5821

22+
try {
23+
await _native.init(options);
5924
options.sdk.addIntegration('nativeSdkIntegration');
6025
} catch (exception, stackTrace) {
6126
options.logger(
@@ -69,19 +34,17 @@ class NativeSdkIntegration implements Integration<SentryFlutterOptions> {
6934

7035
@override
7136
Future<void> close() async {
72-
final options = _options;
73-
if (options != null && !options.autoInitializeNativeSdk) {
74-
return;
75-
}
76-
try {
77-
await _channel.invokeMethod('closeNativeSdk');
78-
} catch (exception, stackTrace) {
79-
_options?.logger(
80-
SentryLevel.fatal,
81-
'nativeSdkIntegration failed to be closed',
82-
exception: exception,
83-
stackTrace: stackTrace,
84-
);
37+
if (_options?.autoInitializeNativeSdk == true) {
38+
try {
39+
await _native.close();
40+
} catch (exception, stackTrace) {
41+
_options?.logger(
42+
SentryLevel.fatal,
43+
'nativeSdkIntegration failed to be closed',
44+
exception: exception,
45+
stackTrace: stackTrace,
46+
);
47+
}
8548
}
8649
}
8750
}

flutter/lib/src/native/factory_real.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ import 'package:flutter/services.dart';
22

33
import '../../sentry_flutter.dart';
44
import 'cocoa/sentry_native_cocoa.dart';
5+
import 'java/sentry_native_java.dart';
56
import 'sentry_native_binding.dart';
67
import 'sentry_native_channel.dart';
78

89
SentryNativeBinding createBinding(PlatformChecker pc, MethodChannel channel) {
910
if (pc.platform.isIOS || pc.platform.isMacOS) {
1011
return SentryNativeCocoa(channel);
12+
} else if (pc.platform.isAndroid) {
13+
return SentryNativeJava(channel);
1114
} else {
1215
return SentryNativeChannel(channel);
1316
}

flutter/lib/src/native/factory_web.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import '../../sentry_flutter.dart';
44
import 'sentry_native_binding.dart';
55

66
// This isn't actually called, see SentryFlutter.init()
7-
SentryNativeBinding createBinding(PlatformChecker pc, MethodChannel channel) {
7+
SentryNativeBinding createBinding(PlatformChecker _, MethodChannel __) {
88
throw UnsupportedError("Native binding is not supported on this platform.");
99
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'package:meta/meta.dart';
2+
3+
import '../sentry_native_channel.dart';
4+
5+
// Note: currently this doesn't do anything. Later, it shall be used with
6+
// generated JNI bindings. See https://github.com/getsentry/sentry-dart/issues/1444
7+
@internal
8+
class SentryNativeJava extends SentryNativeChannel {
9+
SentryNativeJava(super.channel);
10+
}

flutter/lib/src/native/sentry_native.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ class SentryNative {
3030
/// Flag indicating if app start measurement was added to the first transaction.
3131
bool didAddAppStartMeasurement = false;
3232

33+
Future<void> init(SentryFlutterOptions options) async =>
34+
_invoke("init", () => _binding.init(options));
35+
36+
Future<void> close() async => _invoke("close", _binding.close);
37+
3338
/// Fetch [NativeAppStart] from native channels. Can only be called once.
3439
Future<NativeAppStart?> fetchNativeAppStart() async {
3540
_didFetchAppStart = true;

flutter/lib/src/native/sentry_native_binding.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import 'sentry_native.dart';
99
@internal
1010
abstract class SentryNativeBinding {
1111
// TODO Move other native calls here.
12+
Future<void> init(SentryFlutterOptions options);
13+
14+
Future<void> close();
1215

1316
Future<NativeAppStart?> fetchNativeAppStart();
1417

flutter/lib/src/native/sentry_native_channel.dart

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,49 @@ class SentryNativeChannel implements SentryNativeBinding {
1717

1818
// TODO Move other native calls here.
1919

20+
@override
21+
Future<void> init(SentryFlutterOptions options) async =>
22+
_channel.invokeMethod('initNativeSdk', <String, dynamic>{
23+
'dsn': options.dsn,
24+
'debug': options.debug,
25+
'environment': options.environment,
26+
'release': options.release,
27+
'enableAutoSessionTracking': options.enableAutoSessionTracking,
28+
'enableNativeCrashHandling': options.enableNativeCrashHandling,
29+
'attachStacktrace': options.attachStacktrace,
30+
'attachThreads': options.attachThreads,
31+
'autoSessionTrackingIntervalMillis':
32+
options.autoSessionTrackingInterval.inMilliseconds,
33+
'dist': options.dist,
34+
'integrations': options.sdk.integrations,
35+
'packages':
36+
options.sdk.packages.map((e) => e.toJson()).toList(growable: false),
37+
'diagnosticLevel': options.diagnosticLevel.name,
38+
'maxBreadcrumbs': options.maxBreadcrumbs,
39+
'anrEnabled': options.anrEnabled,
40+
'anrTimeoutIntervalMillis': options.anrTimeoutInterval.inMilliseconds,
41+
'enableAutoNativeBreadcrumbs': options.enableAutoNativeBreadcrumbs,
42+
'maxCacheItems': options.maxCacheItems,
43+
'sendDefaultPii': options.sendDefaultPii,
44+
'enableWatchdogTerminationTracking':
45+
options.enableWatchdogTerminationTracking,
46+
'enableNdkScopeSync': options.enableNdkScopeSync,
47+
'enableAutoPerformanceTracing': options.enableAutoPerformanceTracing,
48+
'sendClientReports': options.sendClientReports,
49+
'proguardUuid': options.proguardUuid,
50+
'maxAttachmentSize': options.maxAttachmentSize,
51+
'recordHttpBreadcrumbs': options.recordHttpBreadcrumbs,
52+
'captureFailedRequests': options.captureFailedRequests,
53+
'enableAppHangTracking': options.enableAppHangTracking,
54+
'connectionTimeoutMillis': options.connectionTimeout.inMilliseconds,
55+
'readTimeoutMillis': options.readTimeout.inMilliseconds,
56+
'appHangTimeoutIntervalMillis':
57+
options.appHangTimeoutInterval.inMilliseconds,
58+
});
59+
60+
@override
61+
Future<void> close() async => _channel.invokeMethod('closeNativeSdk');
62+
2063
@override
2164
Future<NativeAppStart?> fetchNativeAppStart() async {
2265
final json =

flutter/lib/src/sentry_flutter.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ mixin SentryFlutter {
158158
// The ordering here matters, as we'd like to first start the native integration.
159159
// That allow us to send events to the network and then the Flutter integrations.
160160
// Flutter Web doesn't need that, only Android and iOS.
161-
if (platformChecker.hasNativeIntegration) {
162-
integrations.add(NativeSdkIntegration(channel));
161+
if (_native != null) {
162+
integrations.add(NativeSdkIntegration(_native!));
163163
}
164164

165165
// Will enrich events with device context, native packages and integrations

0 commit comments

Comments
 (0)