Android本地库命名空间

Android 7.0 推出了本地库的命名空间,其目的是限制内部 API 可见性,并解决应用在使用平台库时意外终止的问题。本地库命名空间的架构如下图所示,

Android本地库命名空间_第1张图片

从架构上可以看出:

  • 系统库与应用库被分离开来,彼此不能交叉使用。
  • 系统进程和应用都可以访问NDK库。
  • 应用很可能使用与系统库同名的私有库,这种设计避免了应用使用错误库而导致的意外。

但是,应用也经常需要使用系统库,每个应用都将系统库打包到自己中未免太浪费了。所以Android还提供了应用访问系统库的方法,通过public.libraries.txt设置白名单。

本地系统库由芯片供应商和设备制造商提供,它们放置的位置为,

  • /vendor/lib(芯片供应商的 32 位库)和 /vendor/lib64(芯片供应商的 64 位库)
  • /system/lib(设备制造商的 32 位库)和 /system/lib64(设备制造商的 64 位库)

将本地系统库的名字加入到public.libraries.txt,就可以开放给应用来使用。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 开始,供应商的本地库需要遵循以下额外限制,需要进行相应设置:

  1. 必须给供应商的本地库赋予适当的权限,以便应用可以访问。如过有任何应用(包括第三方应用)要求访问一个供应商的本地库,则该库必须在供应商特定的 file_contexts中被标记为same_process_hal_file。例如,设置libnative.so权限以供应用使用,

    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
  2. 库不得依赖(无论是直接依赖,还是通过其依赖项间接依赖)VNDK-SP 库和 LLNDK 库之外的任何系统库。您可以在 development/vndk/tools/definition/tool/datasets/eligible-list--release.csv 中找到 VNDK-SP 库和 LLNDK 库的列表。

参考文档:

Namespaces for Native Libraries

你可能感兴趣的:(android)