HAL có sẵn động

Android 9 hỗ trợ tắt động các hệ thống con phần cứng Android khi không 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 không được chiếm dụng 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 giữ mở trên các thiết bị Android trong toàn bộ thời gian khởi động điện thoại Android.

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_stopctl.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 inithwservicemanager 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ên registerAsService, 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ọi IPCThreadState::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.