Các nhà sản xuất thiết bị Android thay đổi mã nguồn của thư viện AOSP vì nhiều lý do. Một số nhà cung cấp triển khai lại các hàm trong thư viện AOSP để tăng hiệu suất, trong khi các nhà cung cấp khác thêm các trình nối, API hoặc chức năng mới vào thư viện AOSP. Phần này cung cấp các nguyên tắc để mở rộng thư viện AOSP theo cách không vi phạm CTS/VTS.
Thay thế thả vào
Tất cả thư viện dùng chung đã sửa đổi phải tương thích nhị phân, thay thế trực tiếp cho thư viện tương ứng trong AOSP. Tất cả người dùng AOSP hiện tại phải có thể sử dụng thư viện dùng chung đã sửa đổi mà không cần biên dịch lại. Yêu cầu này ngụ ý những điều sau:
- Không được xoá các hàm AOSP.
- Bạn không được thay đổi cấu trúc nếu cấu trúc đó hiển thị với người dùng.
- Không được tăng cường điều kiện tiên quyết của các hàm.
- Các hàm phải cung cấp chức năng tương đương.
- Không được làm suy yếu điều kiện sau của các hàm.
Phân loại mô-đun mở rộng
Phân loại các mô-đun theo chức năng mà chúng xác định và sử dụng.
Lưu ý: Chức năng được dùng ở đây thay vì API/ABI vì bạn có thể thêm chức năng mà không cần thay đổi API/ABI nào.
Tuỳ thuộc vào chức năng được xác định trong mô-đun, mô-đun có thể được phân loại thành DA-Module (Mô-đun DA) và DX-Module (Mô-đun DX):
-
Mô-đun chỉ xác định AOSP (DA-Module) không xác định các chức năng mới không có trong đối tác AOSP.
- Ví dụ 1. Thư viện AOSP nguyên vẹn chưa sửa đổi là một mô-đun DA.
- Ví dụ 2. Nếu nhà cung cấp viết lại các hàm trong
libcrypto.so
bằng hướng dẫn SIMD (mà không thêm hàm mới), thìlibcrypto.so
đã sửa đổi sẽ là Mô-đun DA.
-
Mô-đun xác định tiện ích (DX-Module) xác định các chức năng mới hoặc không có đối tác AOSP.
- Ví dụ 1. Nếu một nhà cung cấp thêm một hàm trợ giúp vào
libjpeg.so
để truy cập vào một số dữ liệu nội bộ, thìlibjpeg.so
đã sửa đổi sẽ là một DX-Lib và hàm mới thêm sẽ là phần mở rộng của thư viện. - Ví dụ 2. Nếu nhà cung cấp xác định một thư viện không phải AOSP có tên là
libfoo.so
, thìlibfoo.so
sẽ là một DX-Lib.
- Ví dụ 1. Nếu một nhà cung cấp thêm một hàm trợ giúp vào
Tuỳ thuộc vào chức năng mà mô-đun sử dụng, mô-đun có thể được phân loại thành Mô-đun UA và Mô-đun UX.
-
Chỉ sử dụng mô-đun AOSP (UA-Module) chỉ sử dụng các chức năng AOSP trong quá trình triển khai. Các ứng dụng này không dựa vào bất kỳ tiện ích nào không phải AOSP.
- Ví dụ 1. Thư viện AOSP nguyên vẹn chưa sửa đổi là một mô-đun UA.
- Ví dụ 2. Nếu một thư viện dùng chung đã sửa đổi
libjpeg.so
chỉ dựa vào các API AOSP khác, thì đó sẽ là một Mô-đun UA.
-
Using-Extension Modules (UX-Module) (Sử dụng mô-đun tiện ích) dựa vào một số chức năng không phải AOSP trong quá trình triển khai.
- Ví dụ 1. Nếu
libjpeg.so
đã sửa đổi dựa vào một thư viện không phải AOSP khác có tên làlibjpeg_turbo2.so
, thìlibjpeg.so
đã sửa đổi sẽ là một Mô-đun trải nghiệm người dùng. - Ví dụ 2. Nếu một nhà cung cấp thêm một hàm mới vào
libexif.so
đã sửa đổi vàlibjpeg.so
đã sửa đổi sử dụng hàm mới thêm từlibexif.so
, thìlibjpeg.so
đã sửa đổi sẽ là một Mô-đun trải nghiệm người dùng.
- Ví dụ 1. Nếu
Định nghĩa và cách sử dụng độc lập với nhau:
Chức năng đã sử dụng | |||
---|---|---|---|
Chỉ AOSP (UA) | Mở rộng (UX) | ||
Chức năng được xác định | Chỉ AOSP (DA) | DAUA | DAUX |
Mở rộng (DX) | DXUA | DXUX |
Cơ chế mở rộng VNDK
Các mô-đun của nhà cung cấp dựa vào chức năng mở rộng sẽ không hoạt động vì thư viện AOSP có cùng tên không có chức năng mở rộng. Nếu các mô-đun của nhà cung cấp trực tiếp hoặc gián tiếp phụ thuộc vào các chức năng mở rộng, thì nhà cung cấp nên sao chép thư viện dùng chung DAUX, DXUA và DXUX vào phân vùng của nhà cung cấp (các quy trình của nhà cung cấp luôn tìm kiếm thư viện dùng chung trong phân vùng của nhà cung cấp trước tiên). Tuy nhiên, bạn không được sao chép thư viện LL-NDK, vì vậy, các mô-đun của nhà cung cấp không được dựa vào các chức năng mở rộng do thư viện LL-NDK đã sửa đổi xác định.
Thư viện dùng chung DAUA có thể vẫn nằm trên phân vùng hệ thống nếu thư viện AOSP tương ứng có thể cung cấp cùng một chức năng và các mô-đun của nhà cung cấp tiếp tục hoạt động khi phân vùng hệ thống bị Hình ảnh hệ thống chung (GSI) ghi đè.
Việc thay thế thả vào rất quan trọng vì các thư viện VNDK chưa sửa đổi trong GSI sẽ liên kết với các thư viện dùng chung đã sửa đổi khi xảy ra xung đột tên. Nếu thư viện AOSP được sửa đổi theo cách không tương thích với API/ABI, thì thư viện AOSP trong GSI có thể không liên kết được hoặc dẫn đến hành vi không xác định.