From 1b8cdb9b7b1506280a5dbb5a54fb108d110556c5 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Sat, 4 Jul 2020 23:51:34 +0200 Subject: [PATCH] Send logs and keys are they are set --- packages/firebase_crashlytics/CHANGELOG.md | 1 + .../FirebaseCrashlyticsPlugin.java | 21 +++---- .../Classes/FirebaseCrashlyticsPlugin.m | 21 +++---- .../lib/src/firebase_crashlytics.dart | 62 ++++++++----------- 4 files changed, 46 insertions(+), 59 deletions(-) diff --git a/packages/firebase_crashlytics/CHANGELOG.md b/packages/firebase_crashlytics/CHANGELOG.md index fdc7cff20fcc..718a52735171 100644 --- a/packages/firebase_crashlytics/CHANGELOG.md +++ b/packages/firebase_crashlytics/CHANGELOG.md @@ -9,6 +9,7 @@ * `getVersion` * `isDebuggable` * **Breaking change**: the methods `setInt`, `setDouble`, `setString` and `setBool` have been replaced by `setCustomKey`. +* Logs and keys are sent to Crashlytics as they're set. * Fixes a bug that prevented keys from being set on iOS devices. ## 0.1.4+1 diff --git a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java index a3496e0796c2..3bc4fa763aa1 100644 --- a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java +++ b/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FirebaseCrashlyticsPlugin.java @@ -53,18 +53,6 @@ public static void registerWith(Registrar registrar) { public void onMethodCall(MethodCall call, Result result) { final FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance(); if (call.method.equals("Crashlytics#onError")) { - // Add logs. - final List logs = call.argument("logs"); - for (String l : logs) { - crashlytics.log(l); - } - - // Set keys. - final Map keys = call.argument("keys"); - for (String key : keys.keySet()) { - crashlytics.setCustomKey(key, (String) keys.get(key)); - } - // Report crash. final String dartExceptionMessage = (String) call.argument("exception"); final Exception exception = new Exception(dartExceptionMessage); @@ -93,6 +81,15 @@ public void onMethodCall(MethodCall call, Result result) { } else if (call.method.equals("Crashlytics#setUserIdentifier")) { crashlytics.setUserId((String) call.argument("identifier")); result.success(null); + } else if (call.method.equals("Crashlytics#setKey")) { + final String key = (String) call.argument("key"); + final String value = (String) call.argument("value"); + crashlytics.setCustomKey(key, value); + result.success(null); + } else if (call.method.equals("Crashlytics#log")) { + final String msg = (String) call.argument("log"); + crashlytics.log(msg); + result.success(null); } else { result.notImplemented(); } diff --git a/packages/firebase_crashlytics/darwin/Classes/FirebaseCrashlyticsPlugin.m b/packages/firebase_crashlytics/darwin/Classes/FirebaseCrashlyticsPlugin.m index 888b0308fbfa..0fb2b6ede8c0 100644 --- a/packages/firebase_crashlytics/darwin/Classes/FirebaseCrashlyticsPlugin.m +++ b/packages/firebase_crashlytics/darwin/Classes/FirebaseCrashlyticsPlugin.m @@ -36,18 +36,6 @@ - (instancetype)init { - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { if ([@"Crashlytics#onError" isEqualToString:call.method]) { - // Add logs. - NSArray *logs = call.arguments[@"logs"]; - for (NSString *log in logs) { - [[FIRCrashlytics crashlytics] logWithFormat:@"%@", log]; - } - - // Set keys. - NSDictionary *keys = call.arguments[@"keys"]; - for (NSString *key in keys) { - [[FIRCrashlytics crashlytics] setCustomValue:keys[key] forKey:key]; - } - // Add additional information from the Flutter framework to the exception reported in // Crashlytics. NSString *information = call.arguments[@"information"]; @@ -78,6 +66,15 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } else if ([@"Crashlytics#setUserIdentifier" isEqualToString:call.method]) { [[FIRCrashlytics crashlytics] setUserID:call.arguments[@"identifier"]]; result(nil); + } else if ([@"Crashlytics#setKey" isEqualToString:call.method]) { + NSString *key = call.arguments[@"key"]; + NSString *value = call.arguments[@"value"]; + [[FIRCrashlytics crashlytics] setCustomValue:value forKey:key]; + result(nil); + } else if ([@"Crashlytics#log" isEqualToString:call.method]) { + NSString *msg = call.arguments[@"log"]; + [[FIRCrashlytics crashlytics] logWithFormat:@"%@", msg]; + result(nil); } else { result(FlutterMethodNotImplemented); } diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index 173416fce9f1..b5873e8c246e 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -13,12 +13,7 @@ class Crashlytics { /// default this is false. var enableInDevMode = false; - /// Keys to be included with report. - final _keys = {}; - - /// Logs to be included with report. - final _logs = ListQueue(15); - var _logSize = 0; + bool get _shouldReport => !kDebugMode || enableInDevMode; @visibleForTesting static const MethodChannel channel = @@ -43,10 +38,12 @@ class Crashlytics { /// Submits a report of a non-fatal error. /// /// For errors generated by the Flutter framework, use [recordFlutterError] instead. - Future recordError(dynamic exception, StackTrace stack, - {dynamic context}) async { + Future recordError( + dynamic exception, + StackTrace stack, { + dynamic context, + }) async { print('Error caught by Crashlytics plugin :'); - _recordError(exception, stack, context: context); } @@ -54,30 +51,31 @@ class Crashlytics { throw StateError('Error thrown by Crashlytics plugin'); } - /// Add text logging that will be sent with your next report. `msg` will be - /// printed to the console when in debug mode. Each report has a rolling max - /// of 64k of logs, older logs are removed to allow newer logs to fit within - /// the limit. - void log(String msg) { - _logSize += Uint8List.fromList(msg.codeUnits).length; - _logs.add(msg); - // Remove oldest log till logSize is no more than 64K. - while (_logSize > 65536) { - final String first = _logs.removeFirst(); - _logSize -= Uint8List.fromList(first.codeUnits).length; - } + /// Add text logging that will be sent to Crashlytics. + Future log(String msg) async { + if (!_shouldReport) return; + ArgumentError.checkNotNull(msg, 'msg'); + return channel.invokeMethod( + 'Crashlytics#log', + {'log': msg}, + ); } /// Sets a [value] to be associated with a given [key] for your crash data. /// /// The [value] will be converted to a string by calling [toString] on it. /// An error will be thrown if it is null. - void setCustomKey(String key, dynamic value) { + Future setCustomKey(String key, dynamic value) async { + if (!_shouldReport) return; + ArgumentError.checkNotNull(key, 'key'); ArgumentError.checkNotNull(value, 'value'); - // Check that only 64 keys are set. - if (_keys.containsKey(key) || _keys.length <= 64) { - _keys[key] = value.toString(); - } + return channel.invokeMethod( + 'Crashlytics#setKey', + { + 'key': key, + 'value': value.toString(), + }, + ); } /// Specify a user identifier which will be visible in the Crashlytics UI. @@ -142,12 +140,7 @@ class Crashlytics { Iterable information, bool printDetails, }) async { - bool inDebugMode = false; - if (!enableInDevMode) { - assert(inDebugMode = true); - } - - printDetails ??= inDebugMode; + printDetails ??= kDebugMode; final String _information = (information == null || information.isEmpty) ? '' @@ -168,7 +161,8 @@ class Crashlytics { // that Flutter developers are used to seeing. if (stack != null) print('\n$stack'); } - if (!inDebugMode || enableInDevMode) { + + if (_shouldReport) { // The stack trace can be null. To avoid the following exception: // Invalid argument(s): Cannot create a Trace from null. // We can check for null and provide an empty stack trace. @@ -190,8 +184,6 @@ class Crashlytics { 'context': '$context', 'information': _information, 'stackTraceElements': stackTraceElements, - 'logs': _logs.toList(), - 'keys': _keys, }); // Print result.