我目前正在开发一个Android应用程序,其中我使用了两个本地库:
- GStreamer
- baresip
在某些Android设备上,在特定的用例中,GStreamer本机库会使用以下堆栈使我的应用程序崩溃:
致命信号11(SIGSEV(,代码1(SEGV_MAPPER(,故障地址tid 2458中的0xaaaaaaaaaa(souphttpsrc0:sr(,pid 2334(application.id(
#05 pc 00000000000 e24a4/apex/com.android.runtime/lib64/bionic/libc.so(__pthread_start(void*(+36((构建ID:ceedff98da575de138b0c631 aceca44(
#06 pc 00000000000 83d98/apex/com.android.runtime/lib64/bionic/libc.so(__start_thread+64((构建ID:ceedff98da575de138b0c631aceca44(
我可以在logcat中看到这个问题,但不能在我的Firebase Crashlytics控制台中看到。为了了解NDK在我的应用程序中的崩溃,我想为NDK SDK实现Firebase Crashlytics。
我的应用程序包含两个口味维度:
- an";应用程序";在2个商店(playstore和一个自定义商店(上部署应用程序的维度
- en";"环境";维度(prod、staging、qa(
如果我添加了两个构建类型(调试和发布(,这意味着我有12个构建变体。
对于2〃;应用程序";维度,我使用不同版本的GStreamer库。GStreamer并没有直接构建到我的Android应用程序中,而是使用专门的NDK脚本来构建so文件。
baresip是使用cmake:构建到我的应用程序中的
externalNativeBuild
{
cmake
{
cFlags '-DHAVE_INTTYPES_H'
}
}
这里是我的项目结构:
project/
+- app/
|
+- src/
|
+- main/
|
+- ccp/
|
+- baresipenative.c
+- CMakeLists.txt
+- appFlavor1/
|
+ jniLibs/
|
+- arm64-v8a/
|
+- libc++_shared.so
+- libgstreamer_android.so
+- libgstreamernative.so
+- armeabi-v7a/
|
+- libc++_shared.so
+- libgstreamer_android.so
+- libgstreamernative.so
+- appFlavor2/
|
+ jniLibs/
|
+- arm64-v8a/
|
+- libc++_shared.so
+- libgstreamer_android.so
+- libgstreamernative.so
+- armeabi-v7a/
|
+- libc++_shared.so
+- libgstreamer_android.so
+- libgstreamernative.so
根据Firebase Crashlytics NDK SDK,我需要将firebaseCrashlytics
属性配置到build.gradle
文件中。
当我只配置nativeSymbolUploadEnabled
时,Crashlytics控制台中不会显示任何内容:
firebaseCrashlytics {
nativeSymbolUploadEnabled true
}
所以我想我还需要配置strippedNativeLibsDir
和unstrippedNativeLibsDir
属性,如下所示:
firebaseCrashlytics {
nativeSymbolUploadEnabled true
strippedNativeLibsDir 'path/to/stripped/parent/dir'
unstrippedNativeLibsDir 'path/to/unstripped/parent/dir'
}
如果我正确理解了文档,那么我应该将baresip构建文件的obj
目录的路径放入strippedNativeLibsDir
属性中?
在unstrippedNativeLibsDir
属性中,我应该输入GStreamer的so文件的路径?
提前感谢您的帮助!
为剥离和未剥离的库找到正确的路径本身就是一个完整的问题。根据你的问题,我不确定我们能否从你给出的项目结构中准确推断出要使用的目录!
通常,类似于../build/intermediates/cmake
的路径用于未剥离的库,而../build/intermediates/stripped_native_libs
用于剥离的库字段。
如果你正在使用CMake来构建你的原生库,为什么不尝试遵循这个快速教程呢?它有望引导你朝着正确的方向前进;您总是可以跳过阅读,直到最后解释有问题的lib目录。