Pamięć to krytyczny i ograniczony zasób na urządzeniach z Androidem. Jako deweloper platformy Android lub producent OEM musisz rozumieć, jak działa pamięć na każdym poziomie – od środowiska wykonawczego Java po jądro systemu Linux. Jest to niezbędne do tworzenia wydajnych i stabilnych systemów.
Ten przewodnik zawiera kompleksowe omówienie architektury pamięci Androida, narzędzi dostępnych do analizy oraz ćwiczeń praktycznych, które pomogą Ci identyfikować i rozwiązywać problemy związane z pamięcią.
Cele
Po przeczytaniu tego przewodnika będziesz w stanie:
- wyjaśnić podstawowe pojęcia związane z pamięcią Androida, w tym model procesu Zygote i pliki mapowane w pamięci;
- rozróżnić rozmiar zbioru rezydentnego (RSS), proporcjonalny rozmiar zbioru (PSS) i unikalny rozmiar zbioru (USS);
- używać standardowych narzędzi wiersza poleceń, takich jak
dumpsys meminfoishowmap, aby szybko ocenić wykorzystanie pamięci; - przechwytywać i analizować zrzuty sterty Java za pomocą AHAT, aby znajdować wycieki i nadmierne alokacje;
- używać Perfetto i
heapprofddo profilowania pamięci Java i natywnej w całym systemie; - rozumieć wskaźniki obciążenia pamięci w całym systemie, takie jak informacje o wstrzymaniu z powodu obciążenia (PSI), i monitorować aktywność mechanizmu Low Memory Killer (LMK);
- obserwować aktywność odzyskiwania pamięci na poziomie jądra, w tym wymianę ZRAM i usuwanie z pamięci podręcznej stron.
Struktura przewodnika
Ten przewodnik jest podzielony na te 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,showmap, iprocstatsdo szybkiego triage. - Analizowanie pamięci Java: szczegółowe analizy sterty Java za pomocą AHAT.
- Mapy bitowe i pamięć: zrozumienie, jak obrazy wpływają na pamięć RAM i używanie narzędzi do ich profilowania.
- Analizowanie pamięci natywnej: profilowanie pamięci C/C++ za pomocą
Perfetto i
heapprofd. - WebView i pamięć: zrozumienie architektury wieloprocesowej i wykorzystania pamięci WebView.
- Kod aplikacji to pamięć: zrozumienie, jak wczytywanie klas i nadmiar kodu DEX wpływają na pamięć RAM.
- Wątki i pamięć: analizowanie 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: zrozumienie, 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 usuwania z pamięci podręcznej stron.
- Odzyskiwanie pamięci: usuwanie i wymiana: zrozumienie memcg,
obciążenia i proaktywnego odzyskiwania pamięci za pomocą
memory.reclaim. - Interakcja kswapd i lmkd: zrozumienie, jak kswapd i lmkd współpracują pod obciążeniem.
Wymagania wstępne i środowisko
Ten przewodnik zawiera przykładowe przepływy pracy, dane porównawcze i studia przypadków, które pokazują, jak diagnozować i rozwiązywać problemy z pamięcią Androida.
- Narzędzia do analizy: techniki opisane w tym przewodniku wykorzystują głównie standardowe
narzędzia do analizy wydajności Androida, w tym
Perfetto,
dumpsys meminfo,showmap, i AHAT. - Uprawnienia roota: niektóre przepływy pracy diagnostycznej 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 userdebug lub w emulatorze build.
Zacznij tutaj: podstawowe pojęcia