原生資料庫的命名空間

Android 7.0 為原生程式庫推出了命名空間,藉此限制內部 API 顯示並解決應用程式意外使用平台的情況 而非自己的程式庫請參閱 Android 7.0 中的私人 C/C++ 符號限制穩定性 在開發人員網誌文章中瞭解應用程式專屬變更。

建築

在 Android 7.0 以上版本中,系統程式庫與應用程式程式庫各自獨立。

原生資料庫的命名空間

圖 1. 原生資料庫的命名空間。

原生程式庫的命名空間可防止應用程式使用私人平台原生內容 與 OpenSSL 相同。同時也能移除應用程式本身 意外使用平台程式庫 (如您所見) 透過 libpng)。應用程式程式庫難以在內部使用 終止系統程式庫 (反之亦然)。

新增其他原生資料庫

除了標準公用原生資料庫外,晶片供應商 (自 Android 7.0 以上版本) 和 裝置製造商 (從 Android 9 開始) 可能會選擇提供額外的原生資料庫 將項目放在各個程式庫資料夾下,並明確列出應用程式,即可存取應用程式 檔案。

程式庫資料夾如下:

  • /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 檔案名稱。

屬於 Android 開放原始碼計畫的原生程式庫「不得」對外公開 (標準除外) 公開的原生原生資料庫)。僅限由 也能讓應用程式存取晶片供應商或裝置製造商

從 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

從 Android 15 開始,供應商公開程式庫可放在 供應商 APEX。封裝在廠商 APEX 中時,請列出程式庫 。provideNativeLibs

更新應用程式,不要使用非公開原生資料庫

只有指定 SDK 24 以上版本的應用程式可使用這項功能。 如要瞭解回溯相容性,請參閱表格 1.應用程式連結至私人原生資料庫時的預期影響。 應用程式可存取的 Android 原生資料庫清單 ( CDD 第 3.1.1 節已列入公開原生資料庫。指定 24 或 ,並使用任何非公開程式庫進行更新。詳情請參閱 NDK 連結至平台程式庫的應用程式 瞭解詳情。

更新應用程式來取得原生程式庫依附元件

如果應用程式指定 SDK 31 (Android 12) 以上版本,就必須 明確指定原生共用程式庫依附元件,方法是使用 應用程式資訊清單中的 <uses-native-library> 標記。如果請求的任何部分 裝置上沒有媒體庫,因此裝置上找不到該應用程式。應用程式安裝完成後 「只」提供所要求原生共用資料庫。也就是說 應用程式無法存取應用程式資訊清單中未顯示的原生共用程式庫。