Wdróż Health 2.0

Cały kod healthd został refaktoryzowany na Health@2.0-impl. libhealthservice, a następnie dodano do wdrożenia Health@2.0 HAL. Te dwie opcje są statycznie połączone przez Health@2.0-service, co umożliwia wykonane wcześniej przez użytkownika healthd (tzn. uruchom polecenie healthd_mainloop i wykonaj ). W inicjowaniu usługa Health@2.0-rejestruje implementację interfejs IHealth do hwservicemanager. Gdy wymieniasz urządzenia z obraz dostawcy Androida 8.x i platformę Androida 9, obraz dostawcy może nie dostarczać usługi Health@2.0. To jest wymuszane przez harmonogram wycofywania.

Aby rozwiązać ten problem:

  1. healthd rejestruje usługę IHealth w: hwservicemanager (mimo że jest systemem) demona). Pole IHealth zostało dodane do pliku manifestu systemu z nazwą instancji "backup"
  2. Platforma i storaged komunikują się z healthd za pomocą hwbinder zamiast binder.
  3. Kod platformy i zasad storaged został zmieniony tak, aby pobrać instancję "default", jeśli ta opcja jest dostępna, a potem "backup".
    • Kod klienta C++ korzysta z logiki zdefiniowanej w zasadzie libhealthhalutils.
    • Kod klienta w języku Java korzysta z logiki zdefiniowanej w zasadzie HealthServiceWrapper.
  4. Po powszechnej dostępności systemu IHealth/default oraz obrazów dostawców Androida 8.1 wycofane, IHealth/backup oraz healthd mogą zostać wycofane. Więcej Więcej informacji znajdziesz w artykule na temat wycofywania ustawień Health@1.0.

Zmienne kompilacji dla konkretnej tablicy dla sprawnych

BOARD_PERIODIC_CHORES_INTERVAL_* to zmienne związane z płytką używane do tworzenia healthd W ramach podziału kompilacji systemu/dostawcy wartości dla poszczególnych płyt nie można zdefiniować dla modułów systemowych. W stanie Health@2.0 dostawcy mogą zastąpić te dwie wartości w funkcji healthd_mode_ops->init (przez usunięcie funkcji libhealthservice zależność w health@2.0-service.<device> i ponowne zaimplementowanie tej funkcji).

Biblioteka implementacji statycznej

W przeciwieństwie do innych bibliotek implementacji HAL biblioteka implementacji Health@2.0-impl to biblioteka statyczna, do której usługa Health@2.0-service, ładowarka i starszego prawidłowego stanu.

Health@2.0.impl implementuje funkcję IHealth w sposób opisany powyżej i ma na celu pakowanie w pobliżu: libbatterymonitor i libhealthd.BOARD. Te użytkownicy Health@2.0-impl nie mogą używać pola BatteryMonitor ani funkcji w bezpośrednio libhealthd; te wywołania należy zastąpić wywołaniami na klasę Health, czyli implementację interfejsu IHealth. Aby uogólnić kod healthd_common jest również uwzględniony w Health@2.0-impl. Nowy healthd_common zawiera resztę kodu wspólnego dla usługi Health@2.0-service, ładowarka i healthd oraz wywołuje metody IHealth zamiast BatteryMonitor.

Wdróż usługę Health 2.0

Podczas wdrażania usługi Health@2.0 na urządzeniu, jeśli implementacja domyślna to:

  • Wystarczające dla urządzenia. Użyj android.hardware.health@2.0-service bezpośrednio.
  • Nie jest to wystarczające dla danego urządzenia, utwórz android.hardware.health@2.0-service.(device) plik wykonywalny, który zawiera:

    #include <health2/service.h>
    int main() { return health_service_main(); }
    

Następnie:

  • Jeśli libhealthd: specyficzna dla tablicy

    • Istnieje, link do niego.
    • Nie istnieje, dodaj puste implementacje dla healthd_board_init i healthd_board_battery_update.
  • W przypadku zmiennych BOARD_PERIODIC_CHORES_INTERVAL_* właściwych dla danej tablicy:

    • są zdefiniowane, utwórz HealthServiceCommon.cpp dla konkretnego urządzenia (skopiowany) od hardware/interfaces/health/2.0/utils/libhealthservice) i Dostosuj ją w healthd_mode_service_2_0_init.
    • nie są zdefiniowane; połącz statycznie z usługą libhealthservice.
  • Jeśli urządzenie:

    • Należy wdrożyć interfejsy API getStorageInfo i getDiskStats, a także podać w funkcjach get_storage_info i get_disk_stats.
    • Nie powinno być implementowane tych interfejsów API, link do: libstoragehealthdefault statycznie.
  • Zaktualizuj niezbędne uprawnienia SELinux.

  • Wdrożenie HAL w procesie przywracania przez zainstalowanie implementacji przekazującej w obraz odzyskiwania. Przykład:

    // Android.bp
    cc_library_shared {
        name: "android.hardware.health@2.0-impl-<device>",
        recovery_available: true,
        relative_install_path: "hw",
        static_libs: [
            "android.hardware.health@2.0-impl",
            "libhealthd.<device>"
            // Include the following or implement device-specific storage APIs
            "libhealthstoragedefault",
        ],
        srcs: [
            "HealthImpl.cpp",
        ],
        overrides: [
            "android.hardware.health@2.0-impl-default",
        ],
    }
    
    // HealthImpl.cpp
    #include <health2/Health.h>
    #include <healthd/healthd.h>
    using android::hardware::health::V2_0::IHealth;
    using android::hardware::health::V2_0::implementation::Health;
    extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
        const static std::string providedInstance{"default"};
        if (providedInstance != name) return nullptr;
        return Health::initInstance(&gHealthdConfig).get();
    }
    
    # device.mk
    PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
    

Więcej informacji: hardware/interfaces/health/2.0/README.md.

Klienci ochrony zdrowia

Zapoznaj się z artykułem Klienci korzystający z Health 2.1 HAL.

Zmiany w SELinux

Nowa zawartość Health@2.0 HAL zawiera następujące zmiany dla SELinux:

  • Dodaje Health@2.0-service do file_contexts.
  • Zezwala system_server i storaged na korzystanie z hal_health.
  • Umożliwia rejestrację aplikacji system_server (BatteryService) batteryproperties_service (IBatteryPropertiesRegistrar).
  • Pozwala healthd na dostarczanie hal_health.
  • Usuwa reguły, które pozwalają system_server i storaged na wywołanie healthd za pomocą separatora.
  • Usuwa reguły, które pozwalają healthd zarejestrować użytkownika batteryproperties_service (IBatteryPropertiesRegistrar).

W przypadku urządzeń z własną implementacją niektóre zmiany dostawcy SELinux mogą niezbędną. Przykład:

# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0

# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.

Interfejsy jądra systemu

Zobacz Interfejsy jądra systemu w Health 2.1 HAL.

Testowanie

Android 9 zawiera nowe testy VTS napisane specjalnie na potrzeby HAL Health@2.0. Jeśli urządzenie deklaruje udostępnianie Health@2.0 HAL w pliku manifestu urządzenia, musi przejść odpowiednie testy VTS. Testy są zapisywane dla instancji domyślnej (aby upewnić się, że urządzenie prawidłowo implementuje listę HAL) i instancję kopii zapasowej (aby zapewnić, że healthd będzie działał poprawnie przed jego usunięciem).

Wymagania dotyczące informacji o baterii

Zobacz Wymagania dotyczące informacji o baterii.