Android 裝置製造商會基於各種原因變更 AOSP 程式庫的原始碼。部分供應商會重新實作 AOSP 程式庫中的函式,以提升效能,而其他供應商則會在 AOSP 程式庫中新增鉤子、API 或功能。本節提供延伸 AOSP 程式庫的規範,以免破壞 CTS/VTS。
直接取代
所有經過修改的共用程式庫都必須與二進位檔相容,並且可直接取代對應的 AOSP 程式庫。所有現有的 AOSP 使用者都必須能夠使用經過修改的共用程式庫,而無須重新編譯。這項規定暗示以下事項:
- 不得移除 AOSP 函式。
- 如果結構體會公開給使用者,則不得變更這些結構體。
- 函式的前置條件不得強化。
- 函式必須提供等同的功能。
- 函式的後置條件不得減弱。
擴充模組分類
依據模組定義和使用的功能進行分類。
注意:此處使用「功能」而非「API/ABI」,是因為可以新增功能,而無須變更任何 API/ABI。
視模組中定義的功能而定,模組可分為 DA-Module 和 DX-Module:
-
僅定義 AOSP 模組 (DA 模組) 不會定義 AOSP 對應項目中沒有的新功能。
- 範例 1:完整且未經修改的 AOSP 程式庫就是 DA 模組。
- 範例 2:如果供應商使用 SIMD 指令重寫
libcrypto.so
中的函式 (不新增新函式),則經過修改的libcrypto.so
會是 DA 模組。
-
定義擴充功能模組 (DX-Module) 會定義新功能,或沒有 AOSP 對應項目。
- 範例 1:如果供應商在
libjpeg.so
中加入輔助函式,以便存取某些內部資料,則經過修改的libjpeg.so
會是 DX-Lib,而新加入的函式則是程式庫的擴充部分。 - 範例 2:如果供應商定義名為
libfoo.so
的非 AOSP 程式庫,libfoo.so
就會是 DX-Lib。
- 範例 1:如果供應商在
根據模組使用的功能,模組可分為 UA 模組和 UX 模組。
-
僅使用 AOSP 模組 (UA-Module) 只會在實作中使用 AOSP 功能。且不依賴任何非 AOSP 擴充功能。
- 範例 1:完整且未經修改的 AOSP 程式庫是 UA 模組。
- 範例 2:如果經過修改的共用程式庫
libjpeg.so
只依附其他 AOSP API,則會是 UA 模組。
-
使用擴充功能模組 (UX-Module) 會在實作中使用部分非 AOSP 功能。
- 範例 1:如果經過修改的
libjpeg.so
依賴另一個名為libjpeg_turbo2.so
的非 AOSP 程式庫,則經過修改的libjpeg.so
會是 UX 模組。 - 範例 2:如果供應商在修改過的
libexif.so
中新增函式,且修改過的libjpeg.so
使用libexif.so
中新增的函式,則修改過的libjpeg.so
就是 UX 模組。
- 範例 1:如果經過修改的
定義和用法彼此獨立:
使用的功能 | |||
---|---|---|---|
僅限 Android 開放原始碼計畫 (通用 Analytics) | 延伸 (使用者體驗) | ||
定義的功能 | 僅限 Android 開放原始碼計畫 (DA) | DAUA | DAUX |
延伸 (DX) | DXUA | DXUX |
VNDK 擴充功能機制
供應商模組依賴的擴充功能無法運作,因為同名 AOSP 程式庫沒有擴充功能。如果供應商模組直接或間接依附於擴充功能,供應商應將 DAUX、DXUA 和 DXUX 共用程式庫複製到供應商分區 (供應商程序一律會先在供應商分區中尋找共用程式庫)。不過,請勿複製 LL-NDK 程式庫,供應商模組也不應仰賴經過修改的 LL-NDK 程式庫所定義的擴充功能。
如果對應的 AOSP 程式庫可提供相同功能,且供應商模組在系統分區遭到一般系統映像檔 (GSI) 覆寫時仍能繼續運作,DAUA 共用程式庫便可保留在系統分區。
由於 GSI 中未經修改的 VNDK 程式庫會在名稱衝突時連結至經過修改的共用程式庫,因此使用即時替換功能十分重要。如果 AOSP 程式庫以 API/ABI 不相容的方式修改,GSI 中的 AOSP 程式庫可能會連結失敗,或導致未定義的行為。