Informacje o pamięci Androida i rozwiązywanie problemów z nią związanych

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 meminfo i showmap, 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 heapprofd do 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:

  1. Podstawowe pojęcia: podstawowe zasady techniczne dotyczące pamięci Androida.
  2. Narzędzia do szybkiej oceny: używanie meminfo, showmap i procstats do szybkiej selekcji.
  3. Analizowanie pamięci Javy: szczegółowe omówienie sterty Javy za pomocą AHAT.
  4. Mapy bitowe i pamięć: dowiedz się, jak obrazy wpływają na pamięć RAM, i używaj narzędzi do ich profilowania.
  5. Analizowanie pamięci natywnej: profilowanie pamięci C/C++ za pomocą Perfetto i heapprofd.
  6. WebView i pamięć: informacje o architekturze wieloprocesowej i wykorzystaniu pamięci przez komponenty WebView.
  7. Kod aplikacji to pamięć: dowiedz się, jak wczytywanie klas i rozdęcie DEX wpływają na pamięć RAM.
  8. Wątki i pamięć: analiza kosztów stosów wątków natywnych.
  9. Lokalność pamięci i wydajność: zrozumienie, jak wzorce dostępu do danych wpływają na wydajność procesora.
  10. Powiązania usług i stany procesów: dowiedz się, jak zależności między procesami wpływają na wyniki OOM.
  11. Rozwiązywanie problemów w całym systemie: monitorowanie PSI, LMK, wymiany ZRAM i wykluczania pamięci podręcznej stron.
  12. Odzyskiwanie pamięci: wykluczanie i wymiana: informacje o memcg, obciążeniu i aktywnym odzyskiwaniu pamięci za pomocą memory.reclaim.
  13. Interakcja kswapd i lmkd: dowiedz się, jak kswapd i lmkd współpracują ze sobą pod obciążeniem.
  14. Zwracanie stron pamięci do systemu operacyjnego: używanie madvise i posix_fadvise do zwracania nieużywanych stron sterty i stron pamięci podręcznej plików do jądra.
  15. 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, showmap i 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