Łagodzenie temperatur

Dzięki platformie Android producenci urządzeń i deweloperzy aplikacji mogą korzystać z danych termicznych, aby zapewnić spójne wrażenia użytkownika (UX), jeśli urządzenie zacznie się przegrzewać. Jeśli na przykład system jest narażony na obciążenie termiczne, zadania jobscheduler są ograniczane, a w razie potrzeby inicjowane jest wyłączenie termiczne. Aplikacje, które otrzymują powiadomienia o obciążeniu termicznym za pomocą zarejestrowanego wywołania zwrotnego w klasie PowerManager, mogą płynnie dostosowywać interfejs użytkownika.

Interfejs HAL do pomiarów termicznych

Android 9 i starsze wersje używają interfejsu pollingu zdefiniowanego w interfejsie ThermalHAL 1.0 do odczytu temperatury. Ten interfejs HAL umożliwiał platformie Android i innym zaufanym klientom, takim jak interfejs HAL producenta urządzenia, odczytywanie bieżącej temperatury oraz progów ograniczania i wyłączania związanych z zasadami dotyczącymi produktu dla każdego czujnika za pomocą tego samego interfejsu API.

Android 10 wprowadził system termiczny w ramach Androida oraz nową wersję interfejsu HAL, Thermal HAL 2.0, która abstrakcyjnie łączy interfejs z urządzeniami sprzętowymi podsystemu termicznego. Interfejs sprzętowy obejmuje czujniki temperatury i termistory do skóry, baterii, procesora graficznego, procesora i portu USB. Temperatura skóry urządzenia jest najważniejszym systemem, który należy monitorować, aby utrzymać temperaturę powierzchni urządzenia w określonych granicach.

Dodatkowo interfejs Thermal HAL 2.0 udostępnia wielu klientom odczyty czujnika temperatury i powiązane z nimi poziomy intensywności, aby wskazać na obciążenie termiczne. Na rysunku poniżej widać 2 ostrzeżenia z interfejsu użytkownika systemu Android. Te komunikaty są wyświetlane, gdy interfejs wywołania zwrotnego IThermalEventListener dla czujników USB_PORTSKIN osiągnie poziom krytyczny THERMAL_STATUS_EMERGENCY.

ostrzeżenia o przegrzaniu,

Rysunek 1. ostrzeżenia o przegrzaniu,

Bieżące temperatury są pobierane dla różnych typów czujników termicznych za pomocą IThermal HAL. Każde wywołanie funkcji zwraca wartość stanu SUCCESS lub FAILURE. Jeśli zwrócona zostanie wartość SUCCESS, proces będzie kontynuowany. Jeśli zwracana jest wartość FAILURE, do status.debugMessage wysyłany jest komunikat o błędzie, który musi być czytelny dla człowieka.

.

Oprócz interfejsu ankiety, który zwraca bieżące temperatury, możesz użyć wywołania zwrotnego IThermalChangedCallback (HIDL, Android 10–13) lub IThermalChangedCallback (AIDL, Android 14 i nowsze) z interfejsem wywołania zwrotnego z klientów HAL termicznego, takiego jak usługa termiczna w ramach frameworku. Na przykład RegisterIThermalChangedCallbackUnregisterIThermalChangedCallback, aby rejestrować lub anulować rejestrowanie zdarzeń ze zmienionym poziomem ważności. Jeśli stopień zagrożenia termicznego danego czujnika uległ zmianie, notifyThrottling wysyła do detektorów zdarzeń termicznych wywołanie zwrotne zdarzenia ograniczenia termicznego.

Oprócz informacji o czujniku termicznym w getCurrentCoolingDevices jest wyświetlana lista urządzeń chłodzących z ograniczonymi możliwościami. Kolejność na liście jest trwała, nawet jeśli urządzenie chłodzące jest offline. Producenci urządzeń mogą używać tej listy do zbierania danych statsd.

Więcej informacji znajdziesz w dokumentacji referencyjnej.

Możesz dodawać własne rozszerzenia, ale nie możesz wyłączyć funkcji łagodzenia termicznego.

Usługa termiczna

W Androidzie 10 i nowszych usługa termiczna w ramach platformy zapewnia ciągłe monitorowanie za pomocą różnych sygnałów zapobiegania z interfejsu Thermal HAL 2.0 i przekazuje klientom informacje o poważnym ograniczeniu. Do tych klientów należą wewnętrzne komponenty i aplikacje na Androida. Usługa korzysta z 2 interfejsów wywołań zwrotnych bindera: IThermalEventListenerIThermalStatusListener, które są udostępniane jako wywołania zwrotne. Pierwszy jest przeznaczony do użytku wewnętrznego przez producentów platform i urządzeń, a drugi do tworzenia aplikacji na Androida.

Za pomocą interfejsów wywołania zwrotnego można pobrać bieżący stan termiczny urządzenia jako wartość całkowitą z zakresu od 0x00000000 (brak ograniczeń) do 0x00000006 (wyłączenie urządzenia). Do szczegółowych informacji o czujniku temperatury i zdarzeniach związanych z temperaturą ma dostęp tylko zaufana usługa systemowa, taka jak interfejs API Androida lub interfejs API producenta urządzenia. Na rysunku poniżej przedstawiono model przepływu procesu łagodzenia termicznego w Androidzie 10 i nowszych:

Proces zapobiegania przegrzewaniu się urządzenia w Androidzie 10 i nowszych.

Rysunek 2. Proces zapobiegania przegrzewaniu się urządzenia w Androidzie 10 i nowszych.

Wytyczne producenta urządzenia

Aby zgłaszać stan czujnika temperatury i ograniczania urządzenia w Androidzie 10–13, producenci urządzeń muszą zaimplementować aspekt HIDL interfejsu ThermalHAL 2.0 (IThermal.hal).

Aby zgłaszać stan czujnika temperatury urządzenia i ograniczania w Androidzie 14, producenci urządzeń muszą zaimplementować interfejs AIDL interfejsu Thermal HAL 2.0 (IThermal.aidl).

Wszystko, co ogranicza wydajność urządzenia, w tym ograniczenia dotyczące zasilania z baterii, musi być zgłaszane przez interfejs HAL dotyczący temperatury. Aby to osiągnąć, dodaj do interfejsu HAL dotyczącego temperatury wszystkie czujniki, które mogą wskazywać na potrzebę zastosowania środków zaradczych (na podstawie zmian stanu), oraz zgłaszaj wagę podjętych działań zaradczych. Wartość temperatury zwrócona przez odczyt czujnika nie musi być rzeczywistą temperaturą, o ile dokładnie odzwierciedla odpowiedni próg wagi. Zamiast rzeczywistych wartości progowych temperatury możesz na przykład przekazać inne wartości liczbowe lub wprowadzić ograniczenie progowe, aby zapewnić histerezę. Jednak powiązany z tą wartością poziom wagi musi być zgodny z wymaganym na tym progu. Możesz na przykład zwrócić 72 °C jako krytyczny próg temperatury, gdy rzeczywista temperatura wynosi 65 °C i odpowiada określonej przez Ciebie krytycznej wadze. Aby zapewnić najlepszą funkcjonalność ramki termicznej, należy podać dokładny poziom ważności.

Więcej informacji o poziomach progowych w ramach i o tym, jak są one powiązane z działaniami zapobiegawczymi, znajdziesz w artykule Używanie kodów stanu temperatury.

Korzystanie z interfejsów API dotyczących temperatury

Aplikacje mogą dodawać i usuwać słuchaczy oraz uzyskiwać informacje o stanie termicznym za pomocą klasy PowerManager. Interfejs IThermal zapewnia wszystkie niezbędne funkcje, w tym zwracanie wartości stanu termicznego. Interfejs bindera Thermal jest opakowany jako interfejs OnThermalStatusChangedListener, którego aplikacje mogą używać podczas rejestrowania lub usuwania detektorów stanu termicznego.

Interfejsy API dotyczące temperatury w urządzeniach z Androidem zawierają zarówno metody wywołania zwrotnego, jak i metody sondowania, aby aplikacje mogły otrzymywać powiadomienia o poważnych poziomach temperatury za pomocą kodów stanu zdefiniowanych w klasie PowerManager. Metody te to:

Używanie kodów stanu termicznego

Kody stanu termicznego odpowiadają określonym poziomom ograniczania, które możesz wykorzystywać do zbierania danych i projektowania optymalnego UX. Aplikacje mogą na przykład otrzymać stan 0x00000000 (THERMAL_STATUS_NONE), który może później zmienić się na 0x00000001 (THERMAL_STATUS_LIGHT). Oznaczenie stanu 0x00000000 jako t0, a potem zmierzenie czasu od stanu THERMAL_STATUS_NONE do stanu THERMAL_STATUS_LIGHT jako t1 umożliwia producentom urządzeń opracowywanie i testowanie strategii łagodzenia w przypadku konkretnych zastosowań. W tabeli poniżej znajdziesz sugerowane sposoby korzystania z kodów stanu temperatury:

Kod stanu termicznego Opis i sugerowane zastosowanie
THERMAL_STATUS_NONE (0x00000000) Bez ograniczania. Użyj tego stanu, aby wdrożyć działania ochronne, takie jak wykrywanie początku okresu (t0 do t1) od THERMAL_STATUS_NONE (0) do THERMAL_STATUS_LIGHT (1).
THERMAL_STATUS_LIGHT (0x00000001) Lekkie ograniczenie, nie ma wpływu na UX. Na tym etapie zastosuj łagodne środki zaradcze dotyczące urządzenia. Na przykład pominięcie wzmacniania lub używanie nieefektywnych częstotliwości, ale tylko na dużych rdzeniach.
THERMAL_STATUS_MODERATE (0x00000002) Umiarkowane ograniczenie, nie ma większego wpływu na UX. Zapobieganie przegrzaniu wpływa na aktywność na pierwszym planie, dlatego aplikacje powinny natychmiast zmniejszyć zużycie energii.
THERMAL_STATUS_SEVERE (0x00000003) Silne ograniczenie; znaczny wpływ na UX. Na tym etapie system powinien ograniczyć wydajność ze względu na temperaturę. Może to powodować efekty uboczne, takie jak drżenie obrazu i zakłócenia dźwięku.
THERMAL_STATUS_CRITICAL (0x00000004) Platforma zrobiła wszystko, aby ograniczyć zużycie energii. Oprogramowanie do zwalczania problemów z nadmiernym nagrzewaniem się urządzenia umieściło wszystkie komponenty w stanie o najniższej wydajności.
THERMAL_STATUS_EMERGENCY (0x00000005) Kluczowe komponenty platformy są wyłączane z powodu warunków termicznych, a funkcjonalność urządzenia jest ograniczona. Ten kod stanu to ostatnie ostrzeżenie przed wyłączeniem urządzenia. W tym stanie niektóre funkcje, takie jak modem i dane komórkowe, są całkowicie wyłączone.
THERMAL_STATUS_SHUTDOWN (0x00000006) Natychmiast wyłącz. Ze względu na poważny charakter tego etapu aplikacje mogą nie otrzymywać tego powiadomienia.

Producenci urządzeń muszą przejść test VTS dla interfejsu termicznego HAL. Do symulowania zmian temperatury mogą używać interfejsu emul_tempkernel sysfs.