Android 7.0 ra mắt không gian tên cho các thư viện gốc để giới hạn API nội bộ chế độ hiển thị và giải quyết trường hợp ứng dụng vô tình sử dụng nền tảng thay vì của riêng chúng. Xem bài viết Cải thiện Độ ổn định nhờ các hạn chế về biểu tượng C/C++ riêng tư trong Android 7.0 Android Bài đăng trên blog dành cho nhà phát triển về các thay đổi dành riêng cho ứng dụng.
Kiến trúc
Trên Android 7.0 trở lên, thư viện hệ thống được tách biệt với thư viện ứng dụng.
Không gian tên cho thư viện gốc ngăn các ứng dụng sử dụng gốc của nền tảng riêng tư
API (như đã thực hiện với OpenSSL). Thao tác này cũng xoá các tình huống trong đó ứng dụng
vô tình sử dụng thư viện nền tảng thay vì thư viện của riêng chúng (như đã chứng kiến
cùng với libpng
). Thư viện ứng dụng khó sử dụng nội bộ
các thư viện hệ thống (và ngược lại).
Thêm thư viện gốc bổ sung
Ngoài các thư viện gốc công khai tiêu chuẩn, các nhà cung cấp silicon (bắt đầu từ Android 7.0) và nhà sản xuất thiết bị (kể từ Android 9) có thể chọn cung cấp thêm thư viện gốc các ứng dụng có thể truy cập bằng cách đặt chúng vào các thư mục thư viện tương ứng và liệt kê chúng một cách rõ ràng trong tệp .txt.
Các thư mục thư viện là:
/vendor/lib
(cho 32 bit) và/vendor/lib64
(cho 64 bit) cho các thư viện của các nhà cung cấp silicon/system/lib
(cho 32 bit) và/system/lib64
(cho 64 bit) dành cho thư viện của nhà sản xuất thiết bị
Các tệp .txt này bao gồm:
/vendor/etc/public.libraries.txt
cho các thư viện của các nhà cung cấp silicon/system/etc/public.libraries-COMPANYNAME.txt
cho thư viện của nhà sản xuất thiết bị, trong đóCOMPANYNAME
là tên của nhà sản xuất (chẳng hạn nhưawesome.company
).COMPANYNAME
phải khớp với[A-Za-z0-9_.-]+
; ký tự chữ-số, _, . (dấu chấm) và -. Có thể có nhiều tệp .txt như vậy trong một thiết bị nếu một số thư viện là từ giải pháp bên ngoài Google Cloud.
Thư viện gốc trong phân vùng system
được nhà sản xuất thiết bị công khai
PHẢI được đặt tên là lib*COMPANYNAME.so
, ví dụ: libFoo.awesome.company.so
.
Nói cách khác, libFoo.so
không có hậu tố tên công ty KHÔNG ĐƯỢC chuyển thành công khai.
COMPANYNAME
trong tên tệp thư viện PHẢI khớp với COMPANYNAME
trong
txt chứa tên thư viện có trong thư viện đó.
Thư viện gốc thuộc AOSP KHÔNG ĐƯỢC công khai (ngoại trừ thư viện chuẩn các thư viện gốc công khai (được công khai theo mặc định). Chỉ các thư viện bổ sung được thêm bởi nhà cung cấp silicon hoặc nhà sản xuất thiết bị có thể truy cập được vào ứng dụng.
Kể từ Android 8.0, thư viện công khai của nhà cung cấp có thêm các tính năng sau: giới hạn và thiết lập bắt buộc:
- Thư viện gốc của nhà cung cấp phải được gắn nhãn đúng cách để có thể
ứng dụng có thể truy cập. Nếu bất kỳ ứng dụng nào yêu cầu quyền truy cập (bao gồm cả ứng dụng thứ ba
bên thứ ba), thì bạn phải gắn nhãn thư viện là
same_process_hal_file
trong tệpfile_contexts
dành riêng cho nhà cung cấp như sau:/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
trong đólibnative.so
là tên của thư viện gốc. - Thư viện, dù trực tiếp hay bắc cầu thông qua các phần phụ thuộc, đều không được
phụ thuộc vào các thư viện hệ thống khác ngoài thư viện VNDK-SP và LLNDK. Tìm danh sách
Thư viện VNDK-SP và LLNDK tại
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
.
Kể từ Android 15, thư viện công khai của nhà cung cấp có thể được đặt trong một
nhà cung cấp APEX. Khi được đóng gói trong APEX của nhà cung cấp, hãy liệt kê các thư viện
trong thuộc tính provideNativeLibs
trong tệp kê khai APEX.
Cập nhật ứng dụng để không sử dụng thư viện gốc không công khai
Tính năng này chỉ được bật cho những ứng dụng nhắm đến SDK phiên bản 24 trở lên; để tương thích ngược, hãy xem phần Bảng 1.Điều gì sẽ xảy ra nếu ứng dụng của bạn đang liên kết dựa trên các thư viện gốc riêng tư. Danh sách các thư viện gốc của Android mà ứng dụng có thể truy cập (còn được gọi là thư viện gốc công cộng) được liệt kê trong CDD phần 3.1.1. Ứng dụng nhắm đến 24 hoặc sau này và sử dụng bất kỳ thư viện không công khai nào đều phải được cập nhật. Xem NDK Các ứng dụng liên kết với Thư viện nền tảng để biết thêm thông tin chi tiết.
Cập nhật ứng dụng cho các phần phụ thuộc thư viện gốc
Ứng dụng nhắm đến SDK phiên bản 31 (Android 12) trở lên phải
chỉ định rõ ràng các phần phụ thuộc của thư viện dùng chung gốc bằng cách sử dụng
Thẻ <uses-native-library>
trong tệp kê khai ứng dụng. Nếu bất kỳ phần nào của yêu cầu
thư viện không tồn tại trên thiết bị, ứng dụng chưa được cài đặt. Khi được cài đặt, ứng dụng sẽ
chỉ được cung cấp các thư viện dùng chung gốc mà họ đã yêu cầu. Điều này có nghĩa là
các ứng dụng không thể truy cập vào thư viện dùng chung gốc không xuất hiện trong tệp kê khai ứng dụng.