Pamięć jest kluczowym i ograniczonym zasobem na urządzeniach z Androidem. Dla dewelopera platformy Androida lub producenta OEM zrozumienie, jak działa pamięć na każdym poziomie – od środowiska wykonawczego Javy po jądro Linuksa – jest niezbędne do stworzenia wydajnego i stabilnego systemu.
W tym przewodniku znajdziesz obszerne informacje o architekturze pamięci Androida, narzędziach dostępnych do analizy oraz praktycznych ćwiczeniach, które pomogą Ci zidentyfikować i rozwiązać problemy związane z pamięcią.
Cele
Po zapoznaniu się z tym przewodnikiem będziesz umieć:
- Wyjaśnij podstawowe pojęcia związane z pamięcią Androida, w tym model procesu Zygote i pliki mapowane w pamięci.
- Rozróżnianie między Resident Set Size (RSS), Proportional Set Size (PSS) i Unique Set Size (USS).
- Używaj standardowych narzędzi wiersza poleceń, takich jak
dumpsys meminfoishowmap, aby szybko ocenić wykorzystanie pamięci. - Przechwytywanie i analizowanie zrzutów sterty Java za pomocą AHAT w celu znalezienia wycieków i nadmiernych alokacji.
- Używaj Perfetto i
heapprofddo profilowania pamięci Javy i pamięci natywnej w całym systemie. - Zrozumienie wskaźników obciążenia pamięci w całym systemie, takich jak Pressure Stall Information (PSI), i monitorowanie aktywności mechanizmu Low Memory Killer (LMK).
- obserwować aktywność związaną z odzyskiwaniem pamięci na poziomie jądra, w tym wymianę ZRAM i wykluczanie pamięci podręcznej stron;
Struktura przewodnika
Ten przewodnik jest podzielony na sekcje, które należy czytać po kolei:
- Podstawowe pojęcia: podstawowe zasady techniczne dotyczące pamięci Androida.
- Narzędzia do szybkiej oceny: używanie
meminfo,showmapiprocstatsdo szybkiej selekcji. - Analizowanie pamięci Javy: szczegółowe omówienie sterty Javy za pomocą AHAT.
- Mapy bitowe i pamięć: dowiedz się, jak obrazy wpływają na pamięć RAM, i używaj narzędzi do ich profilowania.
- Analizowanie pamięci natywnej: profilowanie pamięci C/C++ za pomocą Perfetto i
heapprofd. - WebView i pamięć: informacje o architekturze wieloprocesowej i wykorzystaniu pamięci przez komponenty WebView.
- Kod aplikacji to pamięć: dowiedz się, jak wczytywanie klas i rozdęcie DEX wpływają na pamięć RAM.
- Wątki i pamięć: analiza kosztów stosów wątków natywnych.
- Lokalność pamięci i wydajność: zrozumienie, jak wzorce dostępu do danych wpływają na wydajność procesora.
- Powiązania usług i stany procesów: dowiedz się, jak zależności między procesami wpływają na wyniki OOM.
- Rozwiązywanie problemów w całym systemie: monitorowanie PSI, LMK, wymiany ZRAM i wykluczania pamięci podręcznej stron.
- Odzyskiwanie pamięci: wykluczanie i wymiana: informacje o memcg, obciążeniu i aktywnym odzyskiwaniu pamięci za pomocą
memory.reclaim. - Interakcja kswapd i lmkd: dowiedz się, jak kswapd i lmkd współpracują ze sobą pod obciążeniem.
- Zwracanie stron pamięci do systemu operacyjnego: używanie
madviseiposix_fadvisedo zwracania nieużywanych stron sterty i stron pamięci podręcznej plików do jądra. - Utrzymywanie działania w tle za pomocą uproszczonego procesu: przenoszenie usług w tle i instancji roboczych do dedykowanego procesu, dzięki czemu pamięć interfejsu i pamięć karty graficznej nie jest utrzymywana na podwyższonym poziomie priorytetu.
Wymagania wstępne i środowisko
Ten przewodnik zawiera przykładowe przepływy pracy, dane testów porównawczych i studia przypadków, które pokazują, jak diagnozować i rozwiązywać problemy z pamięcią na Androidzie.
- Narzędzia do analizy: techniki opisane w tym przewodniku wykorzystują głównie standardowe narzędzia do analizy wydajności Androida, takie jak Perfetto,
dumpsys meminfo,showmapi AHAT. - Uprawnienia roota: niektóre procesy diagnostyczne na poziomie systemu (np. sprawdzanie obciążenia pamięci jądra lub liczników PMU sprzętu) wymagają podwyższonych uprawnień roota (
adb root) na urządzeniu z userdebug lub w kompilacji emulatora.
Zacznij tutaj: podstawowe pojęcia