Android 11 JNI 禁用 fdsan
Android 11 JNI disable fdsan
我有一个使用带有本机库的库的应用程序,现在 Android 11 由于 fdsan 而崩溃。
我已经联系了库提供者,但他们不会提供新版本的库来解决这个问题,所以我需要能够以某种方式禁用 fdsan。
我认为解决方案是在 Android 11 或更高时调用:
if(android_get_device_api_level()>=30)
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
但是由于错误我无法编译:
use of undeclared identifier 'android_fdsan_set_error_level'
因为这是在 Android 10 (API 29)
中才添加的
所以我的问题是如何在我的项目中调用这个函数?
我正在为此创建一个特定的 cpp 文件和一个特定的库,因此我需要了解该库如何说明它仅适用于 Android 10 或更高版本。
cpp 文件或 Android.mk 文件中是否有一些定义,我可以使用它来编译这个特定的库,我将从 Android 11 或更高版本中的 Java 调用仅当我的应用启动了吗?
根据文档 here 你应该这样做:
if (android_fdsan_set_error_level) {
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
}
您必须将目标 SDK 设置为 10 或更高版本才能正常工作。
或者,如果您将其编译成单独的本机二进制文件,则可以使用条件编译。
包括 this 个文件。
然后做这样的事情:
#if __ANDROID_API__ >= __ANDROID_API_P__
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
#endif
只需确保此二进制文件从未加载到旧设备上,否则链接器会出错。
根据您整个项目的构建方式,您可能需要为此打包提供一个单独的 APK。
最后,如果一切都失败了,你可以尝试使用dlopen
and dlsym
在运行时动态加载函数,但你需要找出它到底包含在哪个模块中。
我有一个使用带有本机库的库的应用程序,现在 Android 11 由于 fdsan 而崩溃。
我已经联系了库提供者,但他们不会提供新版本的库来解决这个问题,所以我需要能够以某种方式禁用 fdsan。
我认为解决方案是在 Android 11 或更高时调用:
if(android_get_device_api_level()>=30)
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
但是由于错误我无法编译:
use of undeclared identifier 'android_fdsan_set_error_level'
因为这是在 Android 10 (API 29)
中才添加的所以我的问题是如何在我的项目中调用这个函数? 我正在为此创建一个特定的 cpp 文件和一个特定的库,因此我需要了解该库如何说明它仅适用于 Android 10 或更高版本。 cpp 文件或 Android.mk 文件中是否有一些定义,我可以使用它来编译这个特定的库,我将从 Android 11 或更高版本中的 Java 调用仅当我的应用启动了吗?
根据文档 here 你应该这样做:
if (android_fdsan_set_error_level) {
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
}
您必须将目标 SDK 设置为 10 或更高版本才能正常工作。
或者,如果您将其编译成单独的本机二进制文件,则可以使用条件编译。
包括 this 个文件。
然后做这样的事情:
#if __ANDROID_API__ >= __ANDROID_API_P__
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
#endif
只需确保此二进制文件从未加载到旧设备上,否则链接器会出错。
根据您整个项目的构建方式,您可能需要为此打包提供一个单独的 APK。
最后,如果一切都失败了,你可以尝试使用dlopen
and dlsym
在运行时动态加载函数,但你需要找出它到底包含在哪个模块中。