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 trường hợp ứng dụng vô tình sử dụng các thư viện nền tảng thay vì thư viện của riêng ứng dụng. Hãy xem bài đăng trên blog Cải thiện độ ổn định bằng quy định hạn chế biểu tượng C/C++ riêng tư trong Android 7.0 của Nhà phát triển Android để biết các thay đổi cụ thể cho ứng dụng.

Kiến trúc

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

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

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

Không gian tên cho các 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ư đã thực hiện với OpenSSL). Điều này cũng loại bỏ những trường hợp ứng dụng vô tình sử dụng các thư viện nền tảng thay vì thư viện riêng (như đã thấy với libpng). Các thư viện ứng dụng khó có thể vô tình sử dụng các thư viện hệ thống nội bộ (và ngược lại).

Thêm các thư viện gốc bổ sung

Ngoài các thư viện gốc công khai tiêu chuẩn, nhà cung cấp silicon (kể 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 các thư viện gốc mà ứng dụng có thể truy cập bằng cách đặt các thư viện đó vào các thư mục thư viện tương ứng và liệt kê rõ ràng trong các 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 nhà cung cấp linh kiện
  • /system/lib (đối với 32 bit) và /system/lib64 (đối với 64 bit) cho các thư viện của nhà sản xuất thiết bị

Các tệp .txt là:

  • /vendor/etc/public.libraries.txt cho các thư viện của nhà cung cấp silicon
  • /system/etc/public.libraries-COMPANYNAME.txt cho các thư viện của 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_.-]+; các 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 do nhà sản xuất thiết bị công khai PHẢI có tên là lib*COMPANYNAME.so, ví dụ: libFoo.awesome.company.so. Nói cách khác, bạn KHÔNG ĐƯỢC phép công khai libFoo.so mà không có hậu tố tên công ty. COMPANYNAME trong tên tệp thư viện PHẢI khớp với COMPANYNAME trong tên tệp txt mà tên thư viện được liệt kê.

Bạn KHÔNG ĐƯỢC phép công khai các thư viện gốc thuộc AOSP (ngoại trừ các thư viện gốc công khai tiêu chuẩn, theo mặc định là công khai). Chỉ những thư viện bổ sung do nhà cung cấp silicon hoặc nhà sản xuất thiết bị thêm vào mới có thể được cung cấp cho các ứng dụng.

Kể từ Android 8.0, các thư viện công khai của nhà cung cấp có thêm những hạn chế và chế độ thiết lập bắt buộc sau đây:

  1. Thư viện gốc trong nhà cung cấp phải được gắn nhãn đúng cách để các ứng dụng có thể truy cập vào thư viện đó. Nếu bất kỳ ứng dụng nào (kể cả ứng dụng bên thứ ba) cần có 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 này (trực tiếp hoặc bắc cầu thông qua các phần phụ thuộc của thư viện) 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 các thư viện VNDK-SP và LLNDK tại development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv.

Kể từ Android 15, các thư viện công khai của nhà cung cấp có thể được đưa vào APEX của nhà cung cấp. Khi được đóng gói trong một APEX của nhà cung cấp, hãy liệt kê các thư viện trong một thuộc tính provideNativeLibs trong tệp kê khai APEX.

Cập nhật ứng dụng để không sử dụng các 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 đến 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. Bạn có thể mong đợi điều gì nếu ứng dụng của bạn đang 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 mà ứng dụng có thể truy cập (còn gọi là thư viện gốc công khai) được liệt kê trong phần 3.1.1 của CDD. Các ứng dụng nhắm đến phiên bản 24 trở lên 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 phần Các ứng dụng NDK liên kết với thư viện nền tảng để biết thêm thông tin.

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

Những ứng dụng nhắm đến SDK phiên bản 31 (Android 12) trở lên phải chỉ định rõ các phần phụ thuộc 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 có trên thiết bị, thì ứng dụng sẽ không được cài đặt. Khi được cài đặt, các ứng dụng chỉ được cung cấp những thư viện dùng chung gốc mà chúng đã 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 các thư viện dùng chung gốc không xuất hiện trong tệp kê khai ứng dụng.