Để triển khai việc ngừng hoạt động linh hoạt, bạn cần kết nối các luồng dữ liệu và thực thi các quy trình linh độ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 lực, bạn cần cung cấp thông tin về những quy trình cung cấp lớp HAL trên giao diện (thông tin này cũng có thể hữu ích sau này trong các ngữ cảnh khác) như cũng như không bắt đầu các quy trình khi khởi động và không khởi động lại chúng (cho đến yêu cầu lại) khi họ 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
Các thay đổi đối với init và hwservicemanager
Để tắt tính năng động cũng cần có hwservicemanager
thông báo
init
để bắt đầu các dịch vụ được yêu cầu. Trong Android 9,
init
bao gồm ba thông báo kiểm soát bổ sung (ví dụ:
ctl.start
): ctl.interface_start
,
ctl.interface_stop
và ctl.interface_restart
.
Có thể dùng những thông báo này để ra hiệu cho init
kích hoạt và gỡ bỏ
các giao diện phần cứng cụ thể. Khi dịch vụ được yêu cầu và không được cung cấp
đã đăng ký, hwservicemanager
yêu cầu dịch vụ phải được
đầu. Tuy nhiên, HAL động không yêu cầu phải sử dụng bất kỳ phương thức nào trong số này.
Xác định lối ra HAL
Trong Android 9, bạn phải thoát HAL theo cách thủ công xác định. Đối với Android 10 trở lên, ứng dụng này cũng có thể được xác định bằng vòng đời tự động.
Để tự động tắt, bạn cần có nhiều chính sách để quyết định thời điểm bắt đầu một
HAL và thời điểm tắt HAL. Nếu HAL quyết định thoát vì bất kỳ lý do gì,
sẽ tự động được khởi động lại khi cần thiết một lần nữa bằng cách sử dụng thông tin này
được cung cấp trong định nghĩa HAL và cơ sở hạ tầng được cung cấp bởi những thay đổi đối với
init
và hwservicemanager
. 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 thoát nếu ai đó gọi lệnh đóng hoặc API tương tự trên đó. Hành vi này phải được chỉ định trong HAL (Lớp trừu tượng phần cứng) tương ứng .
- HAL có thể tắt khi hoàn thành nhiệm vụ (được ghi trong HAL tệp).
Vòng đời tự động
Android 10 hỗ trợ nhiều hơn cho nhân hệ điều hành và
hwservicemanager
, cho phép HAL (Lớp trừu tượng phần cứng) tự động tắt
bất cứ khi nào họ không có khách hàng. Để sử dụng tính năng này, hãy làm tất cả các bước trong
Thay đổi đối với định nghĩa HAL
dưới dạng:
- Đăng ký dịch vụ trong C++ bằng
LazyServiceRegistrar
thay cho hàm thành phần,registerAsService
, cho ví dụ:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Xác minh rằng ứng dụng HAL vẫn tham chiếu đến HAL cấp cao nhất (
giao diện được đăng ký bằng
hwservicemanager
) khi đang sử dụng. Để tránh bị chậm trễ nếu tệp tham chiếu này bị thả trong luồng hwbinder tiếp tục thực thi, ứng dụng cũng sẽ gọiIPCThreadState::self()->flushCommands()
sau khi thả để đảm bảo rằng trình điều khiển liên kết được thông báo về số lượng tham chiếu thay đổi.