Dopo aver analizzato Darwin, passiamo ad un nuovo argomento. Vi siete mai chiesti come funzionano le – ormai indispensabili – app? Quali sono le idee alla base? Come nasce e da quali elementi è caratterizzata un’app?
Primi concetti in macOS
Le applicazioni sono impacchettate in bundle. Cosa sono i bundle?
Il concetto di bundle è la base per applicazioni, framework, plugin e addirittura estensioni del kernel; sono contenitori di software autoinstallante in macOS. Vengono solitamente utilizzati per installare e gestire i componenti interni del sistema operativo (come i salvaschermo, le librerie, i plugin o altro), da non confondere con i package che vengono utilizzati per l’installazione delle applicazioni; una peculiarità di macOS è che tiene traccia dei bundle e dei package installati attraverso un database interno.
Possiamo quindi assumere che il bundle di un’applicazione contiene la maggior parte dei file richiesti per il runtime dell’applicazione stessa: il binario, le librerie private, le icone, gli elementi dell’interfaccia utente e la grafica. Un utente (non curioso) resta in gran parte ignaro di ciò, poiché un bundle viene mostrato nel Finder come una singola icona. E a questo punto risulta intuitivo riconoscerlo, perchè è una delle operazioni che vengono svolte con maggiore frequenza: per installare un’app è sufficiente trascinare l’icona dell’applicazione all’interno della cartella Applicazioni.
Non a caso in macOS le applicazioni si trovano in genere nella cartella /Applications. Ogni applicazione è situata ovviamente nella propria directory, denominata AppName.app e ogni applicazione aderisce quasi religiosamente ad un formato fisso, che discuteremo successivamente – in cui le risorse vengono raggruppate in classi.
Le app in iOS
In iOS, le app si discostano un po’ da questa struttura ordinata: sono ancora contenute nelle loro directory, ma non aderiscono alle rigide regole del formato bundle. Al contrario, la directory di un’app può essere piuttosto caotica, con tutti i file app lanciati nella radice (/) del sistema. Inoltre, iOS distingue tra le applicazioni predefinite fornite da Apple, che risiedono in /Applications e quelle acquistate dall’App Store, che si trovano in /var/mobile/Applications.
La directory nella quale risiedono queste ultime è particolare, poichè presenta un GUID a 128 bit (è un numero psedo-casuale usato nella programmazione software), suddiviso in una struttura 4-2-2-2-4 (esempio: A8CB4133-414E-4AF6-06DA-210490939163 – in cui ogni cifra esadecimale rappresenta 4 bit; questa struttura è abbastanza nota, se mai avete provato a visualizzare il file system di un dispositivo iOS jailbroken, avrete sicuramente notato che le app vivono in delle directory con numeri casuali).
Perchè usare delle directory con GUID a 128 bit?
Le app iOS sono chroot(2) (cioè sono limitate nelle operazioni: l’app considera la sua directory come radice del sistema) ed è proprio dalla directory dell’applicazione con GUID codificato che non possono sfuggire: un’app non vede il resto del file system. Ciò garantisce che le applicazioni non proprietarie Apple siano così limitate da non riuscire nemmeno a vedere quali altre applicazioni sono installate al loro fianco, contribuendo ad aumentare la privacy dell’utente.
Ecco una tabella della struttura standard di una directory per le app in iOS:
Una volta scaricate da App Store, le applicazioni sono impacchettate come file .ipa (che praticamente sono archivi zippati), in cui i contenuti della directory dell’applicazione sono compressi, sotto una directory chiamata Payload/. Potete tranquilla provare anche voi a decomprimere un file .ipa con il semplice comando unzip -t nomeApp.ipa per avere un’idea della struttura dell’applicazione.
Anche per questo articolo è tutto!
Continueremo a parlare della struttura delle app anche nel prossimo articolo approfondendo ulteriormente la struttura. Per eventuali domande, curiosità o feedback potete commentare qui in basso, a presto!