File System incrementale di Google
Google ha lavorato su un nuovo tipo di file system che consente l'esecuzione di binari prima che venga caricato un pacchetto completo. Prendendo come esempio lo sviluppo di app Android, al momento devi aspettare che l'intero binario venga trasmesso all'emulatore o al tuo vero dispositivo di test per il debug. Il File System incrementale riduce drasticamente questo ritardo consentendo l'esecuzione del binario prima che l'intero pacchetto sia stato trasmesso. Sembra immensamente complesso, ed è quello che è, ma possiamo ancora dargli un'occhiata per capire meglio quale sarà molto probabilmente una funzione predefinita in Android 12 e versioni successive.
Un file system virtuale chiamato "incfs"
La soluzione del file system virtuale di Google, che nella sua prima iterazione verrà utilizzata esclusivamente per APK e AAB caricati dal Play Store, è un livello che si trova sopra il file system reale. Per illustrare meglio l'architettura, sto usando alcune slide create da Google per un discorso tecnico. Puoi trovare il link nell'addendum alla fine di questa pagina.
Tornando all'argomento, l'Incremental File System di Google può essere pensato come una cache, in cui le entità create fanno riferimento direttamente ai file nel filesystem reale. Il codice stesso è profondamente integrato nel sistema operativo come modulo del kernel, il che sembra logico a causa della sua collocazione di basso livello nell'architettura generale.
Vantaggio di un file system virtuale
Il vantaggio di un tale FS virtuale è che non sei vincolato ai limiti di un filesystem reale, dove la lettura e la successiva esecuzione di un programma di solito possono avvenire solo se è disponibile il bundle completo, dal primo all'ultimo Byte. Con il "Filesystem incrementale", questa limitazione viene tecnicamente eliminata. Tuttavia, con una funzionalità così potente arriva una vasta gamma di aspetti complessi da considerare.
Prendendolo da un ingegnere di Google, una grande sfida è la corretta gestione delle operazioni di scrittura. Il filesystem virtuale ha il proprio stato per quanto riguarda le letture in sospeso, ma deve comunque mantenere l'integrità dei dati dei file caricati.
La sfida viene affrontata creando un indice personalizzato negli “incfs”. Ogni file reale è direttamente correlato a un'entità nel filesystem virtuale, anche quando il file originale viene rinominato.
Un'altra abbreviazione chiamata "ioctl"
Questa abbreviazione sta per "controllo input/output" e porta alla creazione di un tale file indice nell'Incremental File System di Google. "ioctl" deriva dal sistema operativo e la sua spiegazione tecnica non rientra nell'ambito di questo articolo. Se vuoi saperne di più, c'è anche un link nell'addendum.
Anche abbastanza interessante: "incfs" ha un meccanismo di registrazione integrato. Questa funzione verrà utilizzata per determinare le prestazioni reali della sua implementazione per ulteriori miglioramenti.
Utilizzo pratico
L'inizio di questa funzione è stato nel maggio del 2019, quando alcuni ingegneri di Google hanno iniziato a apportare modifiche al kernel Linux. Posizionarlo lì ha permesso loro di usarlo semplicemente nell'Android Open Source Project (AOSP), la parte open source di Android e la base principale di questo sistema operativo, poiché AOSP è costruito anche sul kernel Linux.
I contributori di Linux non erano così felici, poiché erano già stati realizzati approcci simili per migliorare un file system, come FUSE o OverlayFS. Tuttavia, dal punto di vista di Google, quelle implementazioni non erano abbastanza performanti sui dispositivi Android di fascia bassa. Ciò ha portato allo sviluppo del File System incrementale.
Per la prima iterazione, verrà utilizzato per i giochi scaricati dal Play Store a partire da Android 12 per ridurre il tempo necessario per avviare effettivamente il gioco. Questa funzionalità davvero eccezionale presuppone l'Incremental File System, ma anche una logica incorporata in Android per determinare come avviare effettivamente quei giochi in anticipo, senza alcuna modifica da parte dello sviluppatore, secondo Google.