Chạy dịch vụ AIDL một cách linh hoạt

Bắt đầu từ Android 11, các dịch vụ AIDL gốc chạy trong phân vùng hệ thống có thể được khởi động và dừng một cách linh hoạt khi cần thiết. Các dịch vụ động bắt đầu khi chúng được yêu cầu lần đầu tiên và tự động dừng khi chúng không còn được sử dụng nữa.

Dịch vụ có thể chạy động

Tính năng này chỉ khả dụng cho các dịch vụ gốc có vòng đời có thể được kiểm soát bởi initservicemanager . Các dịch vụ trong gói ứng dụng không được hỗ trợ và thay vào đó nên sử dụng các dịch vụ bị ràng buộc .

Tắt động hoạt động bằng cách tắt quá trình dịch vụ chạy. Nếu có nhiều dịch vụ tồn tại trong cùng một quy trình, tất cả chúng phải được đăng ký dưới dạng động để tương thích với tính năng này. Quá trình đó sau đó sẽ tắt khi tất cả các dịch vụ không được sử dụng.

Định cấu hình tệp init .rc của dịch vụ

Để chạy một dịch vụ một cách linh hoạt, hãy thêm các tùy chọn sau vào tệp init .rc của dịch vụ sau dòng service <name> <cmd> hàng đầu.

interface aidl serviceName
disabled
oneshot

Các tùy chọn này thực hiện như sau:

  • interface aidl serviceName : Cho phép servicemanager tìm thấy dịch vụ. Nếu dịch vụ sử dụng nhiều giao diện, hãy khai báo mỗi giao diện trên một dòng riêng. Những tên này phải chính xác như những gì servicemanager mong đợi và có thể khác với tên quy trình.
  • disabled : Ngăn dịch vụ tự động khởi động khi khởi động.
  • oneshot : Ngăn chặn dịch vụ tự động khởi động lại mỗi khi nó bị dừng.

Để biết thêm thông tin, hãy xem Đọc ngôn ngữ ban đầu của Android trong AOSP.

Ví dụ:

Đăng ký dịch vụ

Mỗi dịch vụ được tạo và đăng ký với servicemanager . Việc đăng ký thường diễn ra trong một tệp có tên main.cpp , nhưng việc triển khai có thể khác nhau. Việc đăng ký thường trông giống như thế này:

using android::defaultServiceManager;

defaultServiceManager()->addService(serviceName, service);

Việc đăng ký đôi khi được trừu tượng hóa bởi BinderService::publish hoặc BinderService::instantiate , gọi mã trên.

Để đăng ký một dịch vụ ở dạng động, hãy thay thế mã đăng ký của dịch vụ đó bằng mã sau:

#include <binder/LazyServiceRegistrar.h>

using android::binder::LazyServiceRegistrar;

auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);

servicemanager liên lạc với LazyServiceRegistrar để tắt các dịch vụ dựa trên số lượng tham chiếu của chúng.

Ví dụ:

Định cấu hình máy khách dịch vụ AIDL

Nhận dịch vụ

Để truy xuất một dịch vụ lười biếng, dịch vụ đó phải được khởi động và sau đó được truy xuất. Gọi getService trên trình quản lý dịch vụ sẽ khởi động dịch vụ, nhưng thông thường, bạn muốn nhận dịch vụ ngay khi có sẵn và nên sử dụng các biến thể waitForService . Xem tài liệu dành riêng cho phần phụ trợ về cách sử dụng chúng.

Phát hành dịch vụ

Tắt động dựa trên việc đếm tham chiếu, do đó khách hàng không được giữ dịch vụ khi không sử dụng.

Ví dụ:

Tạm thời vô hiệu hóa tắt máy

Nếu bạn muốn một dịch vụ chạy độc lập cho đến khi hoàn thành một số tác vụ nhất định rồi chuyển sang chế độ động, bạn có thể sử dụng LazyServiceRegistrar::forcePersist để bật và tắt tính năng tắt động. Nếu điều này được gọi từ phía máy chủ thì nó phải được gọi trước registerService .

Ví dụ: apexservice