diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8615dd52b..88303fb62 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -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" diff --git a/backtrace-library/src/main/cpp/backends/crashpad-backend.cpp b/backtrace-library/src/main/cpp/backends/crashpad-backend.cpp index 99b7ef256..11c4e3c3c 100644 --- a/backtrace-library/src/main/cpp/backends/crashpad-backend.cpp +++ b/backtrace-library/src/main/cpp/backends/crashpad-backend.cpp @@ -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 #include @@ -12,6 +13,51 @@ extern std::atomic_bool disabled; static crashpad::CrashpadClient *client; static std::unique_ptr database; +// offline native uploads +static std::unique_ptr 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( + 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 generateInitializationArguments(JNIEnv *env, jobjectArray attachmentPaths) { std::vector arguments; @@ -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(); @@ -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(); @@ -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() { @@ -358,5 +417,10 @@ void ReEnableCrashpad() { } database->GetSettings()->SetUploadsEnabled(true); disabled = false; + + // Restart upload thread + if (!server_url.empty()) { + StartCrashpadUploadThreadIfNeeded(); + } } }