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 linh hoạt khi cần. Các dịch vụ động sẽ 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 nữa.
Những dịch vụ có thể chạy linh hoạt
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 init
và servicemanager
. Các dịch vụ trong gói ứng dụng không được hỗ trợ và thay vào đó, bạn nên sử dụng các dịch vụ liên kết.
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ụ trong cùng một quy trình, 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ả 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 động, hãy thêm các lựa chọn sau vào tệp init .rc
của dịch vụ sau dòng service <name> <cmd>
đầu tiên.
interface aidl serviceName
disabled
oneshot
Các lựa chọn này có những chức năng sau:
interface aidl serviceName
: Cho phépservicemanager
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 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 dịch vụ 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ý với servicemanager
. Quá trình đăng ký thường diễn ra trong một tệp có tên là main.cpp
, nhưng quá trình triển khai có thể khác nhau. Quy trình đăng ký thường diễn ra như sau:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Đôi khi, quá trình đăng ký được trừu tượng hoá 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 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ượt tham chiếu.
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ụ trì hoãn, dịch vụ đó phải được bắt đầu rồi mới được 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ì bạn muốn nhận dịch vụ ngay khi có thể 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 các tài liệu này.
Phát hành dịch vụ
Tính năng tắt động dựa trên việc đếm số lượt tham chiếu, vì vậy, các ứng dụng không được giữ lại dịch vụ khi không sử dụng.
Ví dụ:
Tạm thời vô hiệu hoá chế độ tắt
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ể 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