HAL (Lớp trừu tượng phần cứng) có thể sử dụng một cách linh hoạt

Android 9 hỗ trợ tính năng tự động tắt phần cứng Android các hệ thống phụ khi chúng không được sử dụng hoặc không cần thiết. Ví dụ: khi một người dùng đang không sử dụng Wi-Fi thì hệ thống con Wi-Fi không được chiếm bộ nhớ, nguồn hoặc các tài nguyên hệ thống khác. Trong các phiên bản Android cũ, HAL/trình điều khiển luôn mở trên các thiết bị Android trong suốt một khoảng thời gian điện thoại đã khởi động.

Để 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_stopctl.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 inithwservicemanager. 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ọi IPCThreadState::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.