You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在含JNI/NDK的Android应用中集成Crashlytics?解决CrashlyticsNdk解析问题

解决Android Studio 3.X手动集成Crashlytics NDK的问题

看起来你已经搞定了Java层的Crashlytics上报,但卡在了NDK部分的CrashlyticsNdk无法解析的问题——这大概率是因为手动集成时漏掉了NDK专属的依赖配置,以及适配Android Studio 3.X的版本匹配问题。下面一步步帮你解决:

1. 补全Gradle依赖与仓库配置

首先要确保项目能拉到Crashlytics NDK的依赖,手动集成不会自动帮你添加这些内容:

项目根目录的build.gradle

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
        google()
        jcenter()
    }
    dependencies {
        // 适配AS3.X的Fabric Gradle插件版本,别用最新版
        classpath 'io.fabric.tools:gradle:1.31.2'
        // 你的其他classpath依赖(比如Android Gradle插件)
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
        google()
        jcenter()
    }
}

App模块的build.gradle

开头要应用Fabric插件(这个旧版本和AS3.X兼容):

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

然后在dependencies块里加上NDK的依赖,注意要和基础Crashlytics版本匹配:

dependencies {
    // 适配AS3.X的基础Crashlytics依赖
    implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    // 关键:NDK专属依赖,之前你可能漏掉了这个
    implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.1.1'
    // 你的其他项目依赖
}

2. 配置AndroidManifest.xml

确保清单文件里有必要的权限和Crashlytics的API Key:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    ...>
    <!-- 替换成你自己的Fabric API Key -->
    <meta-data
        android:name="io.fabric.ApiKey"
        android:value="YOUR_FABRIC_API_KEY" />
    ...
</application>

3. 正确初始化Crashlytics + NDK

现在CrashlyticsNdk类应该能被正常解析了,在你的Application类的onCreate方法里完成初始化:

import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.ndk.CrashlyticsNdk;
import io.fabric.sdk.android.Fabric;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 同时初始化Crashlytics和NDK模块
        Fabric.with(this, new Crashlytics(), new CrashlyticsNdk());
    }
}

别忘了在Manifest里指定这个自定义Application类。

4. 配置NDK符号上传(关键)

C++崩溃需要符号文件才能解析成可读的堆栈信息,在App模块的build.gradle里添加符号上传配置:

android {
    // 指定适配AS3.X的NDK版本
    ndkVersion '19.2.5345600'

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            
            crashlytics {
                // 开启NDK符号上传
                nativeSymbolUploadEnabled true
                // 指定未剥离符号的原生库目录
                unstrippedNativeLibsDir 'build/intermediates/merged_native_libs/release/out/lib'
            }
        }
        debug {
            // 调试模式也可以开启,方便测试C++崩溃
            crashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir 'build/intermediates/merged_native_libs/debug/out/lib'
            }
        }
    }
}

5. 测试C++崩溃

写个简单的Native方法触发崩溃,验证上报是否正常:

// 你的Native代码文件
#include <jni.h>

extern "C" JNIEXPORT void JNICALL
Java_com_example_yourpackage_MainActivity_triggerNativeCrash(JNIEnv* env, jobject thiz) {
    // 空指针访问触发崩溃
    int* nullPtr = nullptr;
    *nullPtr = 100;
}

在Java层调用这个方法,然后查看Crashlytics控制台,应该能看到对应的C++崩溃堆栈。

完成这些步骤后,你应该就能同时捕获Java层和C++层的崩溃与错误了。

内容的提问来源于stack exchange,提问作者Jaidev Ramakrishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:53:55