記 Firebase 上無(wú) NDK 符號(hào)表解決的過(guò)程
背景
在 項(xiàng)目上線之后,F(xiàn)irebase 的后臺(tái)收到音視頻上報(bào)的崩潰急前。在項(xiàng)目中音視頻以 so 文件的形式集成近項(xiàng)目。在后臺(tái)上報(bào)頁(yè)面,看不到符號(hào)表的匹配吱型。
而這個(gè) bug 占據(jù)了我們 bug 的 Top 1 位置笼平。
解決過(guò)程
第一步 重新檢查集成 Firebase 的過(guò)程
出現(xiàn)問(wèn)題的時(shí)候园骆,我們第一步是去官網(wǎng)重新看集成 Firebase 的過(guò)程
檢查了發(fā)現(xiàn)沒(méi)有問(wèn)題。
第二步 重新查看官網(wǎng)文檔
經(jīng)過(guò)第一步的檢查寓调,集成的步驟是沒(méi)有問(wèn)題的, 我們?cè)俅慰纯垂倬W(wǎng)文檔锌唾,有沒(méi)有新的發(fā)現(xiàn)。
在官網(wǎng)的 Get Android NDK crash reports 的這個(gè)章節(jié)發(fā)現(xiàn)了新的線索捶牢。
我們的音視頻 so 是自己開(kāi)發(fā)的鸠珠,用 gradle 的方式集成到工程里面。這個(gè)相當(dāng)于外部獨(dú)立的依賴(lài)秋麸,所以渐排,需要用 Firebase 提供的 unstrippedNativeLibsDir 的屬性上傳未剝離符號(hào)表的 so.
在第三步 Step 3(optinal): Upload symbols for external dependencies 中
// …
android {
// ...
buildTypes {
release {
firebaseCrashlytics {
nativeSymbolUploadEnabled true
unstrippedNativeLibsDir ‘path/to/unstripped/parent/dir’
}
}
}
}
并且需要對(duì)應(yīng)的 so 架構(gòu)
unstrippedNativeLibsDir/
+- x86/
|
+- libfoo.so
+- libbar.so
+- arm64/
|
+- libfoo.so
+- libbar.so
加了之后用命令執(zhí)行 task 上傳符號(hào)表
./gradlew app:assembleDebug app:uploadCrashlyticsSymbolFileDebug -debug | grep "\[com.google.firebase.crashlytics\]"
上面的命令跑了,之后發(fā)現(xiàn)我們上傳符號(hào)表失敗了灸蟆,是因?yàn)榫W(wǎng)絡(luò)的原因
第三步 Android Studio 配置代理上網(wǎng)
我們?cè)趪?guó)內(nèi)需要為 Android Studio 的 gradle 設(shè)置代理驯耻。
設(shè)置 Android Studio 的代理
查看 SS 的端口
設(shè)置代理
- 1.找到 HTTP Proxy 設(shè)置選項(xiàng)
- 2.選擇 Manual proxy configuration
- 3.填寫(xiě) ss 的 ip 和端口
- 4.檢測(cè)是否設(shè)置成功 check connection
輸入 google 的網(wǎng)址,檢測(cè)是否設(shè)置成功炒考,如果成功了可缚,會(huì)彈窗連接成功的彈窗
第四步 去 Firebas 的github 上看 issues
經(jīng)過(guò)上面三步還是不行,我們就去 Firebase 的 github 上看看其他人有沒(méi)有遇到同樣的問(wèn)題斋枢。
這里順便說(shuō)一句帘靡,如果是開(kāi)源的項(xiàng)目,遇到問(wèn)題瓤帚,查看它的 issues 也是解決問(wèn)題的切入點(diǎn)描姚,你遇到的問(wèn)題,別人也會(huì)遇到戈次,看看 issues 或許能找到解決辦法或者提示轩勘。
在 Firebase 的 issues 中搜索 ndk symbol,可以找到相關(guān) ndk 符號(hào)表的內(nèi)容怯邪。然后在一條中找到相關(guān)的內(nèi)容 Native crash reports missing symbol information (file name, line number, function name) #1978绊寻,有人也遇到相應(yīng)的問(wèn)題,就是在 Firebase 上沒(méi)有看到相應(yīng)的符號(hào)表。
他的解決辦法澄步,就是把已剝離和未剝離符號(hào)表的 so 都放到對(duì)于的目錄下冰蘑,用于上傳符號(hào)表
debug {
minifyEnabled false
signingConfig signingConfigs.debugsign
firebaseCrashlytics {
nativeSymbolUploadEnabled true
strippedNativeLibsDir 'nativelibs/stripped' // 剝離符號(hào)表的 so
unstrippedNativeLibsDir 'nativelibs/unstripped' // 未剝離符號(hào)表的 so
}
}
然后再執(zhí)行命令
./gradlew app:assembleDebug app:uploadCrashlyticsSymbolFileDebug -debug | grep "\[com.google.firebase.crashlytics\]"
這次命令執(zhí)行的結(jié)果顯示,上傳符號(hào)表成功了
Crashlytics symbol file uploaded successfully
經(jīng)過(guò)測(cè)試 native 的崩潰后,發(fā)現(xiàn)符號(hào)表打印是上傳成功了驮俗,但是還是沒(méi)有顯示出來(lái)懂缕。
到這來(lái),我們已經(jīng)沒(méi)有辦法王凑。為什么明明符號(hào)表已經(jīng)上傳成功了搪柑,但是還是解析不到呢。
第四步 配對(duì) So 和項(xiàng)目 NDK 版本
至此索烹,唯一的可能性是我們上傳的符號(hào)表和 native 的崩潰對(duì)不上工碾,導(dǎo)致 Firebase 無(wú)法解析。
通過(guò)一番查找百姓,發(fā)現(xiàn)我們構(gòu)建 SO 用的 NDK 版本是 19渊额, 構(gòu)建項(xiàng)目是的 NDK 是 21 版本。
我們將項(xiàng)目的 NDK 版本也改成 19垒拢。
最后發(fā)現(xiàn)可以了旬迹。
總結(jié)
上傳非工程直接編譯 so 的符號(hào)表
第一 按照官方文檔集成 Firebase
在項(xiàng)目級(jí)別的 build.gradle 中,添加 firebase
dependencies {
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'
}
在 app 的 build.gradle 中添加
apply plugin: 'com.google.firebase.crashlytics'
....
buildTypes {
release {
...
firebaseCrashlytics {
nativeSymbolUploadEnabled true
strippedNativeLibsDir 'nativelibs/stripped'
unstrippedNativeLibsDir 'nativelibs/unstripped'
}
}
debug {
...
firebaseCrashlytics {
nativeSymbolUploadEnabled true
strippedNativeLibsDir 'nativelibs/stripped'
unstrippedNativeLibsDir 'nativelibs/unstripped'
}
}
strippedNativeLibsDir 是放已經(jīng)剝離符號(hào)表的 so, unstrippedNativeLibsDir 是放未剝離符號(hào)表的 so
在 module 的 build.gradle 中添加依賴(lài)
dependencies {
// google 崩潰上報(bào)
implementation 'com.google.firebase:firebase-analytics-ktx:17.4.4'
// Add the Firebase Crashlytics SDK.
implementation 'com.google.firebase:firebase-crashlytics:17.1.1'
implementation 'com.google.firebase:firebase-crashlytics-ndk:17.1.1'
}
第二步 確保網(wǎng)絡(luò)沒(méi)有問(wèn)題
如果是在國(guó)內(nèi),要設(shè)置Android studio 代理上網(wǎng)
第三步 確保編譯 so 的 NDK 和項(xiàng)目的 NDK 版本一致
第三步 用命令行上傳符號(hào)表
用命令行上傳符號(hào)表
./gradlew app:assembleDebug app:uploadCrashlyticsSymbolFileDebug -debug | grep "\[com.google.firebase.crashlytics\]"
跑命令的時(shí)候觀察打印求类,如果打印出
Crashlytics symbol file uploaded successfully
則說(shuō)明已經(jīng)上傳成功
第四步 測(cè)試 bug
打開(kāi) firebase 的 log 打印
adb shell setprop log.tag.FirebaseCrashlytics DEBUG
adb logcat -s FirebaseCrashlytics