From 4a3d57f2b95ed028f191821a9d94cef30c3df330 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Tue, 22 Jul 2025 03:09:29 +0300 Subject: [PATCH 1/8] feat: add NDK crash reporting APIs --- .../instabug/flutter/modules/CrashReportingApi.java | 8 ++++++++ lib/src/modules/crash_reporting.dart | 11 +++++++++++ pigeons/crash_reporting.api.dart | 2 ++ 3 files changed, 21 insertions(+) diff --git a/android/src/main/java/com/instabug/flutter/modules/CrashReportingApi.java b/android/src/main/java/com/instabug/flutter/modules/CrashReportingApi.java index 075d0da69..8a1831959 100644 --- a/android/src/main/java/com/instabug/flutter/modules/CrashReportingApi.java +++ b/android/src/main/java/com/instabug/flutter/modules/CrashReportingApi.java @@ -70,4 +70,12 @@ public void sendNonFatalError(@NonNull String jsonCrash, @Nullable Map setNDKEnabled(bool isEnabled) async { + if (Platform.isAndroid) { + return _host.setNDKEnabled(isEnabled); + } + } } diff --git a/pigeons/crash_reporting.api.dart b/pigeons/crash_reporting.api.dart index 45f4a9cdb..4ac788e88 100644 --- a/pigeons/crash_reporting.api.dart +++ b/pigeons/crash_reporting.api.dart @@ -12,4 +12,6 @@ abstract class CrashReportingHostApi { String? fingerprint, String nonFatalExceptionLevel, ); + + void setNDKEnabled(bool isEnabled); } From 9a15a94beb288117aba94f5c474cc438481cedde Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Mon, 28 Jul 2025 12:30:17 +0300 Subject: [PATCH 2/8] chore: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cb867f5c..d6261b180 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Unreleased](https://github.com/Instabug/Instabug-Flutter/compare/v15.0.2...dev) + +### Added + +- Add new APIs to support NDK Crashes. + ## [15.0.2](https://github.com/Instabug/Instabug-Flutter/compare/v14.3.0...15.0.2) (Jul 7, 2025) ### Added From 23e9de25bdcc14e8b6f1eee1c7b9defdeec86263 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Mon, 28 Jul 2025 12:41:35 +0300 Subject: [PATCH 3/8] fix: add iOS stub APIs --- ios/Classes/Modules/CrashReportingApi.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ios/Classes/Modules/CrashReportingApi.m b/ios/Classes/Modules/CrashReportingApi.m index 0103aa766..fd06bb3cb 100644 --- a/ios/Classes/Modules/CrashReportingApi.m +++ b/ios/Classes/Modules/CrashReportingApi.m @@ -46,4 +46,9 @@ - (void)sendNonFatalErrorJsonCrash:(nonnull NSString *)jsonCrash userAttributes: userAttributes:userAttributes]; } + +- (void)setNDKEnabledIsEnabled:(nonnull NSNumber *)isEnabled error:(FlutterError * _Nullable __autoreleasing * _Nonnull)error { +// This is auto-generated with pigeon, there is no NDK crashes for iOS. +} + @end From c77a12733a3a068a86ee23d10b7de009736613d5 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Mon, 28 Jul 2025 12:52:49 +0300 Subject: [PATCH 4/8] chore: update changelog --- CHANGELOG.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6261b180..aba06a601 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,9 @@ ### Added -- Add new APIs to support NDK Crashes. +- Add new APIs to support NDK Crashes. ([#607](https://github.com/Instabug/Instabug-Flutter/pull/607)) -## [15.0.2](https://github.com/Instabug/Instabug-Flutter/compare/v14.3.0...15.0.2) (Jul 7, 2025) +## [15.0.2](https://github.com/Instabug/Instabug-Flutter/compare/v14.3.0...15.0.2) (Jul 7, 2025) ### Added @@ -26,7 +26,6 @@ - Bump Instabug Android SDK to v14.3.1 ([#577](https://github.com/Instabug/Instabug-Flutter/pull/577)). [See release notes](https://github.com/Instabug/Instabug-Android/releases/tag/v14.3.1). - ## [14.3.0](https://github.com/Instabug/Instabug-Flutter/compare/v14.1.0...14.3.0) (April 21, 2025) ### Added From 76f59c5beb546d690a2a74cd250f283352bf2d8d Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Tue, 29 Jul 2025 18:24:51 +0300 Subject: [PATCH 5/8] feat: add native crash simulation functions and CMake support - Introduced CMakeLists.txt for building native libraries. - Added multiple crash simulation functions in crasher.c, crasher_2.c, crasher_3.c, and crasher_4.cpp to handle various signals (SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS, SIGTRAP). - Updated header files to declare new crash functions. - Implemented JNI methods to trigger crashes from Java/Kotlin. This setup enhances the native crash testing capabilities of the application. --- .../android/app/src/main/cpp/CMakeLists.txt | 52 +++++++++++++++++ example/android/app/src/main/cpp/crasher.c | 50 ++++++++++++++++ example/android/app/src/main/cpp/crasher_2.c | 47 +++++++++++++++ example/android/app/src/main/cpp/crasher_2.h | 58 +++++++++++++++++++ example/android/app/src/main/cpp/crasher_3.c | 44 ++++++++++++++ example/android/app/src/main/cpp/crasher_3.h | 24 ++++++++ .../android/app/src/main/cpp/crasher_4.cpp | 57 ++++++++++++++++++ example/android/app/src/main/cpp/crasher_4.h | 24 ++++++++ .../android/app/src/main/cpp/native-lib.cpp | 19 ++++++ 9 files changed, 375 insertions(+) create mode 100644 example/android/app/src/main/cpp/CMakeLists.txt create mode 100644 example/android/app/src/main/cpp/crasher.c create mode 100644 example/android/app/src/main/cpp/crasher_2.c create mode 100644 example/android/app/src/main/cpp/crasher_2.h create mode 100644 example/android/app/src/main/cpp/crasher_3.c create mode 100644 example/android/app/src/main/cpp/crasher_3.h create mode 100644 example/android/app/src/main/cpp/crasher_4.cpp create mode 100644 example/android/app/src/main/cpp/crasher_4.h create mode 100644 example/android/app/src/main/cpp/native-lib.cpp diff --git a/example/android/app/src/main/cpp/CMakeLists.txt b/example/android/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 000000000..93f7d550c --- /dev/null +++ b/example/android/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,52 @@ + +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html. +# For more examples on how to use CMake, see https://github.com/android/ndk-samples. + +# Sets the minimum CMake version required for this project. +cmake_minimum_required(VERSION 3.22.1) + +# Declares the project name. The project name can be accessed via ${ PROJECT_NAME}, +# Since this is the top level CMakeLists.txt, the project name is also accessible +# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level +# build script scope). +project("native-lib") + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. +# +# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define +# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME} +# is preferred for the same purpose. +# +# In order to load a library into your app from Java/Kotlin, you must call +# System.loadLibrary() and pass the name of the library defined here; +# for GameActivity/NativeActivity derived applications, the same library name must be +# used in the AndroidManifest.xml file. +add_library(${CMAKE_PROJECT_NAME} SHARED + # List C/C++ source files with relative paths to this CMakeLists.txt. + native-lib.cpp + crasher.c + crasher_2.c + crasher_3.c + crasher_4.cpp + ) +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log) + + +# Specifies libraries CMake should link to your target library. You +# can link libraries from various origins, such as libraries defined in this +# build script, prebuilt third-party libraries, or Android system libraries. +target_link_libraries(${CMAKE_PROJECT_NAME} + # List libraries link to the target library + android + log + ${log-lib} + ) diff --git a/example/android/app/src/main/cpp/crasher.c b/example/android/app/src/main/cpp/crasher.c new file mode 100644 index 000000000..8ccfc598a --- /dev/null +++ b/example/android/app/src/main/cpp/crasher.c @@ -0,0 +1,50 @@ + +#include +#include +#include +#include +#include "crasher_2.h" + +/************* SIGSEGV *******************************/ +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGSEGVCrash(JNIEnv *env, jobject thiz) { + causeSIGSEGVCrashF1(); +} + +/*****************************************************/ + +/************* SIGABRT *******************************/ +void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGABRTCrash(JNIEnv *env, jobject thiz) { + causeSIGABRTCrashF1(); +} +/****************************************************/ + +/************* SIGFPE *******************************/ +void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGFPECrash(JNIEnv *env, jobject thiz) { + causeSIGFPECrashF1(); +} +/***************************************************/ + +/************* SIGILL *******************************/ + +void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGILLCrash(JNIEnv *env, jobject thiz) { + causeSIGILLCrashF1(); +} +/***************************************************/ + +/************* SIGBUS *******************************/ +void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGBUSCrash(JNIEnv *env, jobject thiz) { + causeSIGBUSCrashF1(); +} +/***************************************************/ + +/************* SIGTRAP *******************************/ +void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGTRAPCrash(JNIEnv *env, jobject thiz) { + causeSIGTRAPCrashF1(); +} +/***************************************************/ diff --git a/example/android/app/src/main/cpp/crasher_2.c b/example/android/app/src/main/cpp/crasher_2.c new file mode 100644 index 000000000..5aac24df8 --- /dev/null +++ b/example/android/app/src/main/cpp/crasher_2.c @@ -0,0 +1,47 @@ + + +#include +#include +#include +#include +#include "crasher_3.h" + +/************* SIGSEGV *******************************/ +void causeSIGSEGVCrashF1() { + causeSIGSEGVCrashF2(); +} +/*****************************************************/ + +/************* SIGABRT *******************************/ +void causeSIGABRTCrashF1() { + causeSIGABRTCrashF2(); +} +/****************************************************/ + +/************* SIGFPE *******************************/ + + +void causeSIGFPECrashF1() { + causeSIGFPECrashF2(); +} +/***************************************************/ + +/************* SIGILL *******************************/ + +void causeSIGILLCrashF1() { + causeSIGILLCrashF2(); +} +/***************************************************/ + +/************* SIGBUS *******************************/ + +void causeSIGBUSCrashF1() { + causeSIGBUSCrashF2(); +} +/***************************************************/ + +/************* SIGTRAP *******************************/ +void causeSIGTRAPCrashF1() { + causeSIGTRAPCrashF2(); +} +/***************************************************/ diff --git a/example/android/app/src/main/cpp/crasher_2.h b/example/android/app/src/main/cpp/crasher_2.h new file mode 100644 index 000000000..d435af057 --- /dev/null +++ b/example/android/app/src/main/cpp/crasher_2.h @@ -0,0 +1,58 @@ + + +/************* SIGSEGV *******************************/ +void causeSIGSEGVCrashF3(); + +void causeSIGSEGVCrashF2(); + +void causeSIGSEGVCrashF1(); + +/*****************************************************/ + +/************* SIGABRT *******************************/ +void causeSIGABRTCrashF3(); + +void causeSIGABRTCrashF2(); + +void causeSIGABRTCrashF1(); + +/****************************************************/ + +/************* SIGFPE *******************************/ + +int causeSIGFPECrashF3(); + +void causeSIGFPECrashF2(); + +void causeSIGFPECrashF1(); + +/***************************************************/ + +/************* SIGILL *******************************/ + +void causeSIGILLCrashF3(); + +void causeSIGILLCrashF2(); + +void causeSIGILLCrashF1(); + +/***************************************************/ + +/************* SIGBUS *******************************/ + +void causeSIGBUSCrashF3(); + +void causeSIGBUSCrashF2(); + +void causeSIGBUSCrashF1(); + +/***************************************************/ + +/************* SIGTRAP *******************************/ + +void causeSIGTRAPCrashF3(); + +void causeSIGTRAPCrashF2(); + +void causeSIGTRAPCrashF1(); +/***************************************************/ diff --git a/example/android/app/src/main/cpp/crasher_3.c b/example/android/app/src/main/cpp/crasher_3.c new file mode 100644 index 000000000..c53f5fbc8 --- /dev/null +++ b/example/android/app/src/main/cpp/crasher_3.c @@ -0,0 +1,44 @@ + +#pragma GCC optimize ("O0") +#include +#include +#include +#include +#include "crasher_4.h" + +/************* SIGSEGV *******************************/ +void causeSIGSEGVCrashF2() { + causeSIGSEGVCrashF3(NULL); +} +/*****************************************************/ + +/************* SIGABRT *******************************/ +void causeSIGABRTCrashF2() { + causeSIGABRTCrashF3(); +} +/****************************************************/ + +/************* SIGFPE *******************************/ +void causeSIGFPECrashF2() { + unsigned int *bad_pointer = (unsigned int *)(0xdeadbeef); + *bad_pointer=0xfeedface; +} +/***************************************************/ + +/************* SIGILL *******************************/ +void causeSIGILLCrashF2() { + causeSIGILLCrashF3(); +} +/***************************************************/ + +/************* SIGBUS *******************************/ +void causeSIGBUSCrashF2() { + causeSIGBUSCrashF3(); +} +/***************************************************/ + +/************* SIGTRAP *******************************/ +void causeSIGTRAPCrashF2() { + causeSIGTRAPCrashF3(); +} +/***************************************************/ diff --git a/example/android/app/src/main/cpp/crasher_3.h b/example/android/app/src/main/cpp/crasher_3.h new file mode 100644 index 000000000..ed4039612 --- /dev/null +++ b/example/android/app/src/main/cpp/crasher_3.h @@ -0,0 +1,24 @@ + +/************* SIGSEGV *******************************/ +void causeSIGSEGVCrashF2(); +/*****************************************************/ + +/************* SIGABRT *******************************/ +void causeSIGABRTCrashF2(); +/****************************************************/ + +/************* SIGFPE *******************************/ +void causeSIGFPECrashF2(); +/***************************************************/ + +/************* SIGILL *******************************/ +void causeSIGILLCrashF2(); +/***************************************************/ + +/************* SIGBUS *******************************/ +void causeSIGBUSCrashF2(); +/***************************************************/ + +/************* SIGTRAP *******************************/ +void causeSIGTRAPCrashF2(); +/***************************************************/ diff --git a/example/android/app/src/main/cpp/crasher_4.cpp b/example/android/app/src/main/cpp/crasher_4.cpp new file mode 100644 index 000000000..1b59db3a9 --- /dev/null +++ b/example/android/app/src/main/cpp/crasher_4.cpp @@ -0,0 +1,57 @@ + + +#include +#include +#include +#include +#include + +extern "C" { +/************* SIGSEGV *******************************/ +void causeSIGSEGVCrashF3(volatile int *i) { + //SIGSEGV + volatile int j = 34 / *i; +} +/*****************************************************/ + +/************* SIGABRT *******************************/ +void causeSIGABRTCrashF3() { + //SIGABRT + throw std::invalid_argument("received invalid value"); +} +/****************************************************/ + +/************* SIGFPE *******************************/ +void causeSIGFPECrashF3() { + //SIGFPE + raise(SIGFPE); + pthread_kill(getpid(), SIGFPE); +} +/***************************************************/ + +/************* SIGILL *******************************/ + +int causeSIGILLCrashF3() { + //SIGILL + raise(SIGILL); + pthread_kill(getpid(), SIGILL); +} +/***************************************************/ + +/************* SIGBUS *******************************/ + +void causeSIGBUSCrashF3() { + //SIGBUS + raise(SIGBUS); + pthread_kill(getpid(), SIGBUS); +} +/***************************************************/ + +/************* SIGTRAP *******************************/ + +void causeSIGTRAPCrashF3() { + //SIGBUS + __builtin_trap(); +} +/***************************************************/ +} diff --git a/example/android/app/src/main/cpp/crasher_4.h b/example/android/app/src/main/cpp/crasher_4.h new file mode 100644 index 000000000..8c546ee04 --- /dev/null +++ b/example/android/app/src/main/cpp/crasher_4.h @@ -0,0 +1,24 @@ + +/************* SIGSEGV *******************************/ +void causeSIGSEGVCrashF3(int* i); +/*****************************************************/ + +/************* SIGABRT *******************************/ +void causeSIGABRTCrashF3(); +/****************************************************/ + +/************* SIGFPE *******************************/ +void causeSIGFPECrashF3(); +/***************************************************/ + +/************* SIGILL *******************************/ +int causeSIGILLCrashF3(); +/***************************************************/ + +/************* SIGBUS *******************************/ +void causeSIGBUSCrashF3(); +/***************************************************/ + +/************* SIGTRAP *******************************/ +void causeSIGTRAPCrashF3(); +/***************************************************/ diff --git a/example/android/app/src/main/cpp/native-lib.cpp b/example/android/app/src/main/cpp/native-lib.cpp new file mode 100644 index 000000000..4f5588e37 --- /dev/null +++ b/example/android/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + + + + +/* + * Throws invalid argument exception + */ +extern "C" +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_nativeLibs_CppNativeLib_crashNDK(JNIEnv *env, + jobject object) { + __android_log_print(ANDROID_LOG_DEBUG, "NativeC++", "%s", "received invalid value"); + + // in Android SDK it's equivalent to causeSIGABRTCrash() + throw std::invalid_argument("received invalid value"); +} \ No newline at end of file From 46053c1c1e8610a078c9d0a3cbdda04f3ef96ae9 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Tue, 29 Jul 2025 18:26:06 +0300 Subject: [PATCH 6/8] feat: add NDK crashes section in example app and ProGuard integration - Added support for triggering various NDK crashes (SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS, SIGTRAP) through new methods in `InstabugExampleMethodCallHandler` and `InstabugFlutterExampleMethodChannel`. - Introduced `CppNativeLib` for native crash methods and linked it in the Kotlin code. - Created `NdkCrashesContent` widget for UI interaction to trigger crashes. - Updated `build.gradle` to include ProGuard settings and CMake support for native builds. - Added `proguard-rules.pro` for project-specific ProGuard rules. --- example/android/app/build.gradle | 12 ++- example/android/app/proguard-rules.pro | 10 +++ .../InstabugExampleMethodCallHandler.kt | 74 +++++++++++++++++++ .../nativeLibs/CppNativeLib.java | 24 ++++++ .../src/components/ndk_crashes_content.dart | 61 +++++++++++++++ ...stabug_flutter_example_method_channel.dart | 66 +++++++++++++++++ example/lib/src/screens/crashes_page.dart | 7 ++ 7 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 example/android/app/proguard-rules.pro create mode 100644 example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java create mode 100644 example/lib/src/components/ndk_crashes_content.dart diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 8e777d514..bc15d9904 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -5,6 +5,8 @@ plugins { id "dev.flutter.flutter-gradle-plugin" } +def enableProguardInReleaseBuilds = false + android { namespace = "com.instabug.flutter.example" compileSdk = flutter.compileSdkVersion @@ -33,7 +35,15 @@ android { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + externalNativeBuild { + cmake { + path 'src/main/cpp/CMakeLists.txt' } } namespace 'com.instabug.flutter.example' diff --git a/example/android/app/proguard-rules.pro b/example/android/app/proguard-rules.pro new file mode 100644 index 000000000..11b025724 --- /dev/null +++ b/example/android/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt index 17a7d35c6..cf5b640d1 100644 --- a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt +++ b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt @@ -2,6 +2,7 @@ package com.example.InstabugSample import android.os.Handler import android.os.Looper import android.util.Log +import com.example.InstabugSample.nativeLibs.CppNativeLib import com.instabug.crash.CrashReporting import com.instabug.crash.models.IBGNonFatalException import io.flutter.plugin.common.MethodCall @@ -37,6 +38,41 @@ class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { sendOOM() result.success(null) } + CAUSE_NDK_CRASH -> { + Log.d(TAG, "Causing NDK crash") + causeNdkCrash() + result.success(null) + } + CAUSE_SIGSEGV_CRASH -> { + Log.d(TAG, "Causing SIGSEGV crash") + causeSIGSEGVCrash() + result.success(null) + } + CAUSE_SIGABRT_CRASH -> { + Log.d(TAG, "Causing SIGABRT crash") + causeSIGABRTCrash() + result.success(null) + } + CAUSE_SIGFPE_CRASH -> { + Log.d(TAG, "Causing SIGFPE crash") + causeSIGFPECrash() + result.success(null) + } + CAUSE_SIGILL_CRASH -> { + Log.d(TAG, "Causing SIGILL crash") + causeSIGILLCrash() + result.success(null) + } + CAUSE_SIGBUS_CRASH -> { + Log.d(TAG, "Causing SIGBUS crash") + causeSIGBUSCrash() + result.success(null) + } + CAUSE_SIGTRAP_CRASH -> { + Log.d(TAG, "Causing SIGTRAP crash") + causeSIGTRAPCrash() + result.success(null) + } else -> { Log.e(TAG, "onMethodCall for ${call.method} is not implemented") result.notImplemented() @@ -55,6 +91,15 @@ class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { const val SEND_NATIVE_FATAL_HANG = "sendNativeFatalHang" const val SEND_ANR = "sendAnr" const val SEND_OOM = "sendOom" + + // NDK Crash Method Names + const val CAUSE_NDK_CRASH = "causeNdkCrash" + const val CAUSE_SIGSEGV_CRASH = "causeSIGSEGVCrash" + const val CAUSE_SIGABRT_CRASH = "causeSIGABRTCrash" + const val CAUSE_SIGFPE_CRASH = "causeSIGFPECrash" + const val CAUSE_SIGILL_CRASH = "causeSIGILLCrash" + const val CAUSE_SIGBUS_CRASH = "causeSIGBUSCrash" + const val CAUSE_SIGTRAP_CRASH = "causeSIGTRAPCrash" } private fun sendNativeNonFatal(exceptionObject: String?) { @@ -125,4 +170,33 @@ class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { return randomString.toString() } + // NDK Crash Methods + private fun causeNdkCrash() { + CppNativeLib.crashNDK(); + } + + private fun causeSIGSEGVCrash() { + CppNativeLib.causeSIGSEGVCrash(); + } + + private fun causeSIGABRTCrash() { + CppNativeLib.causeSIGABRTCrash(); + } + + private fun causeSIGFPECrash() { + CppNativeLib.causeSIGFPECrash(); + } + + private fun causeSIGILLCrash() { + CppNativeLib.causeSIGILLCrash(); + } + + private fun causeSIGBUSCrash() { + CppNativeLib.causeSIGBUSCrash(); + } + + private fun causeSIGTRAPCrash() { + CppNativeLib.causeSIGTRAPCrash(); + } + } diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java b/example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java new file mode 100644 index 000000000..9c86e49c2 --- /dev/null +++ b/example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java @@ -0,0 +1,24 @@ +package com.example.InstabugSample.nativeLibs; + +/** + * C++ Native library bridge. + */ +public class CppNativeLib { + + static { + System.loadLibrary("native-lib"); + } + + /** + * Crashes the app with an invalid argument exception in the C++ native library. + */ + public static native void crashNDK(); + public static native void causeSIGSEGVCrash(); + public static native void causeSIGABRTCrash(); + public static native void causeSIGFPECrash(); + public static native void causeSIGILLCrash(); + public static native void causeSIGBUSCrash(); + public static native void causeSIGTRAPCrash(); + + +} diff --git a/example/lib/src/components/ndk_crashes_content.dart b/example/lib/src/components/ndk_crashes_content.dart new file mode 100644 index 000000000..d9aca91d5 --- /dev/null +++ b/example/lib/src/components/ndk_crashes_content.dart @@ -0,0 +1,61 @@ +part of '../../main.dart'; + +class NdkCrashesContent extends StatelessWidget { + const NdkCrashesContent({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Platform.isAndroid + ? const Column( + children: [ + InstabugButton( + text: 'Trigger NDK Crash', + onPressed: InstabugFlutterExampleMethodChannel.causeNdkCrash, + ), + InstabugButton( + text: 'Trigger NDK SIGSEGV Crash', + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkSigsegv, + ), + InstabugButton( + text: 'Trigger NDK SIGABRT Crash', + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkSigabrt, + ), + InstabugButton( + text: 'Trigger NDK SIGFPE Crash', + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkSigfpe, + ), + InstabugButton( + text: 'Trigger NDK SIGILL Crash', + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkSigill, + ), + InstabugButton( + text: 'Trigger NDK SIGBUS Crash', + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkSigbus, + ), + InstabugButton( + text: 'Trigger NDK SIGTRAP Crash', + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkSigtrap, + ), + ], + ) + : const Text( + 'NDK crashes are only available on Android', + style: TextStyle( + fontSize: 14, + color: Colors.grey, + ), + ), + ], + ); + } +} diff --git a/example/lib/src/native/instabug_flutter_example_method_channel.dart b/example/lib/src/native/instabug_flutter_example_method_channel.dart index 9507cc403..e27d6f1bc 100644 --- a/example/lib/src/native/instabug_flutter_example_method_channel.dart +++ b/example/lib/src/native/instabug_flutter_example_method_channel.dart @@ -54,6 +54,63 @@ class InstabugFlutterExampleMethodChannel { log("Failed to send out of memory: '${e.message}'.", name: _tag); } } + + static Future causeNdkCrash() async { + try { + await _channel.invokeMethod(Constants.causeNdkCrashMethodName); + } on PlatformException catch (e) { + log("Failed to cause NDK crash: '${e.message}'.", name: _tag); + } + } + + // NDK Crash Methods + static Future causeNdkSigsegv() async { + try { + await _channel.invokeMethod(Constants.causeNdkSigsegvMethodName); + } on PlatformException catch (e) { + log("Failed to trigger NDK SIGSEGV: '${e.message}'.", name: _tag); + } + } + + static Future causeNdkSigabrt() async { + try { + await _channel.invokeMethod(Constants.causeNdkSigabrtMethodName); + } on PlatformException catch (e) { + log("Failed to trigger NDK SIGABRT: '${e.message}'.", name: _tag); + } + } + + static Future causeNdkSigfpe() async { + try { + await _channel.invokeMethod(Constants.causeNdkSigfpeMethodName); + } on PlatformException catch (e) { + log("Failed to trigger NDK SIGFPE: '${e.message}'.", name: _tag); + } + } + + static Future causeNdkSigill() async { + try { + await _channel.invokeMethod(Constants.causeNdkSigillMethodName); + } on PlatformException catch (e) { + log("Failed to trigger NDK SIGILL: '${e.message}'.", name: _tag); + } + } + + static Future causeNdkSigbus() async { + try { + await _channel.invokeMethod(Constants.causeNdkSigbusMethodName); + } on PlatformException catch (e) { + log("Failed to trigger NDK SIGBUS: '${e.message}'.", name: _tag); + } + } + + static Future causeNdkSigtrap() async { + try { + await _channel.invokeMethod(Constants.causeNdkSigtrapMethodName); + } on PlatformException catch (e) { + log("Failed to trigger NDK SIGTRAP: '${e.message}'.", name: _tag); + } + } } class Constants { @@ -65,4 +122,13 @@ class Constants { static const sendNativeFatalHangMethodName = "sendNativeFatalHang"; static const sendAnrMethodName = "sendAnr"; static const sendOomMethodName = "sendOom"; + + // NDK Crash Method Names + static const causeNdkCrashMethodName = "causeNdkCrash"; + static const causeNdkSigsegvMethodName = "causeSIGSEGVCrash"; + static const causeNdkSigabrtMethodName = "causeSIGABRTCrash"; + static const causeNdkSigfpeMethodName = "causeSIGFPECrash"; + static const causeNdkSigillMethodName = "causeSIGILLCrash"; + static const causeNdkSigbusMethodName = "causeSIGBUSCrash"; + static const causeNdkSigtrapMethodName = "causeSIGTRAPCrash"; } diff --git a/example/lib/src/screens/crashes_page.dart b/example/lib/src/screens/crashes_page.dart index 7e0ec8e76..3c4672ade 100644 --- a/example/lib/src/screens/crashes_page.dart +++ b/example/lib/src/screens/crashes_page.dart @@ -16,6 +16,13 @@ class CrashesPage extends StatelessWidget { Text('Fatal Crashes can only be tested in release mode'), Text('Most of these buttons will crash the application'), FatalCrashesContent(), + SectionTitle('NDK Crashes'), + Text( + 'NDK crashes are native C/C++ crashes that occur in Android applications.'), + Text( + 'These crashes can only be tested on Android devices with NDK support.', + style: TextStyle(color: Colors.orange)), + NdkCrashesContent(), SectionTitle('Crash section'), ], // This trailing comma makes auto-formatting nicer for build methods. ); From 157ce6be3c26192dd999ec2bdad0fc944444661c Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Mon, 11 Aug 2025 17:52:23 +0300 Subject: [PATCH 7/8] fix: add missing ndk dependency in example pubspec file, and correctly seperate java/kotlin code - Added `instabug_flutter_ndk` dependency in `pubspec.yaml` - Updated Android project structure, including package renaming and build configuration adjustments. - Fixed JNI method signatures and moved `CppNativeLib` class java package instead of kotlin. - Improved `.gitignore` to include C++ build artifacts for cleaner project management. --- example/android/.gitignore | 5 +- example/android/app/build.gradle | 7 +- example/android/app/src/main/cpp/crasher.c | 22 ++--- .../android/app/src/main/cpp/native-lib.cpp | 2 +- .../InstabugSample/ndk}/CppNativeLib.java | 8 +- .../InstabugExampleMethodCallHandler.kt | 17 ++-- .../example/InstabugSample/MainActivity.kt | 6 +- example/android/settings.gradle | 2 +- example/lib/main.dart | 5 + example/pubspec.lock | 95 ++++++++++--------- example/pubspec.yaml | 5 + 11 files changed, 100 insertions(+), 74 deletions(-) rename example/android/app/src/main/{kotlin/com/example/InstabugSample/nativeLibs => java/com/example/InstabugSample/ndk}/CppNativeLib.java (78%) diff --git a/example/android/.gitignore b/example/android/.gitignore index bf8d01f85..581dd30c8 100644 --- a/example/android/.gitignore +++ b/example/android/.gitignore @@ -8,4 +8,7 @@ GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties \ No newline at end of file +key.properties + +# c++ +/app/.cxx/ \ No newline at end of file diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index bc15d9904..e0dba8934 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -6,9 +6,10 @@ plugins { } def enableProguardInReleaseBuilds = false +def enableShrinkResources = false android { - namespace = "com.instabug.flutter.example" + namespace = "com.example.InstabugSample" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -22,7 +23,7 @@ android { } defaultConfig { - applicationId "com.instabug.flutter.example" + applicationId "com.example.InstabugSample" minSdkVersion 21 targetSdkVersion 34 versionCode flutter.versionCode @@ -37,6 +38,7 @@ android { // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds + shrinkResources enableShrinkResources proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } @@ -46,7 +48,6 @@ android { path 'src/main/cpp/CMakeLists.txt' } } - namespace 'com.instabug.flutter.example' configurations.all { resolutionStrategy.force 'org.hamcrest:hamcrest-core:1.3' diff --git a/example/android/app/src/main/cpp/crasher.c b/example/android/app/src/main/cpp/crasher.c index 8ccfc598a..c9e45e76f 100644 --- a/example/android/app/src/main/cpp/crasher.c +++ b/example/android/app/src/main/cpp/crasher.c @@ -7,44 +7,44 @@ /************* SIGSEGV *******************************/ JNIEXPORT void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGSEGVCrash(JNIEnv *env, jobject thiz) { +Java_com_example_InstabugSample_ndk_CppNativeLib_causeSIGSEGVCrash(JNIEnv *env, jobject thiz) { causeSIGSEGVCrashF1(); } /*****************************************************/ /************* SIGABRT *******************************/ -void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGABRTCrash(JNIEnv *env, jobject thiz) { +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_ndk_CppNativeLib_causeSIGABRTCrash(JNIEnv *env, jobject thiz) { causeSIGABRTCrashF1(); } /****************************************************/ /************* SIGFPE *******************************/ -void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGFPECrash(JNIEnv *env, jobject thiz) { +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_ndk_CppNativeLib_causeSIGFPECrash(JNIEnv *env, jobject thiz) { causeSIGFPECrashF1(); } /***************************************************/ /************* SIGILL *******************************/ -void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGILLCrash(JNIEnv *env, jobject thiz) { +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_ndk_CppNativeLib_causeSIGILLCrash(JNIEnv *env, jobject thiz) { causeSIGILLCrashF1(); } /***************************************************/ /************* SIGBUS *******************************/ -void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGBUSCrash(JNIEnv *env, jobject thiz) { +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_ndk_CppNativeLib_causeSIGBUSCrash(JNIEnv *env, jobject thiz) { causeSIGBUSCrashF1(); } /***************************************************/ /************* SIGTRAP *******************************/ -void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_causeSIGTRAPCrash(JNIEnv *env, jobject thiz) { +JNIEXPORT void JNICALL +Java_com_example_InstabugSample_ndk_CppNativeLib_causeSIGTRAPCrash(JNIEnv *env, jobject thiz) { causeSIGTRAPCrashF1(); } /***************************************************/ diff --git a/example/android/app/src/main/cpp/native-lib.cpp b/example/android/app/src/main/cpp/native-lib.cpp index 4f5588e37..7334aade3 100644 --- a/example/android/app/src/main/cpp/native-lib.cpp +++ b/example/android/app/src/main/cpp/native-lib.cpp @@ -10,7 +10,7 @@ */ extern "C" JNIEXPORT void JNICALL -Java_com_example_InstabugSample_nativeLibs_CppNativeLib_crashNDK(JNIEnv *env, +Java_com_example_InstabugSample_ndk_CppNativeLib_crashNDK(JNIEnv *env, jobject object) { __android_log_print(ANDROID_LOG_DEBUG, "NativeC++", "%s", "received invalid value"); diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java b/example/android/app/src/main/java/com/example/InstabugSample/ndk/CppNativeLib.java similarity index 78% rename from example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java rename to example/android/app/src/main/java/com/example/InstabugSample/ndk/CppNativeLib.java index 9c86e49c2..e9e59ab3a 100644 --- a/example/android/app/src/main/kotlin/com/example/InstabugSample/nativeLibs/CppNativeLib.java +++ b/example/android/app/src/main/java/com/example/InstabugSample/ndk/CppNativeLib.java @@ -1,4 +1,6 @@ -package com.example.InstabugSample.nativeLibs; +package com.example.InstabugSample.ndk; + +import android.util.Log; /** * C++ Native library bridge. @@ -10,7 +12,7 @@ public class CppNativeLib { } /** - * Crashes the app with an invalid argument exception in the C++ native library. + * Crashes the app with various signals from the C/C++ layer. */ public static native void crashNDK(); public static native void causeSIGSEGVCrash(); @@ -19,6 +21,4 @@ public class CppNativeLib { public static native void causeSIGILLCrash(); public static native void causeSIGBUSCrash(); public static native void causeSIGTRAPCrash(); - - } diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt index cf5b640d1..e56215683 100644 --- a/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt +++ b/example/android/app/src/main/kotlin/com/example/InstabugSample/InstabugExampleMethodCallHandler.kt @@ -1,8 +1,9 @@ package com.example.InstabugSample + import android.os.Handler import android.os.Looper import android.util.Log -import com.example.InstabugSample.nativeLibs.CppNativeLib +import com.example.InstabugSample.ndk.CppNativeLib import com.instabug.crash.CrashReporting import com.instabug.crash.models.IBGNonFatalException import io.flutter.plugin.common.MethodCall @@ -172,31 +173,31 @@ class InstabugExampleMethodCallHandler : MethodChannel.MethodCallHandler { // NDK Crash Methods private fun causeNdkCrash() { - CppNativeLib.crashNDK(); + CppNativeLib.crashNDK() } private fun causeSIGSEGVCrash() { - CppNativeLib.causeSIGSEGVCrash(); + CppNativeLib.causeSIGSEGVCrash() } private fun causeSIGABRTCrash() { - CppNativeLib.causeSIGABRTCrash(); + CppNativeLib.causeSIGABRTCrash() } private fun causeSIGFPECrash() { - CppNativeLib.causeSIGFPECrash(); + CppNativeLib.causeSIGFPECrash() } private fun causeSIGILLCrash() { - CppNativeLib.causeSIGILLCrash(); + CppNativeLib.causeSIGILLCrash() } private fun causeSIGBUSCrash() { - CppNativeLib.causeSIGBUSCrash(); + CppNativeLib.causeSIGBUSCrash() } private fun causeSIGTRAPCrash() { - CppNativeLib.causeSIGTRAPCrash(); + CppNativeLib.causeSIGTRAPCrash() } } diff --git a/example/android/app/src/main/kotlin/com/example/InstabugSample/MainActivity.kt b/example/android/app/src/main/kotlin/com/example/InstabugSample/MainActivity.kt index b6d6f7352..af12f18cf 100644 --- a/example/android/app/src/main/kotlin/com/example/InstabugSample/MainActivity.kt +++ b/example/android/app/src/main/kotlin/com/example/InstabugSample/MainActivity.kt @@ -1,4 +1,4 @@ -package com.instabug.flutter.example +package com.example.InstabugSample import com.example.InstabugSample.InstabugExampleMethodCallHandler import com.example.InstabugSample.InstabugExampleMethodCallHandler.Companion.METHOD_CHANNEL_NAME @@ -10,6 +10,8 @@ class MainActivity : FlutterActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, METHOD_CHANNEL_NAME).setMethodCallHandler(InstabugExampleMethodCallHandler()) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, METHOD_CHANNEL_NAME).setMethodCallHandler( + InstabugExampleMethodCallHandler() + ) } } diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 32cfc43dc..e93b1b6a3 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -20,7 +20,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false + id "com.android.application" version "8.2.1" apply false id "org.jetbrains.kotlin.android" version "1.8.22" apply false } diff --git a/example/lib/main.dart b/example/lib/main.dart index 91b0a67e7..80e4cce15 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -5,6 +5,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:instabug_flutter/instabug_flutter.dart'; +import 'package:instabug_flutter_ndk/instabug_flutter_ndk.dart'; import 'package:instabug_flutter_example/src/components/apm_switch.dart'; import 'package:instabug_http_client/instabug_http_client.dart'; import 'package:instabug_flutter_example/src/app_routes.dart'; @@ -42,6 +43,8 @@ part 'src/components/traces_content.dart'; part 'src/components/flows_content.dart'; +part 'src/components/ndk_crashes_content.dart'; + void main() { runZonedGuarded( () { @@ -57,6 +60,8 @@ void main() { Zone.current.handleUncaughtError(details.exception, details.stack!); }; + CrashReporting.setNDKEnabled(true); + runApp(const MyApp()); }, CrashReporting.reportCrash, diff --git a/example/pubspec.lock b/example/pubspec.lock index 99e8f9d56..67ec4194a 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,58 +5,58 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" file: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" flutter: dependency: "direct main" description: flutter @@ -108,6 +108,15 @@ packages: relative: true source: path version: "15.0.2" + instabug_flutter_ndk: + dependency: "direct main" + description: + path: "packages/instabug_flutter_ndk" + ref: "feat/support-ndk-crashes" + resolved-ref: "1e075d6b1be1fdd4781403607382fee87d93f604" + url: "https://github.com/Instabug/Instabug-Flutter/" + source: git + version: "0.0.1" instabug_http_client: dependency: "direct main" description: @@ -120,18 +129,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -152,10 +161,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -168,34 +177,34 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" path: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" platform: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" process: dependency: transitive description: name: process - sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" + sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "5.0.3" sky_engine: dependency: transitive description: flutter @@ -205,34 +214,34 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" sync_http: dependency: transitive description: @@ -245,18 +254,18 @@ packages: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" typed_data: dependency: transitive description: @@ -277,10 +286,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" webdriver: dependency: transitive description: @@ -290,5 +299,5 @@ packages: source: hosted version: "3.0.4" sdks: - dart: ">=3.5.0 <4.0.0" + dart: ">=3.7.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index fe72aaa2d..e800cb856 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -26,6 +26,11 @@ dependencies: http: ^0.13.0 instabug_flutter: path: ../ + instabug_flutter_ndk: + git: + url: https://github.com/Instabug/Instabug-Flutter/ + path: packages/instabug_flutter_ndk + ref: feat/support-ndk-crashes instabug_http_client: ^2.4.0 dev_dependencies: From a31024fb091cc22c4989592a8e67b085d6f75146 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Mon, 11 Aug 2025 18:10:02 +0300 Subject: [PATCH 8/8] chore: run dart format --- example/lib/src/components/ndk_crashes_content.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/example/lib/src/components/ndk_crashes_content.dart b/example/lib/src/components/ndk_crashes_content.dart index d9aca91d5..1b63ef05d 100644 --- a/example/lib/src/components/ndk_crashes_content.dart +++ b/example/lib/src/components/ndk_crashes_content.dart @@ -14,7 +14,8 @@ class NdkCrashesContent extends StatelessWidget { children: [ InstabugButton( text: 'Trigger NDK Crash', - onPressed: InstabugFlutterExampleMethodChannel.causeNdkCrash, + onPressed: + InstabugFlutterExampleMethodChannel.causeNdkCrash, ), InstabugButton( text: 'Trigger NDK SIGSEGV Crash',