本地庫的命名空間

Android 7.0 為原生庫引入了命名空間,以限制內部 API 可見性並解決應用意外使用平台庫而不是自己的平台庫的情況。見與安卓7.0專用的C / C ++符號的限制提高穩定性Android開發者博客中特定於應用程序的變化。

建築學

在 Android 7.0 及更高版本中,系統庫與應用程序庫是分開的。

本機庫的命名空間

圖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. 供應商中的本機庫必須正確標記,以便應用程序可以訪問它。如果任何應用程序(包括第三方應用程序)所需的訪問,該庫必須標示為same_process_hal_file於供應商的特定file_contexts文件,如下所示:
    /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應用程序鏈接到平台庫的更多細節。

更新應用程序的本機庫依賴項

應用程序該目標SDK版本31(的Android 12)或更高必須明確,通過使用指定它們的本機共享庫依賴<uses-native-library>在應用清單標籤。如果設備上不存在所請求庫的任何部分,則不會安裝該應用程序。當安裝應用程序,他們具有他們所要求的本地共享庫。這意味著應用程序無法訪問未出現在應用程序清單中的本機共享庫。