HAL có sẵn động

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

Việc triển khai tắt động bao gồm việc kết nối các luồng dữ liệu và thực hiện các quy trình động như được trình bày chi tiết trong các phần sau.

Thay đổi định nghĩa HAL

Tắt động yêu cầu thông tin về 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 bối cảnh khác) cũng như không bắt đầu quy trình khi khởi động và không khởi động lại chúng (cho đến khi được yêu cầu lại) khi chúng 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

Những thay đổi đối với init và hwservicemanager

Tắt động cũng yêu cầu hwservicemanager báo cho 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 điều khiển bổ sung (ví dụ: ctl.start ): ctl.interface_start , ctl.interface_stopctl.interface_restart . Những thông báo này có thể được sử dụng để báo hiệu init nhằm hiển thị và tắt các giao diện phần cứng cụ thể. Khi một dịch vụ được yêu cầu nhưng chưa được đăng ký, hwservicemanager sẽ yêu cầu khởi động dịch vụ đó. Tuy nhiên, HAL động không yêu cầu sử dụng bất kỳ thứ nào trong số này.

Xác định lối ra HAL

Trong Android 9, lối thoát HAL phải được xác định theo cách thủ công. Đối với Android 10 trở lên, nó cũng có thể được xác định bằng vòng đời tự động .

Tắt động yêu cầu nhiều chính sách để quyết định khi nào bắt đầu HAL và khi nào tắt HAL. Nếu HAL quyết định thoát vì bất kỳ lý do gì, nó sẽ tự động được 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 được cung cấp bởi những thay đổi đối với inithwservicemanager . Điều này có thể liên quan đến một vài chiến lược khác nhau, bao gồm:

  • HAL có thể chọn tự gọi lối ra nếu ai đó gọi một API đóng hoặc tương tự trên đó. Hành vi này phải được chỉ định trong giao diện HAL tương ứng.
  • HAL có thể tắt khi nhiệm vụ của chúng hoàn thành (được ghi trong tệp HAL).

Vòng đời tự động

Android 10 bổ sung thêm hỗ trợ cho kernel và hwservicemanager , cho phép HAL tự động tắt bất cứ khi nào chúng không có ứng dụng khách. Để 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 định nghĩa HAL cũng như:

  • Đăng ký dịch vụ trong C++ với LazyServiceRegistrar thay vì hàm thành viên registerAsService , ví dụ:
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • Xác minh rằng máy khách HAL chỉ giữ tham chiếu đến HAL cấp cao nhất (giao diện được đăng ký với hwservicemanager ) khi nó được sử dụng. Để tránh sự chậm trễ nếu tham chiếu này bị loại bỏ trên một luồng hwbinder vẫn tiếp tục thực thi, máy khách cũng nên gọi IPCThreadState::self()->flushCommands() sau khi loại bỏ tham chiếu để đả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 liên quan những thay đổi.