Android 7.0 為原生程式庫引進了命名空間,以限制內部 API 的顯示設定,並解決應用程式不小心使用平台程式庫而非自己的程式庫的情況。請參閱「在 Android 7.0 中使用私人 C/C++ 符號限制提升穩定性」這篇 Android 開發人員網誌文章,瞭解應用程式專屬的變更。
建築
在 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
必須與列出程式庫名稱的文字檔案名稱中的 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 開始,供應商公開程式庫可放入供應商 APEX。封裝在供應商 APEX 中時,請在 APEX 資訊清單的 provideNativeLibs
屬性中列出程式庫。
更新應用程式,不要使用非公開原生資料庫
這項功能僅適用於指定 SDK 24 以上版本的應用程式;如需回溯相容性,請參閱表 1。應用程式連結至私人原生資料庫時的預期影響。 應用程式可存取的 Android 原生程式庫清單 (也稱為公開原生程式庫) 列於 CDD 的第 3.1.1 節。如果應用程式指定 24 以上版本為目標,且使用任何非公開程式庫,則應更新。詳情請參閱「連結至平台程式庫的 NDK 應用程式 」。
更新應用程式的原生程式庫依附元件
鎖定 SDK 31 (Android 12) 以上版本的應用程式,必須在應用程式資訊清單中使用 <uses-native-library>
標記,明確指定原生共用程式庫依附元件。如果裝置上沒有要求的程式庫的任何部分,應用程式就不會安裝。安裝應用程式時,系統會只提供應用程式要求的原生共用資料庫。也就是說,應用程式無法存取未顯示在應用程式資訊清單中的原生共用程式庫。