Android設備製造商出於各種原因更改了AOSP庫的源代碼。一些供應商在AOSP庫中重新實現功能以提高性能,而其他供應商向AOSP庫中添加了新的掛鉤,新的API或新的功能。本節提供了以不破壞CTS / VTS的方式擴展AOSP庫的準則。
即插即用替換
所有修改後的共享庫都必須是二進制兼容的AOSP對等物的直接替代品。所有現有的AOSP用戶必須能夠使用修改後的共享庫而無需重新編譯。此要求意味著以下內容:
- 不得刪除AOSP功能。
- 如果此類結構向用戶公開,則不得對其進行更改。
- 功能的前提條件不能加強。
- 功能必須提供等效的功能。
- 功能的後置條件不能弱化。
擴展模塊分類
根據模塊定義和使用的功能對其進行分類。
注意:此處使用功能代替API / ABI,因為可以在不更改任何API / ABI的情況下添加功能。
根據模塊中定義的功能,模塊可以分為DA-Module和DX-Module :
- 僅定義AOSP模塊(DA-Module)未定義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-Module和UX-Module 。
- 僅使用AOSP模塊(UA-Module)在其實現中僅使用AOSP功能。他們不依賴任何非AOSP擴展。
- 示例1.完整的未經修改的AOSP庫是UA-Module。
- 示例2.如果修改後的共享庫
libjpeg.so
僅依賴於其他AOSP API,則它將是UA-Module。
- 使用擴展模塊(UX-Module)在其實現中依賴於某些非AOSP功能。
- 示例1.如果修改後的
libjpeg.so
依賴於另一個名為libjpeg_turbo2.so
非AOSP庫,那麼修改後的libjpeg.so
將是一個UX-Module。 - 實施例2如果供應商增加了一個新的功能,以它們的改性
libexif.so
和它們的改性libjpeg.so
用途新添加的從功能libexif.so
,然後它們的改性libjpeg.so
將是一個UX-模塊。
- 示例1.如果修改後的
定義和用法彼此獨立:
二手功能 | |||
---|---|---|---|
僅AOSP(UA) | 擴展(UX) | ||
定義的功能 | 僅AOSP(DA) | 達阿 | 達克斯 |
擴展(DX) | DXUA | DXUX |
VNDK擴展機制
依賴擴展功能的供應商模塊將無法工作,因為具有相同名稱的AOSP庫沒有擴展功能。如果供應商模塊直接或間接依賴於擴展功能,則供應商應將DAUX,DXUA和DXUX共享庫複製到供應商分區(供應商進程始終首先在供應商分區中尋找共享庫)。但是,不得複制LL-NDK庫,因此供應商模塊不得依賴修改後的LL-NDK庫定義的擴展功能。
如果相應的AOSP庫可以提供相同的功能,並且當系統分區被通用系統映像(GSI)覆蓋時,供應商模塊繼續工作,則DAUA共享庫可以保留在系統分區上。
插入替換非常重要,因為在發生名稱衝突時,GSI中未修改的VNDK庫將與修改後的共享庫鏈接。如果以不兼容的API / ABI方式修改AOSP庫,則GSI中的AOSP庫可能無法鏈接或導致未定義的行為。