Implementare le risorse di archiviazione

Android 8 aggiunge il supporto per storaged, un daemon nativo Android che raccoglie e pubblica metriche relative allo spazio di archiviazione sui dispositivi Android.

  • Per i diskstat giornalieri, storaged analizza periodicamente /sys/block/mmcblk0/stat (dispositivi di archiviazione eMMC) o /sys/block/sda/stat (dispositivi non eMMC).
  • Per la durata di eMMC, storaged analizza /d/mmc0/mmc0:001/ext_csd (se disponibile).
  • Per il blam di I/O delle app, storaged attraversa periodicamente /proc/uid_io/stats e gestisce i dati analizzati, che includono i dati da tutte le app (non solo quelle in esecuzione). dumpsys può chiama storaged per registrare l'utilizzo di I/O dell'app in una segnalazione di bug.

Le informazioni su Diskstat (inclusi dischistat bloccati) e su eMMC vengono registrate nel Log eventi di Android, in cui un servizio di registrazione della piattaforma raccoglie i log.

Le operazioni di storaged vengono eseguite automaticamente e sono gestite interamente da Android senza dover effettuare alcuna implementazione. Questa pagina descrive il design di storaged (incluse le nuove interfacce) e come utilizzarlo per ottenere lo stato di I/O dal kernel.

progettazione con spazio di archiviazione

Per flessibilità della contabilità e delle autorizzazioni, storaged è implementato come kernel che restituisce informazioni di I/O in base all'uid (anziché l'utilizzo di proc/PID/io). I dati di I/O non elaborati per ogni richiesta I/O continuano a essere archiviato e aggiornato nel kernel task_struct, che mantiene di tenere traccia della chiusura di un processo, in modo da non tralasciare l'utilizzo di I/O proveniente dalla l'ultimo storaged evento elettorale.

Il modulo legge i dati non elaborati e li elabora solo quando il framework li avvisa di un'opzione di primo piano/sfondo UID o quando il daemon storaged richiede un report. In quel momento, il modulo esporta un nodo file dal kernel per comunicazione con framework e daemon storaged.

storaged introduce l'interfaccia /proc/uid_io/stats, che restituisce un elenco di statistiche di I/O per ogni UID nel sistema. Il formato è:

<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>
  • I byte di lettura/scrittura sono eventi di I/O di un dispositivo di archiviazione.
  • I caratteri di lettura/scrittura (anche in byte) sono dati richiesti dalla richiesta syscall.

Ottieni lo stato di I/O dal kernel

Per eseguire il dump dell'utilizzo di I/O dal kernel, usa il comando storaged con l'opzione -u.

Comando: storaged -u

Formato di output del comando: name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync

Nota: questo output è simile all'output per proc/uid_io/stats. Questo perché storaged elabora i dati provenienti da /proc/uid_io/stats e genera i propri dati.

Output di esempio:

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