Skip to content

Commit 6cc6f30

Browse files
rick-btVincent LussenburgBartoszLitwiniukkonraddysputKrzaQ
authored
Update for 3.7.5 (#83)
* Update for 3.7.5 * Update android gradle plugin, targetSdkVersion , compileSdkVersion * Revert sdk update * updated to latest crashpad rev * Unique event name override (#84) * Unique event name - allow to override default event name * Revert "Unique event name - allow to override default event name" This reverts commit 6f67d1f. * Unique event name - allow to override default event name * Code review adjustements * Unique event override unit test * Backtrace credentials formatting * Documentation * Removed unnecessary import * Use OpenSSL for crash uploads. * Bump android sdk level * Use the same guid in crashpad & backtrace-android * Version 3.7.5: Changelog update --------- Co-authored-by: Bartosz Litwiniuk <> Co-authored-by: Vincent Lussenburg <vincentlussenburg@Vincents-MacBook-Pro-2.local> Co-authored-by: Bartosz Litwiniuk <bartosz.litwiniuk@outlook.com> Co-authored-by: Konrad Dysput <konrad.dysput@gmail.com> Co-authored-by: KrzaQ <krzaq@krzaq.cc>
1 parent d638e25 commit 6cc6f30

File tree

19 files changed

+169
-48
lines changed

19 files changed

+169
-48
lines changed

.github/workflows/test.yml

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ name: Run Tests
22

33
on:
44
push:
5-
branches: [ master ]
5+
branches: [master]
66
pull_request:
77
schedule:
8-
- cron: '0 0 * * *'
8+
- cron: "0 0 * * *"
99

1010
jobs:
1111
build:
@@ -24,7 +24,7 @@ jobs:
2424
uses: actions/setup-java@v3
2525
with:
2626
java-version: 11.0.10
27-
distribution: 'adopt'
27+
distribution: "adopt"
2828
cache: gradle
2929

3030
- name: Write to local.properties
@@ -33,7 +33,7 @@ jobs:
3333
3434
- name: Build and check
3535
run: ./gradlew assembleDebug assembleDebugAndroidTest build check
36-
36+
3737
- name: Upload symbols.zip
3838
uses: actions/upload-artifact@v3
3939
with:
@@ -71,7 +71,11 @@ jobs:
7171
strategy:
7272
fail-fast: false
7373
matrix:
74-
test-apk: [example-app-debug-androidTest.apk, backtrace-library-debug-androidTest.apk]
74+
test-apk:
75+
[
76+
example-app-debug-androidTest.apk,
77+
backtrace-library-debug-androidTest.apk,
78+
]
7579

7680
steps:
7781
- name: Download APK
@@ -95,12 +99,12 @@ jobs:
9599
- name: Run Saucectl
96100
run: |
97101
saucectl configure --username ${{ secrets.SAUCE_USERNAME }} --accessKey ${{ secrets.SAUCE_ACCESS_KEY }}
102+
# recent real device
103+
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --device name="Samsung_Galaxy_S20_FE_5G_backtrace_us"
98104
# newest Android version
99105
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --emulator name="Android GoogleApi Emulator,platformVersion=12.0"
100106
# oldest Android version
101107
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --emulator name="Android GoogleApi Emulator,platformVersion=5.1"
102-
# recent real device
103-
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --device name="Samsung_Galaxy_S20_FE_5G_backtrace_us"
104108
# oldest real device (aiming for armv7 / 32bit)
105109
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --device name=".*,platformVersion=6.0.1"
106110
# --device name=".*,platformVersion=6.0.1"
@@ -121,14 +125,14 @@ jobs:
121125
# exit 1
122126
# fi
123127

124-
# runs-on: macos-latest # necessary for reactivecircus/android-emulator-runner@v2
125-
# - name: Emulator test
126-
# uses: reactivecircus/android-emulator-runner@v2
127-
# with:
128-
# target: google_apis
129-
# api-level: ${{ matrix.api-level }}
130-
# arch: x86_64
131-
# script: ./gradlew connectedCheck
132-
133-
# - name: Code coverage
134-
# run: bash <(curl -s https://codecov.io/bash)
128+
# runs-on: macos-latest # necessary for reactivecircus/android-emulator-runner@v2
129+
# - name: Emulator test
130+
# uses: reactivecircus/android-emulator-runner@v2
131+
# with:
132+
# target: google_apis
133+
# api-level: ${{ matrix.api-level }}
134+
# arch: x86_64
135+
# script: ./gradlew connectedCheck
136+
137+
# - name: Code coverage
138+
# run: bash <(curl -s https://codecov.io/bash)

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,5 @@ hs_err_pid*
8989
obj/
9090
.externalNativeBuild
9191
**/.cxx
92+
93+
backtrace-library/src/main/jniLibs/*/libcrashpad_handler.so

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Backtrace Android Release Notes
22

3+
## Version 3.7.5
4+
- Maintenance: Update various components to latest versions
5+
- Bugfix: Managed and native reports generated by the same user now have the same `guid`
6+
- Backtrace metrics support - now the interface doesn't require to use `BacktraceCredentials` anymore
7+
- Upgraded native crash reporter. The new version should capture crashes generated by the newest version of SDK
8+
- Maintenance: CI job improvements
9+
- Bugfix: Handle corrupt or empty database records
10+
311
## Version 3.7.4
412
- Feature: migrated to AndroidX
513
- Improvement: removed READ_EXTERNAL_STORAGE permission from library AndroidManifest.xml

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ BacktraceExceptionHandler.enable(backtraceClient);
4545
backtraceClient.enableAnr();
4646

4747
// Enable Crash Free metrics
48-
backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials));
48+
backtraceClient.metrics.enable();
4949
```
5050

5151
### Kotlin
@@ -64,7 +64,7 @@ BacktraceExceptionHandler.enable(backtraceClient)
6464
backtraceClient.enableAnr()
6565

6666
// Enable Crash Free metrics
67-
backtraceClient.metrics.enable(BacktraceMetricsSettings(credentials))
67+
backtraceClient.metrics.enable()
6868
```
6969

7070
## Documentation

backtrace-library/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ android {
4848
externalNativeBuild {
4949
cmake {
5050
path file('src/main/cpp/CMakeLists.txt')
51+
version "3.22.1"
5152
}
5253
}
5354
sourceSets {

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static org.junit.Assert.assertTrue;
1010

1111
import android.content.Context;
12+
1213
import androidx.test.platform.app.InstrumentationRegistry;
1314
import androidx.test.ext.junit.runners.AndroidJUnit4;
1415

@@ -340,6 +341,59 @@ public void onEvent(EventsResult result) {
340341
//assertEquals(1, backtraceClient.metrics.getSummedEvents().size());
341342
}
342343

344+
@Test
345+
public void shouldAllowToOverrideUniqueEventName() {
346+
final Waiter waiter = new Waiter();
347+
final String uniqueEventAttributeName = "uniqueEventAttributeName";
348+
final String uniqueEventAttributeValue = "SomeRandomText123123";
349+
350+
MockRequestHandler mockUniqueRequestHandler = new MockRequestHandler();
351+
backtraceClient.metrics.setUniqueEventsRequestHandler(mockUniqueRequestHandler);
352+
MockRequestHandler mockSummedRequestHandler = new MockRequestHandler();
353+
backtraceClient.metrics.setSummedEventsRequestHandler(mockSummedRequestHandler);
354+
backtraceClient.attributes.put(uniqueEventAttributeName, uniqueEventAttributeValue);
355+
356+
backtraceClient.metrics.setUniqueEventsOnServerResponse(new EventsOnServerResponseEventListener() {
357+
@Override
358+
public void onEvent(EventsResult result) {
359+
assertEquals(0, result.getEventsPayload().getDroppedEvents());
360+
String eventsPayloadJsonString = BacktraceSerializeHelper.toJson(result.getEventsPayload());
361+
assertNotEquals(0, eventsPayloadJsonString.length());
362+
363+
JSONObject json;
364+
try {
365+
json = new JSONObject(eventsPayloadJsonString);
366+
JSONObject uniqueEventJson = json.getJSONArray("unique_events").getJSONObject(0);
367+
assertEquals(uniqueEventAttributeName, uniqueEventJson.getJSONArray("unique").get(0));
368+
assertNotNull(uniqueEventJson.getJSONObject("attributes").getString("guid"));
369+
} catch (Exception e) {
370+
fail(e.toString());
371+
}
372+
373+
assertEquals(BacktraceResultStatus.Ok, result.status);
374+
waiter.resume();
375+
}
376+
});
377+
378+
backtraceClient.metrics.setSummedEventsOnServerResponse(new EventsOnServerResponseEventListener() {
379+
@Override
380+
public void onEvent(EventsResult result) {
381+
waiter.resume();
382+
}
383+
});
384+
backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0), uniqueEventAttributeName);
385+
386+
try {
387+
waiter.await(5, TimeUnit.SECONDS, 2);
388+
} catch (Exception e) {
389+
fail(e.toString());
390+
}
391+
392+
assertFalse(mockUniqueRequestHandler.lastEventPayloadJson.isEmpty());
393+
assertEquals(1, mockUniqueRequestHandler.numAttempts);
394+
assertEquals(1, backtraceClient.metrics.getUniqueEvents().size());
395+
}
396+
343397
@Test
344398
public void sendStartupEvent() {
345399
final Waiter waiter = new Waiter();
@@ -391,6 +445,7 @@ public void onEvent(EventsResult result) {
391445

392446
backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0));
393447

448+
394449
try {
395450
waiter.await(5, TimeUnit.SECONDS, 2);
396451
} catch (Exception e) {
@@ -406,6 +461,7 @@ public void onEvent(EventsResult result) {
406461
assertEquals(0, backtraceClient.metrics.getSummedEvents().size());
407462
}
408463

464+
409465
@Test
410466
public void metricsAttributesShouldChangeIfClientAttributeChanges() {
411467
final Waiter waiter = new Waiter();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
public class BacktraceCredentialsTest {
1313

1414
private final String fakeUniverse = "universe";
15-
private final String fakeToken = "aaaaabbbbbccccf82668682e69f59b38e0a853bed941e08e85f4bf5eb2c5458";
15+
private final String fakeToken = "aaaaabbbbbccccf82668682e69f59b38e0a853bed941e08e85f4bf5eb2c54584";
1616
private final String legacyUrl = "https://" + fakeUniverse + ".sp.backtrace.io:6098/post?format=json&token=" + fakeToken;
1717
private final String url = "https://submit.backtrace.io/" + fakeUniverse + "/" + fakeToken + "/json";
1818
private final String urlPrefix = "https://" + fakeUniverse + ".sp.backtrace.io:6098";

backtrace-library/src/androidTest/java/backtraceio/library/metrics/BacktraceMetricsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ public void addAttributesUniqueEvent() {
7676

7777
@Test
7878
public void testDefaultUrl() {
79-
BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<String, Object>(), null);
79+
BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<String, Object>(), null, credentials);
8080
metrics.enable(new BacktraceMetricsSettings(credentials));
8181
TestCase.assertEquals(BacktraceMetrics.defaultBaseUrl, metrics.getBaseUrl());
8282
}
8383

8484
@Test
8585
public void testCustomUrl() {
8686
String customUrl = "https://my.custom.url";
87-
BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<String, Object>(), null);
87+
BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<String, Object>(), null, credentials);
8888
metrics.enable(new BacktraceMetricsSettings(credentials, customUrl));
8989
TestCase.assertEquals(customUrl, metrics.getBaseUrl());
9090
}

backtrace-library/src/main/cpp/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
# Sets the minimum version of CMake required to build the native library.
55

6-
cmake_minimum_required(VERSION 3.4.1)
6+
cmake_minimum_required(VERSION 3.13)
77

88
# Determine native crash backend
99
# ANDROID_NDK_MAJOR not defined until ndk 17+
@@ -28,6 +28,9 @@ else()
2828
set(CLIENT_SIDE_UNWINDING TRUE)
2929
endif()
3030

31+
cmake_policy(SET CMP0077 NEW)
32+
set(ANDROID_SSL_MODE "OPENSSL")
33+
3134
# Sources
3235
list(APPEND SOURCES backtrace-native.cpp)
3336
list(APPEND SOURCES backends/backend.cpp)

backtrace-library/src/main/cpp/backends/crashpad-backend.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ bool InitializeCrashpad(jstring url,
121121
// Start crash handler
122122
client = new crashpad::CrashpadClient();
123123

124+
std::map<std::string, std::string>::iterator guidIterator = attributes.find("guid");
125+
if(guidIterator != attributes.end())
126+
{
127+
client->OverrideGuid(guidIterator->second);
128+
}
129+
124130
initialized = client->StartHandlerAtCrash(handler, db, db, backtraceUrl, attributes,
125131
arguments);
126132

0 commit comments

Comments
 (0)