Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

本機庫的命名空間

Android 7.0引入了用於本機庫的名稱空間,以限制內部API的可見性,並解決當應用程序意外使用平台庫而不是平台庫最終導致的情況。有關特定於應用程序的更改,請參見Android 7.0中的使用私有C / C ++符號限制提高穩定性

建築

所做的更改將系統庫與應用程序庫分離,使偶然使用內部系統庫變得困難(反之亦然)。

本機庫的命名空間

圖1.本機庫的命名空間

本機庫的命名空間會阻止應用程序使用私有平台的本機API(與OpenSSL一樣)。它還可以消除應用程序意外使用平台庫而不是平台庫的情況(如libpng )。

添加其他本機庫

除了標準的公共本機庫,芯片供應商(從Android 7.0開始)和設備製造商(從Android 9開始)可以選擇提供其他可供應用訪問的本機庫,方法是將它們放置在相應的庫文件夾下並在.txt中明確列出文件。

庫文件夾為:

  • /vendor/lib (對於32位)和/vendor/lib64 (對於64位),用於來自芯片供應商的庫
  • /system/lib (對於32位)和/system/lib64 (對於64位),用於設備製造商的庫

.txt文件為:

  • /vendor/etc/public.libraries.txt用於芯片供應商的庫
  • /system/etc/public.libraries-COMPANYNAME.txt用於設備製造商提供的庫,其中COMPANYNAME指的是製造商的名稱(例如awesome.company )。 COMPANYNAME應該與[A-Za-z0-9_.-]+匹配;字母數字字符, _, 。 (點)和-。如果某些庫來自外部解決方案提供商,則設備中可能有多個這樣的.txt文件。

設備製造商公開的system分區中的本機庫必須命名為lib*COMPANYNAME.so ,例如libFoo.awesome.company.so 。換句話說,沒有公司名稱後綴的libFoo.so不得公開。該COMPANYNAME庫文件名必須與相匹配的COMPANYNAME在其中庫名稱列在txt文件名。

不得公開屬於AOSP的本地庫(默認情況下是公共的標準公共本地庫除外)。應用程序只能訪問芯片供應商或設備製造商添加的其他庫。

從Android 8.0開始,供應商公共庫具有以下附加限制和必需的設置:

  1. 供應商中的本機庫必須正確標記,以便應用可以訪問。如果任何應用程序(包括第三方應用程序)都要求訪問,則該庫必須在特定於供應商的file_contexts文件中標記為same_process_hal_file ,如下所示:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    其中libnative.so是本機庫的名稱。
  2. 該庫(直接或通過其依賴關係傳遞)不得依賴VNDK-SP和LLNDK庫以外的系統庫。 VNDK-SP和LLNDK庫的列表可以在development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv

更新應用程序以不使用非公共本機庫

僅針對以SDK版本24或更高版本為目標的應用程序啟用此功能;有關向後兼容性的信息,請參見表1。如果您的應用程序鏈接到私有本機庫,將會發生什麼 。 CDD第3.1.1節列出了可供應用訪問的Android本機庫(也稱為公共本機庫)的列表。定位到24或更高版本且使用任何非公共庫的應用程序應進行更新。有關更多詳細信息,請參見NDK Apps鏈接到平台庫