Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,10 @@ jobs:
# newest Android version
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --emulator name="Android GoogleApi Emulator,platformVersion=15.0" --region us-west-1
# oldest Android version
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --emulator name="Android GoogleApi Emulator,platformVersion=8.0" --region us-west-1
# Disabled
# // Todo : BT-6267
# https://github.com/backtrace-labs/backtrace-android/pull/192
# saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --emulator name="Android GoogleApi Emulator,platformVersion=8.0" --region us-west-1
# oldest real device (aiming for armv7 / 32bit)
saucectl run espresso -c "" --name "From Github Actions" --app example-app-debug.apk --testApp ${{ matrix.test-apk }} --device name=".*,platformVersion=9" --region us-west-1
# --device name=".*,platformVersion=6.0.1"
Expand Down
64 changes: 64 additions & 0 deletions backtrace-library/src/main/cpp/backends/crashpad-backend.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "crashpad-backend.h"
#include "handler/handler_main.h"
#include "handler/crash_report_upload_thread.h"
#include "backtrace-native.h"
#include <jni.h>
#include <libgen.h>
Expand All @@ -12,6 +13,51 @@ extern std::atomic_bool disabled;
static crashpad::CrashpadClient *client;
static std::unique_ptr<crashpad::CrashReportDatabase> database;

// offline native uploads
static std::unique_ptr<crashpad::CrashReportUploadThread> upload_thread;
static std::string server_url;

namespace {

void StartCrashpadUploadThreadIfNeeded() {
// Return if No DB or if the SDK is disabled
if (!database || disabled) {
return;
}

if (server_url.empty()) {
__android_log_print(
ANDROID_LOG_WARN,
"Backtrace-Android",
"Crashpad upload thread not started: server URL is empty");
return;
}

if (upload_thread && upload_thread->is_running()) {
return;
}

crashpad::CrashReportUploadThread::Options options{};
// Scan the DB for pending reports
options.watch_pending_reports = true;

crashpad::CrashReportUploadThread::ProcessPendingReportsObservationCallback callback;
upload_thread = std::make_unique<crashpad::CrashReportUploadThread>(
database.get(),
server_url,
options,
callback);

upload_thread->Start();

__android_log_print(
ANDROID_LOG_INFO,
"Backtrace-Android",
"Started Crashpad upload thread for offline native reports");
}

} // namespace

std::vector<std::string>
generateInitializationArguments(JNIEnv *env, jobjectArray attachmentPaths) {
std::vector<std::string> arguments;
Expand Down Expand Up @@ -141,6 +187,10 @@ bool InitializeCrashpad(jstring url,
// Enable automated uploads.
database->GetSettings()->SetUploadsEnabled(true);

// Process pending reports
server_url.assign(backtraceUrl);
StartCrashpadUploadThreadIfNeeded();

// Start crash handler
client = new crashpad::CrashpadClient();

Expand Down Expand Up @@ -210,6 +260,9 @@ bool InitializeCrashpadJavaCrashHandler(jstring url,
// Enable automated uploads.
database->GetSettings()->SetUploadsEnabled(true);

server_url.assign(backtraceUrl);
StartCrashpadUploadThreadIfNeeded();

// Start crash handler
client = new crashpad::CrashpadClient();

Expand Down Expand Up @@ -346,6 +399,12 @@ void DisableCrashpad() {
// Disable automated uploads.
database->GetSettings()->SetUploadsEnabled(false);
disabled = true;

// Stop background upload thread
if (upload_thread && upload_thread->is_running()) {
upload_thread->Stop();
upload_thread.reset();
}
}

void ReEnableCrashpad() {
Expand All @@ -358,5 +417,10 @@ void ReEnableCrashpad() {
}
database->GetSettings()->SetUploadsEnabled(true);
disabled = false;

// Restart upload thread
if (!server_url.empty()) {
StartCrashpadUploadThreadIfNeeded();
}
}
}
Loading