我正在为现有手机构建一个新的 Android 版本(11,基于 LineageOS),并希望包含引用为旧 Android 版本 (9) 构建的 JNI 库的系统应用程序。
到目前为止,我所做的是将原始 jni lib 复制到其原始位置,/system/lib64/libfoojni.so
并将应用程序作为预构建包含在 Android.mk 文件中:
include $(CLEAR_VARS)
LOCAL_MODULE := FooApp
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := proprietary/priv-app/FooApp/FooApp.apk
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_CLASS := APPS
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
到目前为止,这在升级到 Android 10 时有效,但对于 Android 11,libgui 和 libui 中的 ABI 中断会导致 libfoojni.so 导致崩溃。
据我了解 VNDK 设计,我应该能够将 VNDK 28 (Android 9) 甚至 VNDK 29 (Android 10) 版本的 libgui/libui 与 libfoojni.so 一起使用,但我不知道如何做到这一点。
作为libfoojni.so
供应商库并且仅由该应用程序使用,我可以将其复制到/vendor/lib64
甚至/system/priv-app/FooApp/lib/<arch>
相反,结果完全相同。
所以我的问题基本上是:
我如何告诉 Android 或构建系统libfoojni.so
或 FooApp.apk 通常应该使用版本 29 的 VNDK 库?
这甚至可能吗?
我尝试构建 libgui.so/libui.so 的修改版本,以恢复 ABI 重大更改并将其复制到/system/priv-app/FooApp/lib/<arch>
其中并取得了一些成功,即它们被使用并且所有工作但并非总是如此:有时使用系统版本代替。
我什至不确定这是否可能,据我了解 VNDK 设计所使用的库的不同版本(即命名空间)由加载它们的二进制文件的位置决定,并且 APK 由系统进程加载,因此将属于系统名称空间,不是吗?或者(以某种方式?)将 APK 声明为属于供应商命名空间就足够了吗?