
Svaka aplikacija koju ste izradili pomoću aplikacije WebCatalog za računalo dosad je na macOS-u zauzimala oko 320 MB prostora na disku. To nije neobično za aplikaciju temeljenu na Electronu, ali WebCatalog je namijenjen ljudima koji mnogo web-aplikacija koriste kao aplikacije za računalo. Instalirate li ih deset, mogle bi zauzeti više od 3 GB, iako je većina podataka u njima potpuno ista.
Nedavno smo promijenili način na koji WebCatalog za računalo izrađuje aplikacije na macOS-u. Prva aplikacija sada zauzima oko 340 MB fizičkog prostora na disku, uključujući lokalno pohranjenu pripremljenu kopiju aplikacijskog mehanizma. Nakon toga svaka dodatna aplikacija obično zauzima samo 1–2 MB dodatnog fizičkog prostora. U našim je testovima deset aplikacija umjesto više od 3 GB zauzimalo oko 360 MB.
To smo postigli značajkom koja je već ugrađena u macOS: APFS kloniranjem. Zanimljiv dio nije bio samo klonirati datoteke. Trebalo je postići da kloniranje funkcionira, a da svaka aplikacija ostane neovisna, ispravno potpisana kodnim potpisom i funkcionalno jednaka aplikaciji izrađenoj starim postupkom.
Zašto je svaka aplikacija zauzimala dodatnih 320 MB
WebCatalog za računalo pretvara web-stranice u samostalne aplikacije za računalo. Svaka aplikacija koju izradite pokreće se na Photonu, našem aplikacijskom mehanizmu temeljenom na Electronu. Na macOS-u svaka je od njih standardni paket .app koji sadrži Electron (Chromium i Node.js), Photon te datoteke specifične za tu aplikaciju.
Uzmimo za primjer dvije aplikacije, Slack i Discord. Razlikuju im se nazivi, ikone, identifikatori paketa i konfiguracija, ali veliki dio okvira Electron i većina Photona potpuno su isti.
Dosad se svaka aplikacija izrađivala kao potpuno zasebna kopija.
Slack.app
Electron
Photon
datoteke specifične za Slack
Discord.app
Electron
Photon
datoteke specifične za Discord
Okvir Electron i Photon mogli su biti identični u obje aplikacije do posljednjeg bajta, ali macOS je svejedno pohranjivao dodatnu fizičku kopiju za svaku aplikaciju. Deset aplikacija stoga je značilo otprilike deset kopija gotovo istog aplikacijskog paketa veličine 320 MB.
Ta je arhitektura ipak imala jedno svojstvo koje smo željeli sačuvati: svaka je aplikacija bila potpuno neovisna. Brisanje jedne nije moglo utjecati na drugu, a instalirane aplikacije nisu ovisile o tome hoće li WebCatalog za računalo i dalje biti prisutan na sustavu.
Željeli smo ukloniti nepotrebno dupliciranje koje se krilo ispod toga.
APFS je već imao ono što nam je trebalo
Moderni Macovi koriste Appleov datotečni sustav APFS. APFS podržava kloniranje, mehanizam kopiranja pri upisu koji omogućuje dvjema neovisnim datotekama da dijele iste fizičke podatke dok se jedna od njih ne promijeni.
Zamislite kopiranje datoteke veličine 300 MB. Pri običnom kopiranju macOS zapisuje još 300 MB na disk, pa dvije datoteke ukupno zauzimaju oko 600 MB.
Kod APFS klona nova datoteka i dalje izgleda i ponaša se kao potpuna datoteka veličine 300 MB, ali u početku upućuje na iste fizičke blokove kao izvornik.
Datoteka A ─┐
├── dijeljeni fizički blokovi
Datoteka B ─┘
Ako se dio datoteke B poslije promijeni, APFS zapisuje nove blokove samo za promijenjene podatke. Sve što ostane identično može i dalje dijeliti izvorne blokove.
Datoteka A ───── dijeljeni blokovi
Datoteka B ───── dijeljeni blokovi
└──── promijenjeni blokovi
Iz perspektive aplikacije, datoteke A i B zasebne su datoteke. Iz perspektive SSD-a, identične podatke treba pohraniti samo jednom.
To je gotovo upravo ono što nam je trebalo.
Izrada aplikacija iz zajedničke osnove
WebCatalog za računalo sada priprema osnovu za svaku kombinaciju verzija Electrona i Photona. Osnovna aplikacija Photon sadrži dijelove koji su jednaki u svim aplikacijama, uključujući Electron, Photon, strukturu okvira i zajedničke potpise.
Kad aplikacija za računalo izrađuje novu aplikaciju s istim verzijama, više ne raspakirava i ne izrađuje još jednu potpunu kopiju od početka. Umjesto toga stvara APFS klon osnovne aplikacije Photon i prilagođava samo dijelove koji se moraju razlikovati.
To uključuje naziv aplikacije, ikonu, identifikator paketa, postavke, nazive izvršnih datoteka, identifikator izrade i druge metapodatke specifične za aplikaciju.
Budući da većina paketa ostaje nepromijenjena, APFS nastavlja dijeliti fizičke blokove koji sadrže Electron i Photon. Novi prostor zauzima samo razmjerno mala količina podataka specifičnih za aplikaciju.
Zašto jednostavno ne dijeliti Electron?
Očitiji bi pristup bio instalirati Electron jednom i usmjeriti svaku aplikaciju na njega.
Razmotrili smo to, ali time bi se iz temelja promijenio model pouzdanosti. Kad bi zajednička instalacija Electrona nestala, sve aplikacije koje o njoj ovise mogle bi prestati raditi. Mogao bi je ukloniti alat za čišćenje predmemorije ili deinstalacija WebCataloga za računalo, a premještanje ili vraćanje pojedine aplikacije postalo bi složenije.
Također bi trebalo pratiti koje instalirane aplikacije ovise o kojim verzijama izvršnog okruženja kako bi se stare verzije mogle sigurno ukloniti.
Potpisivanje koda na macOS-u stvara još jedan problem. Stroga provjera potpisa odbija simboličke poveznice koje upućuju izvan aplikacijskog paketa.
APFS klonovi pružaju nam korisnu prednost dijeljenja bez uvođenja te ovisnosti. Instalirane aplikacije mogu dijeliti fizičke blokove na disku, a pritom ostati potpuni, neovisni aplikacijski paketi.
Brisanje osnovne aplikacije Photon ne kvari aplikacije izrađene iz nje. Brisanje jedne instalirane aplikacije ne utječe na drugu. Datotečni sustav upravlja dijeljenjem, dok arhitektura aplikacija ostaje neovisna.
Potpisivanje koda gotovo je poništilo uštedu
Kloniranje aplikacije bilo je samo dio problema. Aplikacije za macOS moraju biti i potpisane kodnim potpisom.
Naš stari postupak izrade nakon prilagodbe ponovno je temeljito potpisivao svaki aplikacijski paket. Kod obične kopije to ne predstavlja problem. No pri pohrani s kopiranjem pri upisu izmjena velike binarne datoteke može navesti APFS da joj dodijeli nove fizičke blokove.
Tijekom razvoja izmjerili smo da ponovno potpisivanje okvira Electron dodaje otprilike 194 MB fizički zauzetog prostora po aplikaciji. Uspješno smo izbjegli kopiranje Electrona pri izradi aplikacije, samo da bismo ga velikim dijelom ponovno duplicirali tijekom potpisivanja.
Zato smo morali promijeniti i postupak potpisivanja.
Veliki zajednički okvir sada se potpisuje u sklopu osnovne aplikacije Photon. Kad aplikacija za računalo klonira tu osnovu, ne mijenjamo velike dijeljene binarne datoteke, nego ponovno potpisujemo samo manje dijelove koji se doista moraju razlikovati među aplikacijama.
Kad je aplikacija gotova, provodimo strogu provjeru potpisa cijelog dovršenog paketa kako bismo bili sigurni da je sve i dalje valjano.
Tako zadržavamo jamstva koja pruža potpisivanje koda na macOS-u, ali i uštedu prostora koju omogućuje APFS.
Kad zahtjev Node.js-u za kloniranje zapravo nije klonirao
Pojavio se još jedan neočekivan problem: samo izvođenje kloniranja.
Node.js nudi oznake za kopiranje kojima se traži ponašanje kopiranja pri upisu, uključujući COPYFILE_FICLONE i COPYFILE_FICLONE_FORCE. Na papiru je izgledalo da su to upravo sučelja koja nam trebaju.
U testiranju na Node.js-u 24 istu smo aplikaciju Electron veličine 288 MB kopirali na nekoliko načina i izmjerili koliko je dodatnog fizičkog prostora na disku svaki postupak zauzeo:
fs.cpSync +288 MB
fs.cpSync + COPYFILE_FICLONE +288 MB
fs.cpSync + COPYFILE_FICLONE_FORCE +288 MB
/bin/cp -c -R ~0 MB
Oba načina kloniranja u Node.js-u u našem su testu ipak proizvela potpunu fizičku kopiju, a čak ni varijanta FORCE nije prijavila pogrešku kad nije došlo do očekivanog kloniranja.
Izvorna macOS-ova naredba cp -c ponašala se očekivano, pa WebCatalog za računalo izravno koristi taj mehanizam.
To nas je ujedno podsjetilo da optimizacije datotečnog sustava treba provjeravati mjerenjem samog datotečnog sustava. Pozivanje sučelja koje traži kopiranje pri upisu ne znači nužno da nastale datoteke doista dijele fizički prostor.
Siguran povratak na stari postupak
Ušteda prostora na disku optimizacija je. Uspješna instalacija aplikacije nije.
Novi smo postupak osmislili tako da neuspjeh kloniranja ne spriječi instalaciju aplikacije. Ako priprema osnovne aplikacije Photon ne uspije, ako je predmemorirana osnova oštećena, ako kloniranje ne uspije ili ako aplikacija ne prođe provjeru potpisa, aplikacija za računalo vraća se na prethodni postupak izrade, s potpunim raspakiravanjem i potpunim potpisivanjem.
Najgori je ishod, dakle, jednaka potrošnja prostora na disku kao prije, a ne neuspjela instalacija.
Morali smo uzeti u obzir i istodobno izvođenje. Osnovna aplikacija Photon najprije se priprema u privremenom direktoriju, a na konačno se mjesto premješta tek kad je dovršena. Tako se ne može dogoditi da dva istodobna postupka izrade aplikacija slučajno naiđu na nedovršenu osnovu.
Starije osnove također se mogu sigurno ukloniti. Instalirani APFS klon ne ovisi o tome hoće li izvorna osnova i dalje postojati. Ako se osnova izbriše, klon zadržava fizičke blokove koje još koristi.
To funkcionira na APFS-u, zadanom datotečnom sustavu svakog modernog Maca. Ako su vaše aplikacije na disku koji ne podržava kloniranje, primjerice na vanjskom disku s datotečnim sustavom HFS+ ili exFAT, WebCatalog za računalo vraća se na obično kopiranje. Aplikacije stoga rade kao prije, ali ne štede prostor. Na sustavima Windows i Linux zasad se ništa ne mijenja.
Logička i fizička veličina nisu isto
Jedna pomalo zbunjujuća nuspojava jest to što Finder i dalje može prikazivati da svaka aplikacija zauzima oko 320 MB.
Taj broj predstavlja logičku veličinu aplikacije. Aplikacija doista sadrži otprilike 320 MB datoteka i, kad bi se te datoteke kopirale negdje bez kloniranja, otprilike bi toliko podataka trebalo zapisati.
Promijenila se fizička veličina, odnosno broj jedinstvenih blokova koje te datoteke stvarno zauzimaju na disku.
Ako dvije aplikacije sadrže isti okvir veličine 300 MB i APFS im dopušta dijeljenje istih temeljnih blokova, svaka aplikacija logički može sadržavati 300 MB, a da druga pritom gotovo uopće ne dodaje nove fizičke podatke.
Finderov prikaz informacija i alati poput du ne prikazuju nužno to dijeljenje. Ušteda se najbolje vidi u količini slobodnog prostora koji je doista ostao na disku.
To smo provjerili na sedam stvarnih aplikacija: Discordu, Facebooku, Instagramu, Messengeru, TikToku i dvjema prilagođenim aplikacijama. Izrađene na ovaj način, uštedjele su oko 1,9 GB prostora na disku u usporedbi sa starim postupkom izrade.
Provjerili smo i fizičke pomake na disku te potvrdili da aplikacije dijele zajedničke podatke Electrona i Photona na razini blokova. Aplikacija izrađena starim postupkom nije dijelila nijedan od tih blokova, što nam je poslužilo kao korisna usporedba.
Rezultat
Za nekoga tko pomoću WebCataloga za računalo izradi samo jednu aplikaciju razlika je mala. Prva aplikacija zapravo zauzima nešto više prostora na disku nego prije jer aplikacija za računalo čuva i osnovnu aplikaciju Photon koja se koristi za izradu sljedećih klonova.
Nakon toga korist brzo raste.
Prije
1 aplikacija ~320 MB
10 aplikacija >3 GB
Uz APFS kloniranje:
Poslije
1 aplikacija ~340 MB
10 aplikacija ~360 MB
Nakon izrade početne osnove svaka dodatna aplikacija obično zauzima samo 1–2 MB dodatnog fizičkog prostora na disku.
Važno je da smo to postigli bez uvođenja ovisnosti o zajedničkom izvršnom okruženju. Svaka aplikacija ostaje standardna, samostalna aplikacija za macOS, dok APFS identične podatke Electrona i Photona pohranjuje samo jednom. Uz desetak instaliranih aplikacija to može smanjiti stvarnu potrošnju prostora na disku više od osam puta.
Ova je mogućnost dostupna u najnovijoj verziji WebCataloga za računalo na macOS-u. Ne trebate ništa uključivati: nove je aplikacije koriste automatski, a aplikacije koje već imate zauzet će manje prostora pri sljedećem ažuriranju.