Android 动态链接库隔离
转链接:Android 动态链接库隔离
相关问题:浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题
系统库共享
Treble架构将系统和应用分离,应用理论上只可以访问NDK提供的本地库和应用自带的本地库。但实际上应用也经常需要使用系统库,每个应用都将系统库打包到自己中未免太浪费了。所以Android还提供了应用访问系统库的方法,通过public.libraries.txt设置白名单。
将本地系统库的名字加入到public.libraries.txt,可以开放给应用。本地系统库放置的位置为,
- /vendor/lib(芯片供应商的 32 位库)和 /vendor/lib64(芯片供应商的 64 位库)
- /system/lib(设备制造商的 32 位库)和 /system/lib64(设备制造商的 64 位库)
public.libraries.txt存在多个文件,分别代表不同的意义:
- /vendor/etc/public.libraries.txt(芯片供应商的库)。
- /system/etc/public.libraries-COMPANYNAME.txt(设备制造商的库),其中 COMPANYNAME 指的是制造商的名称(例如 awesome.company)。如果某些库来自外部解决方案提供商,则可以在设备中包含多个此类 .txt 文件。
- /system/etc/public.libraries.txt(标准公共本地库),原生代码system/core/rootdir/etc/中的文件,理论上不应该修改。
注意:由设备制造商公开的本地库必须命名为 lib*COMPANYNAME.so,例如 libFoo.awesome.company.so。换句话说,没有公司名称后缀的 libFoo.so 不得公开。库文件名中的 COMPANYNAME 必须与列出库名称的 txt 文件的名称中的 COMPANYNAME 匹配。
从 Android 8.0 开始,供应商的本地库需要遵循以下额外限制,需要进行相应设置:
- 必须给供应商的本地库赋予适当的权限,以便应用可以访问。如过有任何应用(包括第三方应用)要求访问一个供应商的本地库,则该库必须在供应商特定的 file_contexts中被标记为same_process_hal_file。例如,设置libnative.so权限以供应用使用,
/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
- 库不得依赖(无论是直接依赖,还是通过其依赖项间接依赖)VNDK-SP 库和 LLNDK 库之外的任何系统库。您可以在 development/vndk/tools/definition/tool/datasets/eligible-list–release.csv 中找到 VNDK-SP 库和 LLNDK 库的列表。