Không gian tên cho thư viện gốc

Android 7.0 đã giới thiệu không gian tên cho các thư viện gốc để hạn chế khả năng hiển thị API nội bộ và giải quyết 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 chính chúng. Xem bài đăng trên blog Cải thiện tính ổn định với các hạn chế biểu tượng C/C++ riêng tư trong bài đăng trên blog Nhà phát triển Android Android 7.0 để biết các thay đổi dành riêng cho ứng dụng.

Ngành kiến ​​​​trúc

Trong Android 7.0 trở lên, thư viện hệ thống được tách biệt khỏi thư viện ứng dụng.

Không gian tên cho thư viện gốc

Hình 1. Không gian tên cho thư viện gốc

Không gian tên dành cho thư viện gốc ngăn ứng dụng sử dụng API gốc của nền tảng riêng tư (như đã làm với OpenSSL). Nó cũng loại bỏ 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ì của chính chúng (như đã chứng kiến ​​với libpng ). Rất khó để các thư viện ứng dụng vô tình sử dụng thư viện hệ thống nội bộ (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 cộng tiêu chuẩn, nhà cung cấp silicon (bắt đầu từ Android 7.0) và nhà sản xuất thiết bị (bắt đầu từ Android 9) có thể chọn cung cấp thêm các thư viện gốc mà ứng dụng có thể truy cập bằng cách đặt chúng trong 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 .txt các tập tin.

Các thư mục thư viện là:

  • /vendor/lib (đối với 32-bit) và /vendor/lib64 (đối với 64-bit) dành cho thư viện từ nhà cung cấp silicon
  • /system/lib (đối với 32-bit) và /system/lib64 (đối với 64-bit) dành cho thư viện từ nhà sản xuất thiết bị

Các tệp .txt là:

  • /vendor/etc/public.libraries.txt cho thư viện từ nhà cung cấp silicon
  • /system/etc/public.libraries-COMPANYNAME.txt dành cho thư viện của các nhà sản xuất thiết bị, trong đó COMPANYNAME đề cập đến 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ữ và 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 đến từ các nhà cung cấp giải pháp bên ngoài.

Các 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 PHẢI được công khai. COMPANYNAME trong tên tệp thư viện PHẢI khớp với COMPANYNAME trong tên tệp txt chứa tên thư viện.

Các thư viện gốc là một phần của AOSP KHÔNG PHẢI được công khai (ngoại trừ các thư viện gốc công cộng tiêu chuẩn được công khai theo mặc định). Chỉ các thư viện bổ sung do nhà cung cấp silicon hoặc nhà sản xuất thiết bị thêm mới có thể truy cập được vào ứng dụng.

Bắt đầu từ Android 8.0, thư viện công cộng của nhà cung cấp có các hạn chế bổ sung và thiết lập bắt buộc sau:

  1. Thư viện gốc trong nhà cung cấp phải được gắn nhãn chính xác để các ứng dụng có thể truy cập được. Nếu bất kỳ ứng dụng nào (kể cả ứng dụng của bên thứ ba) yêu cầu quyền truy cập thì thư viện phải được gắn nhãn là same_process_hal_file trong tệp file_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.
  2. Thư viện dù trực tiếp hay gián tiếp thông qua các phụ thuộc của nó đều không được phụ thuộc vào các thư viện hệ thống 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 .

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 các ứng dụng nhắm mục tiêu SDK phiên bản 24 trở lên; để biết khả năng tương thích ngược, hãy xem Bảng 1. Điều gì sẽ xảy ra nếu ứng dụng của bạn liên kết với các thư viện gốc riêng tư . Danh sách các thư viện gốc Android có thể truy cập được vào các ứng dụng (còn được gọi là thư viện gốc công cộng) được liệt kê trong phần CDD 3.1.1. Cần cập nhật các ứng dụng nhắm mục tiêu từ 24 trở lên và sử dụng bất kỳ thư viện không công cộng nào. Xem Ứng dụng NDK Liên kết với Thư viện nền tảng để biết thêm chi tiết.

Cập nhật ứng dụng cho các phần phụ thuộc vào thư viện gốc của chúng

Các ứng dụng nhắm mục tiêu 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 vào 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 thư viện được yêu cầu không tồn tại trên thiết bị thì ứng dụng chưa được cài đặt. Khi ứng dụng được cài đặt, chúng chỉ được cung cấp các thư viện dùng chung gốc mà chúng yêu cầu. Điều này có nghĩa là ứng dụng không thể truy cập vào các thư viện dùng chung gốc không xuất hiện trong tệp kê khai ứng dụng.