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在运行时动态加载函数,但你需要找出它到底包含在哪个模块中。