如何在Android中构造模拟NDK崩溃以测试Crashlytics集成效果
模拟NDK崩溃验证Crashlytics集成有效性的实操方法
直接给几种可落地的方案,从无代码改动到自定义堆栈场景都覆盖:
- 方案1:ADB命令触发系统级原生崩溃(无需修改业务代码)
直接给目标应用进程发送SIGSEGV(原生段错误信号,是最常见的NDK崩溃触发信号),一行命令就能触发,完全不用动项目代码。
执行命令:adb shell kill -11 $(pidof 你的应用包名)
执行后应用会立刻闪退,触发的崩溃信号和真实线上NDK崩溃完全一致,Crashlytics的NDK捕获逻辑可以正常识别上报。 - 方案2:在现有Native代码中插桩触发非法内存访问(最贴合真实业务崩溃场景)
如果你项目里已经有现成的C/C编写的native方法,直接在方法内部加一段故意触发非法内存访问的代码即可,生成的崩溃堆栈和你业务代码的真实NDK崩溃完全一致。
示例C/C代码:
把这段代码放到你现有native方法的任意执行位置,在Kotlin/Java层调用这个native方法,跑起来就会立刻触发NDK崩溃。// 故意定义空指针并解引用,直接触发段错误 char* illegal_ptr = NULL; *illegal_ptr = 0x01; - 方案3:临时创建最小原生崩溃模块(适合刚集成完还没写业务native代码的场景)
如果项目里还没有自定义的native实现,想验证集成是否生效,可以临时加个最小的崩溃测试模块:- 在项目的
app/src/main/cpp目录下新建crash_test.cpp,写入:#include <jni.h> // 暴露给Kotlin层的native方法 extern "C" JNIEXPORT void JNICALL Java_com_你的包名_NativeCrashUtil_triggerTestCrash(JNIEnv* env, jobject thiz) { // 故意访问非法内存地址触发崩溃 int* ptr = (int*)0xdead1234; *ptr = 100; } - 同目录新建最小
CMakeLists.txt配置:cmake_minimum_required(VERSION 3.22.1) add_library(crash_test SHARED crash_test.cpp) find_library(log-lib log) target_link_libraries(crash_test ${log-lib}) - 在Kotlin层加个工具类加载刚才生成的so,调用对应native方法就能触发崩溃。
- 在项目的
验证时的关键注意事项
- 触发崩溃后,必须把应用从最近任务划掉,重新冷启动一次,Crashlytics才会把本地缓存的崩溃日志上传到服务端,刚崩完直接去控制台是看不到记录的。
- 上报有1~3分钟的延迟,冷启动后稍等一会再去控制台查看即可。
- 确认项目已引入NDK专属依赖,仅基础的Crashlytics依赖无法捕获原生层的崩溃信号。
- 如果是调试构建包,需要在应用初始化时手动调用
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)开启收集,避免默认策略拦截调试包的上报。
内容的提问来源于stack exchange,提问作者anticafe
相关产品推荐
相关产品推荐

