Skip to content

Commit f522114

Browse files
konraddysputmelekr
andauthored
Release 3.7.7 (#99)
* Handle invalid server URL (#95) * Handle invalid server URL * Use Assert null * Enable metrics before the native database integration (#96) * Handle invalid Crashpad handler path (#97) * Hanle invalid Crashpad handler path * Use helper instead of File + fix typo * Add last breadcrumb id to native report attributes (#98) * Changelog update * Update PermissionHelper.java Replace ContextCompat with Context when checking for self permissions Return granted when checking for self permissions in Android versions prior to Android 6.0 * Update DeviceAttributesHelper.java Replace deprecated BluetoothAdapter with BluetoothManager * Update AndroidManifest.xml Add missing ACCESS_WIFI_STATE and BLUETOOTH permissions to example app AndroidManifest * Update AndroidManifest.xml Add missing ACCESS_WIFI_STATE permission to Tests AndroidManifest * Replace androidx NonNull with jetbrains NotNull annotation * Remove not used dependencies from tests * Update CHANGELOG.md * Use unhandled exception type when unhandled exception occurs * Changelog updates --------- Co-authored-by: harissauce <melek.ramki@saucelabs.com> Co-authored-by: Melek Ramki <127785723+melekr@users.noreply.github.com>
1 parent b4a4f97 commit f522114

File tree

17 files changed

+218
-45
lines changed

17 files changed

+218
-45
lines changed

CHANGELOG.md

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
# Backtrace Android Release Notes
22

3+
## Version 3.7.7
4+
5+
- Added a new attribute to native reports - `breadcrumbs.lastId`
6+
- Fixed invalid `BacktraceCredentials` behavior when the user passed an invalid Backtrace URL
7+
- Capture invalid native crash reporting handler path in the initialize method
8+
- Replaced androidx's ContextCompat with Context when checking for self permissions and handled permissions for versions prior to Android 6.0
9+
- Replaced deprecated BluetoothAdapter with BluetoothManager
10+
- Added missing ACCESS_WIFI_STATE and BLUETOOTH permissions to example app and Tests
11+
- Replaced androidx NonNull with jetbrains NotNull annotation
12+
- Use "Unhandled Exception" error type in the unhnadled exception handler callback
13+
314
## Version 3.7.6
15+
416
- Maintenance: Update various components to latest versions
517
- Maintenance: Update gradle
618
- Bugfix: Fix enabling breadcrumbs when not available
719
- Add breadcrumb when ANR is detected
820

921
## Version 3.7.5
22+
1023
- Maintenance: Update various components to latest versions
1124
- Bugfix: Managed and native reports generated by the same user now have the same `guid`
1225
- Backtrace metrics support - now the interface doesn't require to use `BacktraceCredentials` anymore
@@ -15,27 +28,33 @@
1528
- Bugfix: Handle corrupt or empty database records
1629

1730
## Version 3.7.4
31+
1832
- Feature: migrated to AndroidX
1933
- Improvement: removed READ_EXTERNAL_STORAGE permission from library AndroidManifest.xml
2034

2135
## Version 3.7.3
36+
2237
- Bug: Crashpad attachment syntax changed
2338

2439
## Version 3.7.2
40+
2541
- Bug: Fix issue rolling over Breadcrumb file
2642
- Feature: update gradle to latest
2743
- Feature: integrate crashpad via cmake
2844
- Improvement: Make local.properties optional
2945
- Improvement: Cleanup build scripts for speed
3046

3147
## Version 3.7.1 - 14.06.2022
48+
3249
- Error type "crash" only on unhandled exceptions from main thread for other threads - error type will be "unhandled exception"
3350

3451
## Version 3.7.0 - 28.04.2022
52+
3553
- Added error.type attribute that shows type of the report
3654
- Added backtrace.version attribute that shows Backtrace agent version
3755

3856
## Version 3.6.0 - 29.1.2022
57+
3958
- Added error-free metrics
4059
- Added method to disable native crash reporting
4160
- Fixed Crashpad initialization failure in Samsung A20
@@ -44,57 +63,69 @@
4463
- GitHub actions CICD support
4564

4665
## Version 3.5.0 - 14.09.2021
66+
4767
- Added support for native crash reporting in NDK 16b
4868
- Bug fixes and expanded supported NDK versions for client side unwinding
4969

5070
## Version 3.4.0 - 07.09.2021
71+
5172
- Added support for NDK 22
5273

5374
## Version 3.3.0 - 15.07.2021
75+
5476
- Added support for client side unwinding of native crashes
5577

5678
## Version 3.2.2 - 10.03.2021
79+
5780
- Hotfix for crash when user enables native integration without file attachments
5881

5982
## Version 3.2.1 - 09.03.2021
83+
6084
- Native crashes now support custom attributes
6185
- Improved file attachment support for managed and native crashes
6286
- Fixed file attachments bug in BacktraceDatabaseRecord
6387

6488
## Version 3.2.0 - 02.03.2021
89+
6590
- Added Breadcrumbs feature to give Backtrace users context leading up to a `BacktraceReport`
6691
- Improved support for Proguard
6792

6893
## Version 3.1.0 - 29.09.2020
94+
6995
- Backtrace Android allows to capture native crashes from Android NDK code. To enable NDK crashes exception handler use `setupNativeIntegration` method and pass backtraceClient with credentials.
7096

7197
```java
7298
database.setupNativeIntegration(backtraceClient, credentials);
7399
```
74100

75101
## Version 3.0.2 - 23.01.2020
102+
76103
- Fixed checking internal path during filtering attachments
77104

78105
## Version 3.0.1 - 15.01.2020
106+
79107
- Fixed setting custom global attributes on BacktraceClient
80108
- Added support for custom attributes to BacktraceExceptionHandler
81109

82110
## Version 3.0.0 - 03.12.2019
111+
83112
- Added support for `submit.backtrace.io` urls
84113
- Moved generating a server url from BacktraceApi to BacktraceCredentials
85114
- Refactored name of below libraries interfaces:
86-
* IBacktraceApi -> Api
87-
* IBacktraceClient -> Client
88-
* IBacktraceDatabase -> Database
89-
* IBacktraceDatabaseRecordWriter -> DatabaseRecordWriter
90-
* IBacktraceDatabaseFileContext -> DatabaseFileContext
91-
* IBacktraceDatabaseContext -> DatabaseContext
115+
- IBacktraceApi -> Api
116+
- IBacktraceClient -> Client
117+
- IBacktraceDatabase -> Database
118+
- IBacktraceDatabaseRecordWriter -> DatabaseRecordWriter
119+
- IBacktraceDatabaseFileContext -> DatabaseFileContext
120+
- IBacktraceDatabaseContext -> DatabaseContext
92121

93122
## Version 2.1.0 - 16.06.2019
123+
94124
- Added support for detecting ANR (Application Not Responding)
95125
- Added methods and structures to detecting blocked custom threads
96126

97127
## Version 2.0.0 - 06.05.2019
128+
98129
- Removed `sendAsync` method
99130
- Removed event `OnAfterSendEventListener`
100131
- Moved event `OnServerResponseEventListener` to parameter of `send` method
@@ -103,20 +134,25 @@ database.setupNativeIntegration(backtraceClient, credentials);
103134
- Removed deprecated and unused code
104135

105136
## Version 1.2.1 - 12.04.2019
137+
106138
- Added check is temperature file is empty and remove print stacktrace
107139
- Changed attribute name `app.version_name` to `version`
108140

109141
## Version 1.2.0 - 07.04.2019
142+
110143
- `BacktraceDatabase` - offline error report storage and auto re-submission support in the event of network outage and server unavailability,
111144

112145
## Version 1.1.2 - 07.03.2019
146+
113147
- Added class name to function name in exception StackFrame
114148
- Added exception message to annotations
115149

116150
## Version 1.1.1 - 26.02.2019
151+
117152
- Fixed exception on filter out Backtrace files from StackTraceElements when file name is null
118153

119154
## Version 1.1.0 - 25.02.2019
155+
120156
- Added support for file attachments and annotations
121157
- Added battery level and status attributes
122158
- Added screen brightness attribute
@@ -127,4 +163,5 @@ database.setupNativeIntegration(backtraceClient, credentials);
127163
- Replaced spaces with underscore in all enums strings
128164

129165
## Version 1.0 - 27.01.2019
166+
130167
- First release.

backtrace-library/src/androidTest/java/backtraceio/library/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
package="backtraceio.library">
33
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
44
<uses-permission android:name="android.permission.INTERNET"/>
5+
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
56
<application/>
67
</manifest>

backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientBreadcrumbsTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static org.junit.Assert.assertNull;
88

99
import android.content.Context;
10+
1011
import androidx.test.platform.app.InstrumentationRegistry;
1112
import androidx.test.ext.junit.runners.AndroidJUnit4;
1213

@@ -30,6 +31,7 @@
3031
import backtraceio.library.breadcrumbs.BacktraceBreadcrumbs;
3132
import backtraceio.library.events.OnServerResponseEventListener;
3233
import backtraceio.library.events.RequestHandler;
34+
import backtraceio.library.interfaces.Breadcrumbs;
3335
import backtraceio.library.models.BacktraceData;
3436
import backtraceio.library.models.BacktraceResult;
3537
import backtraceio.library.models.types.BacktraceResultStatus;
@@ -308,6 +310,19 @@ public void onEvent(BacktraceResult backtraceResult) {
308310
}
309311
}
310312

313+
@Test
314+
public void verifyBreadcrumbCallbackInvocation() {
315+
backtraceClient.enableBreadcrumbs(context);
316+
Breadcrumbs breadcrumbs = backtraceClient.database.getBreadcrumbs();
317+
318+
breadcrumbs.setOnSuccessfulBreadcrumbAddEventListener(breadcrumbId -> {
319+
assertEquals(breadcrumbs.getCurrentBreadcrumbId(), breadcrumbId);
320+
return;
321+
});
322+
323+
breadcrumbs.addBreadcrumb("test");
324+
}
325+
311326
public List<String> readBreadcrumbLogFile() throws IOException {
312327
BacktraceBreadcrumbs breadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath());
313328
File breadcrumbLogFile = new File(breadcrumbs.getBreadcrumbLogPath());

backtrace-library/src/androidTest/java/backtraceio/library/BacktraceCredentialsTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package backtraceio.library;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNull;
45

56
import android.net.Uri;
7+
68
import androidx.test.ext.junit.runners.AndroidJUnit4;
79

810
import org.junit.Test;
@@ -76,4 +78,16 @@ public void createBacktraceCredentialsWithLegacyUriAndGetSubmissionToken() {
7678
BacktraceCredentials backtraceCredentials = new BacktraceCredentials(Uri.parse(legacyUrl));
7779
assertEquals(fakeToken, backtraceCredentials.getSubmissionToken());
7880
}
81+
82+
@Test
83+
public void generateEmptyTokenForInvalidSubmissionUrl() {
84+
BacktraceCredentials backtraceCredentials = new BacktraceCredentials("https://submit.backtrace.io/");
85+
assertNull(backtraceCredentials.getSubmissionToken());
86+
}
87+
88+
@Test
89+
public void generateEmptyTokenForInvalidLegacyUrl() {
90+
BacktraceCredentials backtraceCredentials = new BacktraceCredentials("https://universe.sp.backtrace.io/");
91+
assertNull(backtraceCredentials.getSubmissionToken());
92+
}
7993
}

backtrace-library/src/main/java/backtraceio/library/BacktraceCredentials.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,19 @@ public String getSubmissionToken() {
118118
final int tokenLength = 64;
119119
final String tokenQueryParam = "token=";
120120
String submissionUrl = getSubmissionUrl().toString();
121+
final int tokenEndIndex = submissionUrl.lastIndexOf("/");
121122
if (submissionUrl.contains("submit.backtrace.io")) {
122-
return submissionUrl.substring(submissionUrl.lastIndexOf("/") - tokenLength, submissionUrl.lastIndexOf("/"));
123+
if (tokenEndIndex - tokenLength < 0) {
124+
return null;
125+
}
126+
return submissionUrl.substring(tokenEndIndex - tokenLength, tokenEndIndex);
127+
}
128+
final int tokenQueryParamStartIndex = submissionUrl.indexOf(tokenQueryParam);
129+
if (tokenQueryParamStartIndex == -1) {
130+
return null;
123131
}
124-
final int tokenQueryParamStartIndex = submissionUrl.indexOf(tokenQueryParam) + tokenQueryParam.length();
125-
return submissionUrl.substring(tokenQueryParamStartIndex, tokenQueryParamStartIndex + tokenLength);
132+
133+
final int tokenParamStartIndex = tokenQueryParamStartIndex + tokenQueryParam.length();
134+
return submissionUrl.substring(tokenParamStartIndex, tokenParamStartIndex + tokenLength);
126135
}
127136
}

backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,11 @@ public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials
177177
}
178178
// Path to Crashpad native handler
179179
String handlerPath = _applicationContext.getApplicationInfo().nativeLibraryDir + _crashpadHandlerName;
180+
if (!FileHelper.isFileExists(handlerPath)) {
181+
return false;
182+
}
180183

181-
// setup default native attribtues
184+
// setup default native attributes
182185
BacktraceAttributes crashpadAttributes = new BacktraceAttributes(_applicationContext, client.attributes);
183186
crashpadAttributes.attributes.put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.CrashAttributeType);
184187
String[] keys = crashpadAttributes.attributes.keySet().toArray(new String[0]);
@@ -210,6 +213,12 @@ public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials
210213
enableClientSideUnwinding,
211214
unwindingMode
212215
);
216+
217+
if (initialized && this.breadcrumbs.isEnabled()) {
218+
this.breadcrumbs.setOnSuccessfulBreadcrumbAddEventListener(breadcrumbId -> {
219+
this.addAttribute("breadcrumbs.lastId", Long.toString((breadcrumbId)));
220+
});
221+
}
213222
return initialized;
214223
}
215224

backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,15 +567,16 @@ private OnServerResponseEventListener getDatabaseCallback(final BacktraceDatabas
567567
return new OnServerResponseEventListener() {
568568
@Override
569569
public void onEvent(BacktraceResult backtraceResult) {
570-
if (customCallback != null) {
571-
customCallback.onEvent(backtraceResult);
572-
}
573570
if (record != null) {
574571
record.close();
575572
}
576573
if (backtraceResult != null && backtraceResult.status == BacktraceResultStatus.Ok) {
577574
database.delete(record);
578575
}
576+
577+
if (customCallback != null) {
578+
customCallback.onEvent(backtraceResult);
579+
}
579580
}
580581
};
581582
}

backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbs.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import backtraceio.library.enums.BacktraceBreadcrumbLevel;
1111
import backtraceio.library.enums.BacktraceBreadcrumbType;
12+
import backtraceio.library.events.OnSuccessfulBreadcrumbAddEventListener;
1213
import backtraceio.library.interfaces.Breadcrumbs;
1314
import backtraceio.library.logger.BacktraceLogger;
1415
import backtraceio.library.models.json.BacktraceReport;
@@ -17,6 +18,11 @@ public class BacktraceBreadcrumbs implements Breadcrumbs {
1718

1819
private static final transient String LOG_TAG = BacktraceBreadcrumbs.class.getSimpleName();
1920

21+
/**
22+
* Event which will be executed after storing successfully breadcurmbs
23+
*/
24+
private OnSuccessfulBreadcrumbAddEventListener onSuccessfulBreadcrumbAddEventListener = null;
25+
2026
/**
2127
* Which breadcrumb types are enabled?
2228
*/
@@ -54,6 +60,15 @@ public BacktraceBreadcrumbs(String breadcrumbLogDirectory) {
5460
this.breadcrumbLogDirectory = breadcrumbLogDirectory;
5561
}
5662

63+
/**
64+
* Set event executed after adding a breadcrumb to the file
65+
*
66+
* @param eventListener object with method which will be executed
67+
*/
68+
public void setOnSuccessfulBreadcrumbAddEventListener(OnSuccessfulBreadcrumbAddEventListener eventListener) {
69+
this.onSuccessfulBreadcrumbAddEventListener = eventListener;
70+
}
71+
5772
private void unregisterAutomaticBreadcrumbReceivers() {
5873
// Unregister old receivers
5974
if (backtraceBroadcastReceiver != null) {
@@ -272,10 +287,15 @@ public boolean addBreadcrumb(String message, Map<String, Object> attributes, Bac
272287
*/
273288
@Override
274289
public boolean addBreadcrumb(String message, Map<String, Object> attributes, BacktraceBreadcrumbType type, BacktraceBreadcrumbLevel level) {
275-
if (this.isBreadcrumbsEnabled() && backtraceBreadcrumbsLogManager != null) {
276-
return backtraceBreadcrumbsLogManager.addBreadcrumb(message, attributes, type, level);
290+
if (!this.isEnabled() || backtraceBreadcrumbsLogManager == null) {
291+
return false;
292+
}
293+
boolean addResult = backtraceBreadcrumbsLogManager.addBreadcrumb(message, attributes, type, level);
294+
if (addResult && this.onSuccessfulBreadcrumbAddEventListener != null) {
295+
this.onSuccessfulBreadcrumbAddEventListener.onSuccessfulAdd(this.getCurrentBreadcrumbId());
277296
}
278-
return false;
297+
298+
return addResult;
279299
}
280300

281301
/**
@@ -285,7 +305,7 @@ public boolean addBreadcrumb(String message, Map<String, Object> attributes, Bac
285305
*/
286306
@Override
287307
public void processReportBreadcrumbs(BacktraceReport backtraceReport) {
288-
if (!this.isBreadcrumbsEnabled()) {
308+
if (!this.isEnabled()) {
289309
return;
290310
}
291311

@@ -325,7 +345,11 @@ private boolean addConfigurationBreadcrumb() {
325345
BacktraceBreadcrumbLevel.INFO);
326346
}
327347

328-
private boolean isBreadcrumbsEnabled() {
348+
/**
349+
* Determinate if Breadcrumbs are enabled.
350+
* @return true if breadcrumbs are enabled.
351+
*/
352+
public boolean isEnabled() {
329353
return enabledBreadcrumbTypes != null && !enabledBreadcrumbTypes.isEmpty();
330354
}
331355

0 commit comments

Comments
 (0)