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

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

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 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:

  1. 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ệ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 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 (bản thử nghiệm AOSP), bạn có thể đặt thư viện công khai của nhà cung cấp 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.