从命令行构建 Crashlytics NDK 符号
Crashlytics NDK symbol building from command line
我正在尝试为我的 Android 项目添加 Crashlytics 支持,该项目使用 NDK 和 gradle CMake。这意味着我的共享项目需要符号。因此,如果我想为发布版本创建符号,我将调用 gradlew crashlyticsUploadSymbolsRelease
https://docs.fabric.io/android/crashlytics/ndk.html 中的官方文档说 符号生成和上传过程采用标准项目结构:src/main/obj 用于调试二进制文件,src/main/libs 用于发布由 ndk-build.
生成的二进制文件
在 gradle 文件中,这意味着一个新块,如下所示:
crashlytics {
enableNdk true
androidNdkOut 'src/main/obj'
androidNdkLibsOut 'src/main/libs'
}
因为我正在使用 gradle CMake 集成来构建我的本机库,所以默认路径当然不起作用。我的本机库在发布模式下内置到 build/intermediates/cmake/release/obj
目录中,在调试模式下它们转到 build/intermediates/cmake/debug/obj
目录。
通过反复试验,我发现如果我想让我的发布版本正常工作,我必须将发布模式本机库的路径放入两行中,如下所示。
crashlytics {
enableNdk true
androidNdkOut 'build/intermediates/cmake/release/obj'
androidNdkLibsOut 'build/intermediates/cmake/release/obj'
}
我真的不明白 androidNdkOut
和 androidNdkLibsOut
变量之间的区别,因为至少在我的场景中它们指向同一个目录。幸运的是,这对我来说不是问题,因为我只需要 Crashlytics 来处理我的发布二进制文件。
所以我的问题是:
1) androidNdkOut
和 androidNdkLibsOut
之间到底有什么区别?为什么我不能将我的调试二进制文件的路径放在一个路径中,并将二进制文件发布到另一个路径?除了解释之外,还有一个具体的例子。
2) 如果有一天我也想为我的调试库包含符号,我应该如何修改我的 gradle 文件?意思是命令
gradlew crashlyticsUploadSymbolsRelease
和 gradlew crashlyticsUploadSymbolsDebug
都行吗?
线程中对此进行了讨论 Crashlytics NDK symbols and Gradle tasks and 但他们确实没有回答这两个问题。
我在维护 Crashlytics NDK 支持的 Fabric 团队工作。
为了提供一些背景信息 - 我们的符号上传工具基于 ndk-build
过程,该过程会生成 2 组二进制文件:您的生产二进制文件,其中删除了符号数据,以及调试二进制文件,其中包含符号数据完整无缺,便于调试。
Gradle 属性映射到 ndk-build
进程中的变量,具体为:
androidNdkOut
是放置未剥离的调试二进制文件(相当于 ndk-build
中的 $NDK_OUT
变量)的目录,默认称为 obj
。
androidNdkLibsOut
是放置剥离的、发布二进制文件的目录(相当于 ndk-build
中的 $NDK_LIBS_OUT
变量)默认称为 libs
。
这些路径的预期内容是您的库的体系结构特定目录,例如:
obj/
— armeabi
— lib1.so
— lib2.so
— x86
— lib1.so
— lib2.so
libs/
— armeabi
— lib1.so
— lib2.so
— x86
— lib1.so
— lib2.so
要让我们的符号上传正常工作,您需要做的就是从 CMake 生成这些相同的二进制文件集,然后将您的 androidNdkOut
和 androidNdkLibsOut
设置为适当的顶层可以找到这些库的目录。
EDIT/UPDATE 2017 年 7 月 7 日
我们刚刚发布了 Gradle 的 Fabric 插件 1.23.0 版本,它支持在您使用 Android Gradle 插件时自动解析适当的本机库路径2.2.0+ 与 externalNativeBuild
DSL,因此如果您使用最新的 Android Gradle 插件,则不再需要设置 androidNdkOut
和 androidNdkLibsOut
。在此处查看更多信息:https://docs.fabric.io/android/crashlytics/ndk.html#specifying-the-path-to-debug-and-release-binaries
如果 mWillis 提到的自动检测对您不起作用,请检查隐藏的日志文件:
~/.crashlytics/com.crashlytics.tools/crashlytics.log
出于某种原因,google 并未向您指出这一点,而且 fabric.io 文档中似乎也缺少它。
我正在尝试为我的 Android 项目添加 Crashlytics 支持,该项目使用 NDK 和 gradle CMake。这意味着我的共享项目需要符号。因此,如果我想为发布版本创建符号,我将调用 gradlew crashlyticsUploadSymbolsRelease
https://docs.fabric.io/android/crashlytics/ndk.html 中的官方文档说 符号生成和上传过程采用标准项目结构:src/main/obj 用于调试二进制文件,src/main/libs 用于发布由 ndk-build.
生成的二进制文件在 gradle 文件中,这意味着一个新块,如下所示:
crashlytics {
enableNdk true
androidNdkOut 'src/main/obj'
androidNdkLibsOut 'src/main/libs'
}
因为我正在使用 gradle CMake 集成来构建我的本机库,所以默认路径当然不起作用。我的本机库在发布模式下内置到 build/intermediates/cmake/release/obj
目录中,在调试模式下它们转到 build/intermediates/cmake/debug/obj
目录。
通过反复试验,我发现如果我想让我的发布版本正常工作,我必须将发布模式本机库的路径放入两行中,如下所示。
crashlytics {
enableNdk true
androidNdkOut 'build/intermediates/cmake/release/obj'
androidNdkLibsOut 'build/intermediates/cmake/release/obj'
}
我真的不明白 androidNdkOut
和 androidNdkLibsOut
变量之间的区别,因为至少在我的场景中它们指向同一个目录。幸运的是,这对我来说不是问题,因为我只需要 Crashlytics 来处理我的发布二进制文件。
所以我的问题是:
1) androidNdkOut
和 androidNdkLibsOut
之间到底有什么区别?为什么我不能将我的调试二进制文件的路径放在一个路径中,并将二进制文件发布到另一个路径?除了解释之外,还有一个具体的例子。
2) 如果有一天我也想为我的调试库包含符号,我应该如何修改我的 gradle 文件?意思是命令
gradlew crashlyticsUploadSymbolsRelease
和 gradlew crashlyticsUploadSymbolsDebug
都行吗?
线程中对此进行了讨论 Crashlytics NDK symbols and Gradle tasks and
我在维护 Crashlytics NDK 支持的 Fabric 团队工作。
为了提供一些背景信息 - 我们的符号上传工具基于 ndk-build
过程,该过程会生成 2 组二进制文件:您的生产二进制文件,其中删除了符号数据,以及调试二进制文件,其中包含符号数据完整无缺,便于调试。
Gradle 属性映射到 ndk-build
进程中的变量,具体为:
androidNdkOut
是放置未剥离的调试二进制文件(相当于ndk-build
中的$NDK_OUT
变量)的目录,默认称为obj
。androidNdkLibsOut
是放置剥离的、发布二进制文件的目录(相当于ndk-build
中的$NDK_LIBS_OUT
变量)默认称为libs
。
这些路径的预期内容是您的库的体系结构特定目录,例如:
obj/
— armeabi
— lib1.so
— lib2.so
— x86
— lib1.so
— lib2.so
libs/
— armeabi
— lib1.so
— lib2.so
— x86
— lib1.so
— lib2.so
要让我们的符号上传正常工作,您需要做的就是从 CMake 生成这些相同的二进制文件集,然后将您的 androidNdkOut
和 androidNdkLibsOut
设置为适当的顶层可以找到这些库的目录。
EDIT/UPDATE 2017 年 7 月 7 日
我们刚刚发布了 Gradle 的 Fabric 插件 1.23.0 版本,它支持在您使用 Android Gradle 插件时自动解析适当的本机库路径2.2.0+ 与 externalNativeBuild
DSL,因此如果您使用最新的 Android Gradle 插件,则不再需要设置 androidNdkOut
和 androidNdkLibsOut
。在此处查看更多信息:https://docs.fabric.io/android/crashlytics/ndk.html#specifying-the-path-to-debug-and-release-binaries
如果 mWillis 提到的自动检测对您不起作用,请检查隐藏的日志文件:
~/.crashlytics/com.crashlytics.tools/crashlytics.log
出于某种原因,google 并未向您指出这一点,而且 fabric.io 文档中似乎也缺少它。