工具安裝
如果你的終端提示找不到 brew重窟,這意味著 Homebrew 還沒(méi)有正確安裝或者它沒(méi)有被添加到你的 PATH 環(huán)境變量中载萌。以下是確保 Homebrew 安裝并能夠正確使用的步驟:
- 安裝 Homebrew
首先惧财,按照以下命令安裝 Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
這段命令會(huì)下載并運(yùn)行 Homebrew 的安裝腳本。安裝過(guò)程中可能需要你輸入管理員密碼扭仁。
- 將 Brew 添加到 PATH 變量
安裝完成后垮衷,Homebrew 會(huì)給出一些關(guān)于如何將其路徑添加到你的 ~/.zshrc 或 ~/.zprofile 的提示。你可以手動(dòng)添加下面的行到你的 ~/.zshrc 或 ~/.zprofile 文件中(假設(shè)你使用的是 zsh乖坠,這是 macOS 的默認(rèn) shell):
echo 'eval "(/opt/homebrew/bin/brew shellenv)"
這兩行命令會(huì)將 Homebrew 添加到你的 PATH 環(huán)境變量中并立即生效搀突。
- 確認(rèn)安裝
重新啟動(dòng)終端或者運(yùn)行以下命令將配置文件重新加載:
source ~/.zprofile
然后,驗(yàn)證 Homebrew 是否安裝成功:
brew --version
如果一切正常熊泵,你應(yīng)該能看到 Homebrew 的版本信息仰迁。
- 安裝 GNU Binutils
使用 Homebrew 來(lái)安裝 binutils 包甸昏,其中包含 readelf 工具:
brew install binutils
安裝完成后,readelf 工具通常會(huì)被安裝到 /opt/homebrew/opt/binutils/bin 目錄徐许。
- 使用和配置 readelf
現(xiàn)在你可以使用完整路徑來(lái)調(diào)用 readelf:
/opt/homebrew/opt/binutils/bin/readelf -n path/to/your/native/library.so
如果想要更方便地使用 readelf施蜜,可以將其添加到你的 PATH 環(huán)境變量中:
echo 'export PATH="/opt/homebrew/opt/binutils/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
開(kāi)始行動(dòng)
- 確保在模塊(應(yīng)用級(jí))Gradle 文件中將 nativeSymbolUploadEnabled 設(shè)置為 true
要啟用符號(hào)文件的自動(dòng)上傳,你需在 build.gradle 文件中進(jìn)行配置雌隅。
android {
// ...
buildTypes {
release {
// Enable the Crashlytics mapping file upload process
firebaseCrashlytics {
nativeSymbolUploadEnabled true
}
}
}
}
這里的 nativeSymbolUploadEnabled 選項(xiàng)確保 Firebase Crashlytics 插件在構(gòu)建時(shí)自動(dòng)處理 NDK 符號(hào)文件翻默。
- 在每次構(gòu)建 NDK 庫(kù)后明確調(diào)用 uploadCrashlyticsSymbolFileBUILD_VARIANT 任務(wù)
為了確保符號(hào)文件(symbol files)正確上傳,需要在每次構(gòu)建后調(diào)用 uploadCrashlyticsSymbolFile 任務(wù)恰起。
假設(shè)你的構(gòu)建變體是 release修械,你需要運(yùn)行以下命令:
./gradlew app:assembleRelease
app:uploadCrashlyticsSymbolFileRelease
這條命令會(huì)完成以下步驟:
assembleRelease:構(gòu)建 release 變體。
uploadCrashlyticsSymbolFileRelease:上傳構(gòu)建過(guò)程中生成的符號(hào)文件检盼。
- 驗(yàn)證二進(jìn)制文件中是否存在 GNU build ID
Crashlytics 依賴(lài) GNU build ID 來(lái)關(guān)聯(lián)符號(hào)文件和崩潰報(bào)告肯污。你可以使用 readelf 工具來(lái)檢查你的 .so 文件是否包含 build ID。
運(yùn)行以下命令:
readelf -n path/to/your/library.so
如果輸出包含一個(gè)類(lèi)似 Build ID 的字段梯皿,說(shuō)明你的二進(jìn)制文件包含 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
- 如果 build ID 不存在,請(qǐng)?jiān)跇?gòu)建系統(tǒng)中添加 -Wl,--build-id 標(biāo)志
為了確保生成的每個(gè)二進(jìn)制文件都包含 build ID东羹,你需要在鏈接階段添加 -Wl,--build-id 標(biāo)志剂桥。
對(duì)于 CMake,你可以這樣配置:
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id")
對(duì)于 ndk-build属提,你可以在 Android.mk 文件中增加相應(yīng)的 LOCAL_LDFLAGS:
LOCAL_LDFLAGS := -Wl,--build-id
這樣权逗,構(gòu)建的目標(biāo)庫(kù) (.so 文件) 將嵌入一個(gè)唯一的 build ID,保證 Crashlytics 能正確地關(guān)聯(lián)符號(hào)文件和發(fā)生的崩潰冤议。
總結(jié)操作步驟
在 build.gradle 文件中啟用 nativeSymbolUploadEnabled斟薇。
構(gòu)建應(yīng)用并上傳符號(hào)文件:
./gradlew app:assembleRelease
app:uploadCrashlyticsSymbolFileRelease
使用 readelf 工具驗(yàn)證生成的 .so 文件是否包含 GNU build ID。
如果 build ID 不存在恕酸,在構(gòu)建配置中添加 -Wl,--build-id 標(biāo)志堪滨。
通過(guò)這些步驟,即可確保 Firebase Crashlytics 能正確捕獲并報(bào)告基于 JNI 的崩潰蕊温。
在firebase上可能會(huì)看見(jiàn)一些系統(tǒng)庫(kù) 如libc.so 的崩潰日志袱箱,每個(gè)手機(jī)的libc.so 可能不一樣,可以尋找盡量多的手機(jī)中的libc.so 到工程中制作符號(hào)表上傳到后臺(tái)义矛,總有一個(gè)手機(jī)可以命中发笔,一般libc.so 在 /system/lib/libc.so /system/lib64/libc.so 中