美文网首页
firbase 如果收集JNI奔溃信息

firbase 如果收集JNI奔溃信息

作者: 忧零520 | 来源:发表于2024-10-22 19:42 被阅读0次

工具安装

如果你的终端提示找不到 brew,这意味着 Homebrew 还没有正确安装或者它没有被添加到你的 PATH 环境变量中。以下是确保 Homebrew 安装并能够正确使用的步骤:

  1. 安装 Homebrew
    首先,按照以下命令安装 Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
这段命令会下载并运行 Homebrew 的安装脚本。安装过程中可能需要你输入管理员密码。

  1. 将 Brew 添加到 PATH 变量
    安装完成后,Homebrew 会给出一些关于如何将其路径添加到你的 ~/.zshrc 或 ~/.zprofile 的提示。你可以手动添加下面的行到你的 ~/.zshrc 或 ~/.zprofile 文件中(假设你使用的是 zsh,这是 macOS 的默认 shell):

echo 'eval "(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "(/opt/homebrew/bin/brew shellenv)"
这两行命令会将 Homebrew 添加到你的 PATH 环境变量中并立即生效。

  1. 确认安装
    重新启动终端或者运行以下命令将配置文件重新加载:

source ~/.zprofile
然后,验证 Homebrew 是否安装成功:

brew --version
如果一切正常,你应该能看到 Homebrew 的版本信息。

  1. 安装 GNU Binutils
    使用 Homebrew 来安装 binutils 包,其中包含 readelf 工具:

brew install binutils
安装完成后,readelf 工具通常会被安装到 /opt/homebrew/opt/binutils/bin 目录。

  1. 使用和配置 readelf
    现在你可以使用完整路径来调用 readelf:

/opt/homebrew/opt/binutils/bin/readelf -n path/to/your/native/library.so
如果想要更方便地使用 readelf,可以将其添加到你的 PATH 环境变量中:

echo 'export PATH="/opt/homebrew/opt/binutils/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

开始行动

Google原始地址

  1. 确保在模块(应用级)Gradle 文件中将 nativeSymbolUploadEnabled 设置为 true
    要启用符号文件的自动上传,你需在 build.gradle 文件中进行配置。

android {
// ...
buildTypes {
release {
// Enable the Crashlytics mapping file upload process
firebaseCrashlytics {
nativeSymbolUploadEnabled true
}
}
}
}
这里的 nativeSymbolUploadEnabled 选项确保 Firebase Crashlytics 插件在构建时自动处理 NDK 符号文件。

  1. 在每次构建 NDK 库后明确调用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任务
    为了确保符号文件(symbol files)正确上传,需要在每次构建后调用 uploadCrashlyticsSymbolFile 任务。

假设你的构建变体是 release,你需要运行以下命令:

./gradlew app:assembleRelease
app:uploadCrashlyticsSymbolFileRelease
这条命令会完成以下步骤:

assembleRelease:构建 release 变体。
uploadCrashlyticsSymbolFileRelease:上传构建过程中生成的符号文件。

  1. 验证二进制文件中是否存在 GNU build ID
    Crashlytics 依赖 GNU build ID 来关联符号文件和崩溃报告。你可以使用 readelf 工具来检查你的 .so 文件是否包含 build ID。

运行以下命令:

readelf -n path/to/your/library.so
如果输出包含一个类似 Build ID 的字段,说明你的二进制文件包含 GNU build ID。例如:

$ readelf -n your-library.so

Displaying notes found in: .note.gnu.build-id
Owner Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Build ID: c4b301917e8a4118a97d4a0e3f8b5ebc8a6b4b5d

  1. 如果 build ID 不存在,请在构建系统中添加 -Wl,--build-id 标志
    为了确保生成的每个二进制文件都包含 build ID,你需要在链接阶段添加 -Wl,--build-id 标志。

对于 CMake,你可以这样配置:

set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id")
对于 ndk-build,你可以在 Android.mk 文件中增加相应的 LOCAL_LDFLAGS:

LOCAL_LDFLAGS := -Wl,--build-id
这样,构建的目标库 (.so 文件) 将嵌入一个唯一的 build ID,保证 Crashlytics 能正确地关联符号文件和发生的崩溃。

总结操作步骤
在 build.gradle 文件中启用 nativeSymbolUploadEnabled。
构建应用并上传符号文件:
./gradlew app:assembleRelease
app:uploadCrashlyticsSymbolFileRelease
使用 readelf 工具验证生成的 .so 文件是否包含 GNU build ID。
如果 build ID 不存在,在构建配置中添加 -Wl,--build-id 标志。
通过这些步骤,即可确保 Firebase Crashlytics 能正确捕获并报告基于 JNI 的崩溃。

在firebase上可能会看见一些系统库 如libc.so 的崩溃日志,每个手机的libc.so 可能不一样,可以寻找尽量多的手机中的libc.so 到工程中制作符号表上传到后台,总有一个手机可以命中,一般libc.so 在 /system/lib/libc.so /system/lib64/libc.so 中

相关文章

网友评论

      本文标题:firbase 如果收集JNI奔溃信息

      本文链接:https://www.haomeiwen.com/subject/kpvrdjtx.html