Android 系统中so文件的位置

2,550 阅读1分钟

举个例子,对于系统应用来说,这个 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需要使用,则需要修改声明。

jni无法访问so提示not accessible


Android 的 so 文件加载机制

www.cnblogs.com/l2rf/p/5973…

blog.csdn.net/k663514387/…