举个例子,对于系统应用来说,这个 nativeLibraryDir 值有可能最后是 /system/lib/xxx,也有可能是 system/app/xxx/lib 等等;而对于三方应用来说,这值有可能就是 data/app/xxx/lib;
以上可以从预置应用和直接安装应用角度分析:
如果是直接安装应用 install so文件会在 data/app/xxx/lib下; 如果是预置应用 push reboot 安装则会在system/lib/xxx/下;
push安装
legacyNativeLibraryDir=/system/lib/yk10013600_10.0.1.1_dangbei
install 安装
legacyNativeLibraryDir=/data/app/~~VbJ-9jMupnKnHhSJOoKP-w==/com.cibn.tv-zp6wMtJjmApq2TRvMspAAg==/lib
adb shell dumpsys package xxxxxx | grep legacyNativeLibraryDir
为什么要在mk指定预置so?
如果用LOCAL_PREBUILT_JNI_LIBS 在mk 中指定 so文件在system/app/lib下 我的理解指定 是为了避免多个预置app 公用库的时候混乱 或者没必要变成公共库
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi/libtest.so \
@lib/armeabi/libtest2.so
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
LOCAL_PREBUILT_JNI_LIBS 声明后的作用推测是编译对应的so 到out/xxx/system/app/lib/下面
什么时候需要public.libraries.txt?
对于三方app 需要使用系统公共so时 需要声明公有so库
system/core/rootdir/etc/public.libraries.txt
我的理解适用于做平台定制放了一些so在system/lib里边,这个时候其他app需要使用,则需要修改声明。