Dzięki platformie Android producenci urządzeń i deweloperzy aplikacji mogą używać danych termicznych, aby zapewnić spójne wrażenia użytkownika, gdy urządzenie zacznie się przegrzewać. Na przykład, gdy system jest poddawany obciążeniu termicznemu,jobscheduler
zadania są ograniczane, a w razie potrzeby inicjowane jest wyłączenie termiczne platformy. Aplikacje, które otrzymują powiadomienia o stresie termicznym za pomocą zarejestrowanego wywołania zwrotnego w PowerManager
klasie, mogą płynnie dostosowywać interfejs.
Interfejs HAL termiczny
Android 9 i starsze wersje korzystają z interfejsu odpytywania zdefiniowanego w Thermal HAL 1.0, aby uzyskiwać odczyty temperatury. Ten HAL umożliwiał platformie Androida i innym zaufanym klientom, takim jak HAL producenta urządzenia, odczytywanie aktualnej 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.
W Androidzie 10 wprowadzono system termiczny w ramach Androida i nową wersję HAL, Thermal HAL 2.0, która abstrahuje interfejs do urządzeń sprzętowych podsystemu termicznego. Interfejs sprzętowy obejmuje czujniki temperatury i termistory skóry, baterii, GPU, CPU i portu USB. Temperatura obudowy urządzenia jest najważniejszym parametrem, który należy śledzić, aby utrzymać temperaturę powierzchni urządzenia w określonych limitach termicznych.
Dodatkowo Thermal HAL 2.0 udostępnia wielu klientom odczyty czujnika temperatury i powiązane z nimi poziomy ważności, aby wskazywać obciążenie termiczne.
Na poniższym rysunku przedstawiono 2 ostrzeżenia z interfejsu systemu Android. Te komunikaty są wyświetlane, gdy wywołanie zwrotne IThermalEventListener
interfejsu dla czujników USB_PORT
i SKIN
osiągnie poziom ważności THERMAL_STATUS_EMERGENCY
.
Rysunek 1. Ostrzeżenia o przegrzaniu.
Bieżące temperatury są pobierane z różnych rodzajów czujników termicznych za pomocą interfejsu HAL IThermal. 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 tego, że jest to interfejs odpytywania, który zwraca bieżące temperatury, możesz używać wywołania zwrotnego IThermalChangedCallback
(HIDL, Android 10–13) lub IThermalChangedCallback
(AIDL, Android 14 i nowszy) z interfejsem wywołania zwrotnego od klientów HAL termicznego, np. usługi termicznej frameworka. Na przykład RegisterIThermalChangedCallback
i UnregisterIThermalChangedCallback
, aby zarejestrować lub wyrejestrować zdarzenia zmiany ważności. Jeśli poziom temperatury danego czujnika uległ zmianie,notifyThrottling
wysyła wywołanie zwrotne zdarzenia ograniczenia termicznego do detektorów zdarzeń termicznych.
Oprócz informacji z czujnika termicznego w getCurrentCoolingDevices
jest dostępna lista urządzeń chłodzących, które zostały wyłączone. Kolejność na tej liście jest stał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 sekcji Implementacja referencyjna.
Możesz dodać własne rozszerzenia, ale nie wyłączaj funkcji ochrony termicznej.
Serwis termiczny
W Androidzie 10 i nowszych wersjach usługa termiczna w ramach platformy zapewnia stałe monitorowanie za pomocą różnych sygnałów ograniczających z Thermal HAL 2.0 i przekazuje klientom informacje o stopniu ograniczenia. Są to komponenty wewnętrzne i aplikacje na Androida. Usługa korzysta z 2 interfejsów wywołań zwrotnych Binder: IThermalEventListener
i IThermalStatusListener
, które są udostępniane jako wywołania zwrotne. Pierwszy z nich jest przeznaczony do użytku wewnętrznego na platformach i przez producentów urządzeń, a drugi – dla 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 ograniczenia) do 0x00000006
(wyłączenie urządzenia). Tylko zaufana usługa systemowa, np. interfejs API Androida lub interfejs API producenta urządzenia, może uzyskać dostęp do szczegółowych informacji z czujnika temperatury i o zdarzeniach związanych z temperaturą. Na rysunku poniżej przedstawiono model przepływu procesu ograniczania temperatury w Androidzie 10 i nowszych wersjach:
Rysunek 2. Proces łagodzenia skutków przegrzewania w Androidzie 10 i nowszym.
Wytyczne producenta urządzenia
Aby zgłaszać dane z czujnika temperatury urządzenia i stan ograniczenia wydajności w przypadku Androida 10–13, producenci urządzeń muszą wdrożyć aspekt HIDL interfejsu Thermal HAL 2.0 (IThermal.hal
).
Aby raportować dane z czujnika temperatury urządzenia i stan ograniczenia wydajności w przypadku Androida 14, producenci urządzeń muszą wdrożyć aspekt AIDL interfejsu HAL 2.0 (IThermal.aidl
).
Wszystkie czynniki ograniczające wydajność urządzenia, w tym ograniczenia związane z zasilaniem bateryjnym, muszą być zgłaszane za pomocą interfejsu HAL termicznego. Aby to zapewnić, umieść wszystkie czujniki, które mogą wskazywać na potrzebę podjęcia działań łagodzących (na podstawie zmian stanu), w warstwie HAL termicznej i zgłaszaj ważność podjętych działań łagodzących. Wartość temperatury zwracana przez odczyt z czujnika nie musi być rzeczywistą temperaturą, o ile dokładnie odzwierciedla odpowiedni próg ważności. Możesz na przykład przekazywać różne wartości liczbowe zamiast rzeczywistych wartości progowych temperatury lub wbudować w specyfikacje progowe pasmo ochronne, aby zapewnić histerezę. Jednak poziom ważności odpowiadający tej wartości musi być zgodny z poziomem wymaganym przy tym progu. Możesz na przykład zwrócić wartość 72°C jako krytyczny próg temperatury, gdy rzeczywista temperatura wynosi 65°C i odpowiada określonemu przez Ciebie krytycznemu poziomowi ważności. Poziom ważności musi być dokładny, aby zapewnić optymalne działanie struktury termicznej.
Więcej informacji o poziomach progowych w ramach i o tym, jak odpowiadają one działaniom ograniczającym, znajdziesz w artykule Korzystanie z kodów stanu termicznego.
Korzystanie z interfejsów API związanych z temperaturą
Aplikacje mogą dodawać i usuwać odbiorniki oraz uzyskiwać dostęp do informacji o stanie termicznym za pomocą klasy PowerManager
.
Interfejs IThermal
zapewnia wszystkie niezbędne funkcje, w tym zwracanie wartości stanu termicznego. Interfejs IThermal binder jest opakowany jako interfejs OnThermalStatusChangedListener
, którego aplikacje mogą używać podczas rejestrowania lub usuwania detektorów stanu termicznego.
Interfejsy API termiczne Androida mają metody wywołania zwrotnego i odpytywania, dzięki którym aplikacje mogą otrzymywać powiadomienia o poziomach intensywności termicznej za pomocą kodów stanu zdefiniowanych w klasie PowerManager
. Są to:
getCurrentThermalStatus()
zwraca aktualny stan termiczny urządzenia jako liczbę całkowitą, chyba że urządzenie jest poddawane ograniczeniu wydajności.addThermalStatusListener()
dodaje słuchacza.removeThermalStatusListener()
usuwa wcześniej dodanego słuchacza.
Używanie kodów stanu termicznego
Kody stanu termicznego odpowiadają określonym poziomom ograniczania, których możesz używać do zbierania danych i projektowania optymalnego UX. Na przykład aplikacje mogą otrzymać stan 0x00000000
(THERMAL_STATUS_NONE
), który później może zmienić się na 0x00000001
(THERMAL_STATUS_LIGHT
). Oznaczenie stanu 0x00000000
jako t0, a następnie pomiar czasu, który upłynął od stanu THERMAL_STATUS_NONE
do stanu THERMAL_STATUS_LIGHT
jako t1, umożliwia producentom urządzeń projektowanie i testowanie strategii ograniczania ryzyka w określonych przypadkach użycia. W tabeli poniżej znajdziesz sugerowane sposoby wykorzystania kodów stanu termicznego:
Kod stanu termicznego | Opis i zalecane użycie |
---|---|
THERMAL_STATUS_NONE (0x00000000 ) |
Bez ograniczania. Użyj tego stanu, aby wdrożyć działania ochronne, takie jak wykrywanie początku okresu (t0–t1) od THERMAL_STATUS_NONE (0 ) do THERMAL_STATUS_LIGHT (1 ). |
THERMAL_STATUS_LIGHT (0x00000001 ) |
Lekkie ograniczanie, nie ma wpływu na UX. Na tym etapie stosuj łagodne środki zaradcze. Możesz na przykład pominąć zwiększanie wydajności lub używanie nieefektywnych częstotliwości, ale tylko w przypadku dużych rdzeni. |
THERMAL_STATUS_MODERATE (0x00000002 ) |
Umiarkowane ograniczanie, które nie ma dużego wpływu na wygodę użytkownika. Ograniczenie temperatury ma wpływ na aktywność na pierwszym planie, więc aplikacje powinny natychmiast zmniejszyć zużycie energii. |
THERMAL_STATUS_SEVERE (0x00000003 ) |
Poważne ograniczanie przepustowości; ma to duży wpływ na UX. Na tym etapie ograniczenie termiczne urządzenia powinno ograniczać wydajność systemu. Ten stan może powodować efekty uboczne, takie jak zacinanie się wyświetlania i drgania dźwięku. |
THERMAL_STATUS_CRITICAL (0x00000004 ) |
Platforma zrobiła wszystko, aby zmniejszyć zużycie energii. Oprogramowanie do zarządzania temperaturą urządzenia ustawiło wszystkie komponenty na najniższą wydajność. |
THERMAL_STATUS_EMERGENCY (0x00000005 ) |
Główne komponenty platformy wyłączają się z powodu warunków termicznych, a funkcjonalność urządzenia jest ograniczona. Ten kod stanu oznacza ostatnie ostrzeżenie przed wyłączeniem urządzenia. W tym stanie niektóre funkcje, takie jak modem i komórkowa transmisja danych, są całkowicie wyłączone. |
THERMAL_STATUS_SHUTDOWN (0x00000006 ) |
Natychmiast wyłącz. Ze względu na powagę tego etapu aplikacje mogą nie otrzymywać tego powiadomienia. |
Producenci urządzeń muszą przejść test VTS dla termicznego HAL i mogą używać interfejsu kernel sysfs
emul_temp
do symulowania zmian temperatury.