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

Kể 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 động khi cần. Các dịch vụ động bắt đầu khi được yêu cầu lần đầu tiên và tự động dừng khi không còn được sử dụng.

Các dịch vụ có thể chạy động

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

Tính năng tắt động hoạt động bằng cách tắt quy trình mà dịch vụ chạy. Nếu tồn tại nhiều dịch vụ trong cùng một quy trình, thì tất cả các dịch vụ đó phải được đăng ký dưới dạng động để tương thích với tính năng này. Sau đó, quy trình đó 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 .rc khởi động của dịch vụ

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

interface aidl serviceName
disabled
oneshot

Các tuỳ chọn này thực hiện những việc 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 từng giao diện trên một dòng riêng. Những tên này phải chính xác như 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 dịch vụ tự động khởi động lại mỗi khi bị dừng.

Để biết thêm thông tin, hãy xem Tệp Readme về ngôn ngữ khởi động Android trong AOSP.

Ví dụ:

Đăng ký dịch vụ

Mỗi dịch vụ được tạo và đăng ký bằng servicemanager. Việc đăng ký thường diễn ra trong một tệp có tên là main.cpp, nhưng cách triển khai có thể khác nhau. Thông tin đăng ký thường có dạng như sau:

using android::defaultServiceManager;

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

Đôi khi, quá trình đăng ký được BinderService::publish hoặc BinderService::instantiate trừu tượng hoá, các lớp này sẽ gọi mã ở trên.

Để đăng ký một dịch vụ dưới 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 giao tiếp 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 ứng dụng khách dịch vụ AIDL

Nhận dịch vụ

Để truy xuất dịch vụ tải lười, bạn phải khởi động rồi truy xuất dịch vụ đó. Việc gọi getService trên trình quản lý dịch vụ sẽ bắt đầu dịch vụ, nhưng thông thường, bạn muốn nhận dịch vụ ngay khi có và nên sử dụng các biến thể waitForService. Hãy xem tài liệu dành riêng cho phần phụ trợ về cách sử dụng các API này.

Phát hành dịch vụ

Việc tắt động dựa trên tính năng đếm tham chiếu, vì vậy, ứng dụng không được giữ lại dịch vụ khi không sử dụng.

Ví dụ:

Tạm thời tắt tính năng tắt máy

Nếu 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 hành vi động, bạn có thể sử dụng LazyServiceRegistrar::forcePersist để bật và tắt tính năng tắt động. Nếu được gọi từ phía máy chủ, thì tính năng này phải được gọi trước registerService.

Ví dụ: apexservice