Android 7.0 引入了本機庫的命名空間,以限制內部 API 可見性並解決應用程式意外使用平台庫而不是自己的庫的情況。有關特定於應用程式的更改,請參閱在 Android 7.0 Android 開發人員部落格文章中使用私有 C/C++ 符號限制提高穩定性。
建築學
在 Android 7.0 及更高版本中,系統庫與應用程式庫分離。
本機庫的命名空間會阻止應用程式使用私有平臺本機 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
必須與列出庫名稱的 txt 檔案名稱中的COMPANYNAME
相符。
屬於 AOSP 一部分的本機庫不得公開(預設為公開的標準公用本機庫除外)。應用程式只能存取晶片供應商或設備製造商添加的附加庫。
從 Android 8.0 開始,供應商公共庫具有以下附加限制和所需設定:
- 供應商中的本機庫必須正確標記,以便應用程式可以存取它。如果任何應用程式(包括第三方應用程式)需要訪問,則該庫必須在特定於供應商的
file_contexts
檔案中標記為same_process_hal_file
,如下所示:/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
,其中libnative.so
是本機庫的名稱。 - 該程式庫無論是直接或透過其依賴項傳遞,都不得依賴 VNDK-SP 和 LLNDK 庫之外的系統程式庫。在
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
中找到 VNDK-SP 和 LLNDK 庫的清單。
從 Android 15(AOSP 實驗性)開始,供應商公共庫可以放入供應商 APEX 。當打包在供應商 APEX 中時,在 APEX 清單的provideNativeLibs
屬性中列出庫。
更新應用程式以不使用非公用本機庫
僅針對 SDK 版本 24 或更高版本的應用程式啟用此功能;有關向後相容性,請參閱 表 1。 CDD 第 3.1.1 節中列出了應用程式可存取的 Android 本機程式庫(也稱為公用本機程式庫)的清單。應更新面向 24 或更高版本並使用任何非公共庫的應用程式。有關更多詳細信息,請參閱連結到平台庫的 NDK 應用程式。
更新應用程式的本機庫相依性
以 SDK 版本 31 (Android 12) 或更高版本的應用程式必須使用應用程式清單中的<uses-native-library>
標記明確指定其本機共用程式庫相依性。如果裝置上不存在所要求的庫的任何部分,則不會安裝該應用程式。安裝應用程式後,僅向它們提供它們請求的本機共用程式庫。這意味著應用程式無法存取未出現在應用程式清單中的本機共用程式庫。