Việc triển khai tắt động liên quan đến việc kết nối các luồng dữ liệu và thực thi các quy trình động như được nêu chi tiết trong các phần sau.
Thay đổi đối với định nghĩa HAL
Tắt động yêu cầu thông tin về những quy trình nào phục vụ giao diện HAL nào (thông tin này cũng có thể hữu ích sau này trong các ngữ cảnh khác) cũng như không khởi động các quy trình khi khởi động và không khởi động lại các quy trình đó (cho đến khi được yêu cầu lại) khi các quy trình đó thoát.
# some init.rc script associated with the HAL service vendor.some-service-name /vendor/bin/hw/some-binary-service # init language extension, provides information of what service is served # if multiple interfaces are served, they can be specified one on each line interface android.hardware.light@2.0::ILight default # restarted if hwservicemanager dies # would also cause the hal to start early during boot if disabled wasn't set class hal # will not be restarted if it exits until it is requested to be restarted oneshot # will only be started when requested disabled # ... other properties
Thay đổi đối với init và hwservicemanager
Tắt động cũng yêu cầu hwservicemanager
cho init
biết để bắt đầu các dịch vụ được yêu cầu. Trong Android 9, init
bao gồm 3 thông báo điều khiển bổ sung (ví dụ: ctl.start
): ctl.interface_start
, ctl.interface_stop
và ctl.interface_restart
.
Bạn có thể dùng các thông báo này để báo hiệu cho init
hiển thị và ẩn các giao diện phần cứng cụ thể. Khi một dịch vụ được yêu cầu và chưa được đăng ký, hwservicemanager
sẽ yêu cầu bắt đầu dịch vụ đó. Tuy nhiên, HAL động không yêu cầu sử dụng bất kỳ phương thức nào trong số này.
Xác định lối thoát HAL
Trong Android 9, bạn phải xác định chế độ thoát HAL theo cách thủ công. Đối với Android 10 trở lên, bạn cũng có thể xác định thời điểm này bằng vòng đời tự động.
Tắt động yêu cầu nhiều chính sách để quyết định thời điểm bắt đầu và tắt HAL. Nếu một HAL quyết định thoát vì bất kỳ lý do gì, HAL đó sẽ tự động khởi động lại khi cần thiết bằng cách sử dụng thông tin được cung cấp trong định nghĩa HAL và cơ sở hạ tầng do các thay đổi đối với init
và hwservicemanager
cung cấp. Việc này có thể liên quan đến một số chiến lược, bao gồm:
- HAL có thể chọn tự gọi lệnh thoát nếu có người gọi một API đóng hoặc tương tự trên đó. Bạn phải chỉ định hành vi này trong giao diện HAL tương ứng.
- HAL có thể tắt khi hoàn thành tác vụ (được ghi lại trong tệp HAL).
Vòng đời tự động
Android 10 bổ sung thêm tính năng hỗ trợ cho nhân và hwservicemanager
, cho phép HAL tự động tắt bất cứ khi nào không có ứng dụng nào. Để sử dụng tính năng này, hãy thực hiện tất cả các bước trong phần Thay đổi đối với định nghĩa HAL cũng như:
- Đăng ký dịch vụ trong C++ bằng
LazyServiceRegistrar
thay vì hàm thành viênregisterAsService
, ví dụ:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Xác minh rằng ứng dụng HAL chỉ giữ lại tệp tham chiếu đến HAL cấp cao nhất (giao diện được đăng ký bằng
hwservicemanager
) khi ứng dụng đó đang được sử dụng. Để tránh bị chậm trễ nếu tệp đối chiếu này bị loại bỏ trên luồng hwbinder tiếp tục thực thi, ứng dụng cũng phải gọiIPCThreadState::self()->flushCommands()
sau khi loại bỏ tệp đối chiếu để đảm bảo trình điều khiển liên kết được thông báo về các thay đổi liên quan đến số lượng tệp đối chiếu.