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. Dịch vụ động bắt đầu khi được yêu cầu lần đầu 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ó vòng đời có thể được kiểm soát 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 có nhiều dịch vụ tồn tại 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 này sẽ tắt khi tất 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 động, hãy thêm các tuỳ chọn sau vào tệp init .rc của dịch vụ đó sau dòng service <name> <cmd> ở đầu.

interface aidl serviceName
disabled
oneshot

Các tuỳ chọn này sẽ 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. Các tên này phải đúng như tên servicemanager dự kiến 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 phần Readme của Android Init trong AOSP.

Ví dụ:

Đăng ký dịch vụ

Mỗi dịch vụ đều được tạo và đăng ký bằng servicemanager. Việc đăng ký thường diễn ra trong tệp có tên main.cpp, nhưng cách triển khai cũng 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 tóm tắt bằng BinderService::publish hoặc BinderService::instantiate, 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:

#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 dịch vụ AIDL

Nhận dịch vụ

Để truy xuất một dịch vụ tải từng phần, dịch vụ đó phải được khởi động rồi truy xuất. Việc 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 được dịch vụ ngay khi có sẵn 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ợ để biết cách sử dụng các tính năng này.

Phát hành dịch vụ

Tính năng động tắt dựa trên việc tính tham chiếu, vì vậy, ứng dụng khách 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 bạn muốn một dịch vụ chạy độc lập cho đến khi một số tác vụ nhất định hoàn tất và sau đó 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 lệnh này được gọi từ phía máy chủ thì lệnh này phải được gọi trước registerService.

Ví dụ: apexservice