Wdrożenie usługi storaged

Android 8 obsługuje storaged, czyli natywny demon Androida, który zbiera i publikuje dane o pamięci na urządzeniach z Androidem.

  • W przypadku dziennych statystyk dysków storaged okresowo analizuje /sys/block/mmcblk0/stat (urządzenia pamięci eMMC) lub /sys/block/sda/stat (urządzenia inne niż eMMC).
  • W przypadku trwałości eMMC funkcja storaged analizuje wartość /d/mmc0/mmc0:001/ext_csd (jeśli jest dostępna).
  • W celu przypisania odpowiedzialności za dane wejściowe i wyjściowe aplikacji storaged okresowo przechodzi przez /proc/uid_io/stats i zachowuje przeanalizowane dane, które obejmują dane ze wszystkich aplikacji (nie tylko tych uruchomionych). dumpsys może wywołać storaged, aby zarejestrować użycie wejść/wyjść aplikacji w raporcie o błędach.

Informacje o diskstat (w tym o zatrzymanych statystykach dysku) i eMMC są zapisywane w dzienniku zdarzeń Androida, gdzie usługa sprawdzania platformy zbiera logi.

Operacje storaged są wykonywane automatycznie i obsługiwane całkowicie przez framework Androida, więc nie musisz nic robić. Na tej stronie opisaliśmy projekt storaged (w tym nowe interfejsy) oraz sposób korzystania z niego do uzyskiwania stanu we/wy z rdzenia.

projekt magazynu

Aby zapewnić elastyczność w zakresie rozliczania i uprawnień, funkcja storaged jest implementowana jako moduł jądra, który zwraca informacje o wejściu/wyjściu dla konkretnego identyfikatora użytkownika (zamiast standardowej funkcji proc/PID/io). Dane o wejściu/wyjściu dla każdego żądania są nadal przechowywane i aktualizowane w jądrze task_struct, a jądro śledzi, kiedy proces się kończy, aby nie pominąć użycia funkcji wejścia/wyjścia, które występuje po ostatnim zdarzeniu zapytania storaged.

Moduł odczytuje dane nieprzetworzone i przetworzy je tylko wtedy, gdy framework powiadomi go o przełączeniu uid na pierwszy lub drugi plan albo gdy demon storaged poprosi o raport. W tym momencie moduł eksportuje węzeł pliku z jądra do komunikacji z ramką i demonem storaged.

storaged wprowadza interfejs /proc/uid_io/stats, który zwraca listę statystyk wejść/wyjść dla każdego identyfikatora UID w systemie. Format:

<uid>: <foreground read bytes> <foreground write bytes> <foreground read chars> <foreground write chars> <background read bytes> <background write bytes> <background read chars> <background write chars>
  • Bajty odczytu/zapisu to zdarzenia wejścia-wyjścia z urządzenia pamięci masowej.
  • read/write chars (również w bajtach) to dane żądane przez read/write syscalls.

Pobieranie stanu wejść/wyjść z jądra

Aby wygenerować dane dotyczące wykorzystania wejść/wyjść z jądra, użyj polecenia storaged z opcją -u.

Polecenie: storaged -u

Format wyniku polecenia: name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync

Uwaga: te dane wyjściowe są podobne do danych wyjściowych w przypadku polecenia proc/uid_io/stats. Dzieje się tak, ponieważ usługa storaged przetwarza dane z /proc/uid_io/stats i generuje własne dane.

Przykładowe dane wyjściowe:

com.google.android.backuptransport  2269  60  0  0  1719845663  143912573  149065728  184180736
com.android.vending  2170  60  0  0  219904796  38693092  174436352  18944000