在android N上使用 .so作为apk的第三方库的时候,会发生java.lang.UnsatisfiedLinkError
本项目中方案:
一,将SO库放在vendor/app/lib64目录下
二,增加SO库,预编译到out/vendor目录
增加Android.mk文件,如下:
######## automatic generated
LOCAL_PATH := $(call my-dir)
## xxx_Browser.apk
include $(CLEAR_VARS)
LOCAL_MODULE := xxx_Browser
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := app/$(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_APPS)
#LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/app/$(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libtensorflowlite_jnidd
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_STRIP_MODULE := false
LOCAL_MULTILIB := 64
LOCAL_MODULE_OWNER := qcom
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := app/lib64/libtensorflowlite_jnidd.so
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)/lib64
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_PREBUILT)
而且还得增加:
同样需要修改device.mk,把需要打包的文件添加到变量PRODUCT_PACKAGES中:
PRODUCT_PACKAGES += \
或者 直接copy进out目录中:
可以修改device.mk中的PRODUCT_COPY_FILES
三,修改vendor/qcom/proprietrary/common/config/public.libraries.txt文件,公布出去,增加如下
libtensorflowlite_jnidd.so
Android N 版本有个新feature,就是普通应用不能直接引用系统的一些so库了,只能直接引用public.libraries.txt文件中过滤的so库
编译后查看out目录下vendor/etc/public.libraries.txt是否存在。
四,以上三步就修改完成,在调用SO库中出现Selinux问题,参考我另外一篇专门讲解Selinux权限问题
另外,如果要将libxxx.so加入到system/lib 或者system/lib64中
1,可以修改device.mk中的PRODUCT_COPY_FILES 直接在编译的时候copy进system/lib64
2,并且需要修改system/core/rootdir/etc/public.libraries.android.txt,增加该libxxx.so
这同样处理后,在开机时zygote初始化时preload lib时会找不到libxxx.so的问题,,(奇怪只有加到public.libraries.android.txt中的so,zygote需preload ?)
经过分析:因缺少32bit so,导致开始zygote 32bit preload crash,解决方法:
同时预置32位和64位so文件至system/lib和system/lib64中,解决
另外一个方法,将系统修改为只支持64位,修改该文件:core_64_bit.mk,去掉32位的支持,也将导致不支持32位apk