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

Android 7.0 ra mắt không gian tên cho 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 riêng mình. Hãy xem bài đăng 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 trên blog dành cho nhà phát triển Android để biết các thay đổi dành riêng cho ứng dụng.

Kiến trúc

Trong 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

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

Không gian tên 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ư đã thực hiện với OpenSSL). Điều này cũng loại bỏ các trường hợp ứ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 ứng dụng (như đã thấy với libpng). Rất khó để 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 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 các thư viện gốc bổ sung mà ứng dụng có thể truy cập bằng cách đặt các thư viện đó vào thư mục thư viện tương ứng và liệt kê rõ ràng các thư viện đó trong tệp .txt.

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

  • /vendor/lib (dành cho 32 bit) và /vendor/lib64 (dành cho 64 bit) cho thư viện của nhà cung cấp silicon
  • /system/lib (đối với 32 bit) và /system/lib64 (đối với 64 bit) cho 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 các nhà cung cấp silicon
  • /system/etc/public.libraries-COMPANYNAME.txt dành cho các 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à -. Bạn 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à của các nhà cung cấp giải pháp bên ngoài.

Thư viện gốc trong phân vùng system do nhà sản xuất thiết bị công bố 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 tên tệp txt chứa tên thư viện.

KHÔNG ĐƯỢC 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 được công khai theo mặc định). 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ể truy cập được vào ứ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 các hạn chế và chế độ 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 đúng cách để ứng dụng có thể truy cập được. Nếu bất kỳ ứng dụng nào (bao gồm cả ứng dụng 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, trực tiếp hoặc gián tiếp thông qua các phần phụ thuộc, 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, bạn có thể đưa các thư viện công khai của nhà cung cấp vào một APEX của nhà cung cấp. Khi đó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 các ứng dụng nhắm đến SDK phiên bản 24 trở lên; để có 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 đang liên kết với thư viện gốc riêng tư. Danh sách 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 mục 3.1.1 của CDD. Bạn cần cập nhật các ứng dụng nhắm đến API 24 trở lên và sử dụng mọi thư viện không công khai. Xem nội dung Liên kết các ứng dụng NDK 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 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 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 yêu cầu không tồn tại trên thiết bị, thì tức là ứng dụng chưa được cài đặt. Khi được cài đặt, ứng dụng sẽ được cung cấp chỉ các thư viện chia sẻ gốc mà ứng dụng đã yêu cầu. Tức 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.