Kako izmjeriti i smanjiti veličinu iOS aplikacije pomoću Xcodea i App Store Connecta

  • PublicPublic
  • 13 Nov, 2026
Kako izmjeriti i smanjiti veličinu iOS aplikacije pomoću Xcodea i App Store Connecta

iOS aplikacije obično rastu sa svakim izdanjem: dodaju se novi SDK-ovi, slike više rezolucije i izvanmrežni sadržaj. Preuzimanje traje dulje, a na uređaju je zauzeto više prostora. Optimizacija počinje mjerenjem jer je glavni izvor veličine kod svake aplikacije drugačiji: kod jednih su to resursi, kod drugih kompilirani kod ili ugrađene ovisnosti. Ni „veličina aplikacije" se ne može svesti na jedan broj. Veličina preuzimanja, veličina instalacije i prostor zauzet nakon korištenja preklapaju se, ali nisu zamjenjivi. Zato u PR-u, mjerenju performansi ili izvještaju timu navedite koja se metrika promijenila i gdje je izmjerena. Ako se neobavezni sadržaj preuzima naknadno, početno preuzimanje i instalacija postaju manji, ali nakon preuzimanja taj sadržaj ipak završi na uređaju. Background Assets, uključujući obavezne pakete i unaprijed preuzeti sadržaj, mogu stići čak i prije prvog pokretanja. Treba ih evidentirati zasebno i uspoređivati pri istom stanju preuzimanja.

Korisnik vidi te brojke na dva mjesta. Na stranici aplikacije u App Storeu polje „Informacije → Veličina” prikazuje veličinu instalacije. Ako aplikacija koristi obvezne pakete resursa na Appleovim poslužiteljima, ondje može stajati vrijednost „Do …” koja uključuje taj sadržaj. U odjeljku „Prostor iPhonea” zasebno su navedeni veličina aplikacije i „Dokumenti i podaci”, koji se gomilaju kako se sadržaj preuzima i aplikacija koristi. Lokalne datoteke APP, XCARCHIVE i IPA pomažu u dijagnostici, ali se ne podudaraju s onim što isporučuje App Store: arhive mogu sadržavati simbole za otklanjanje pogrešaka, a univerzalni IPA nosi resurse za različite uređaje. Da biste procijenili veličinu za određene uređaje, izvezite Release arhivu naredbom xcodebuild -exportArchive s parametrima -archivePath, -exportPath i -exportOptionsPlist. Pri ručnom potpisivanju u plistu su također potrebni signingStyle=manual, teamID i mapiranje provisioningProfiles za svaku aplikaciju ili proširenje.

U mapi izvoza pojavit će se App Thinning Size Report.txt. U njemu su navedene varijante s opisom uređaja i OS-a te vrijednostima poput "112 MB compressed, 260 MB uncompressed". Komprimirana veličina procjena je veličine preuzimanja, a nekomprimirana procjena veličine instalacije. Da biste pregledali paket, odaberite stanjeni IPA prema opisu varijante, a ne prema nazivu datoteke: izvoz može sadržavati i univerzalni IPA. Raspakirajte ga naredbom ditto -x -k u novi direktorij stvoren s mktemp i pronađite .app u mapi Payload. Za App Store i TestFlight stanjivanje uglavnom radi automatski, ali ga treba provjeriti. Ako resursi za pojedine uređaje završe u svim varijantama, provjerite postavke kataloga resursa i zasebne datoteke. Pri usporedbi ne mijenjajte konfiguraciju builda, verziju Xcodea, način potpisivanja, način izvoza ni opis varijante, a zatim ponovite usporedbu s obrađenim vrijednostima iz App Store Connecta. I to su samo procjene: Apple može dodati DRM i ponovno komprimirati datoteke, a veličine u TestFlightu mogu se razlikovati od onih u App Storeu.

Dijagnostika počinje popisom cijelog stanjenog paketa: glavna izvršna datoteka, Frameworks, PlugIns, katalozi resursa i zasebni resursi, lokalizacije, mediji, baze podataka i ML modeli. Naredba find sa stat, sort -n i tail -30 prikazat će najveće datoteke, ali to su logičke nekomprimirane veličine, dakle samo naznaka. Ako je binarna datoteka važna, u Build Settings uključite parametar Write Link Map File (LD_GENERATE_MAP_FILE), izgradite projekt i raščlanite .txt u DerivedData. Grupirajte veličine iz odjeljka # Symbols prema indeksu datoteke, a indekse povežite s odjeljkom # Object files. Tako se vidi težak generirani kod, statičke biblioteke, C++ predlošci i SDK-ovi trećih strana. Zbrojevi po simbolima pokazuju kome pripada težina, ali ne daju potpun obračun: zaglavlja, poravnanje, potpisi i podaci linkera nisu uključeni. Ugrađivanje (inlining), optimizacija cijelog modula i LTO zamagljuju pripadnost koda. Simbole uklonjene kao mrtvi kod isključite, a mapu izradite za svaki build target i arhitekturu.

Tijek rada pokazat ćemo na uvjetnom primjeru s izmišljenim brojkama: mijenjamo samo jednu stvar, ponovno gradimo i iznova generiramo izvještaj za istu varijantu. Aplikacija s mnogo resursa ima 112 MB u komprimiranom i 260 MB u nekomprimiranom obliku. Procjena se smanjuje za 31 MB (oko 28%) i 58 MB (oko 22%), a App Store Connect prikazuje 80 MB preuzimanja i 200 MB instalacije. Ušteda se ne prenosi jedan na jedan: utječu kompilacija, rezanje, kompresija, poravnanje i potpisivanje. Vodič premješten na udaljenu isporuku odgođen je, a ne uklonjen. Nakon njegova preuzimanja zauzeti prostor ponovno raste za otprilike 32 MB, a na disku istodobno mogu biti i arhiva i raspakirane datoteke. Zato testirajte rad bez mreže, ponovne pokušaje, brisanje i ponovno preuzimanje, a delta ažuriranja mjerite zasebno.

Resursi često teže više od koda. Ugrađene slike držite u .xcassets kako bi stanjivanje aplikacije (app thinning) odabiralo resurse za svaki uređaj. Broj piksela treba odgovarati veličini na zaslonu: ikoni od 24 × 24 točke potrebno je 48 × 48 piksela za 2x i 72 × 72 za 3x, a smanjiti je treba prije uvoza. Univerzalnu grafiku koristite zajedničku, varijante za uređaje ili raspon boja dodajte samo kad je potrebno i ne duplicirajte skupove slika. Nakon prijenosa učitavajte slike po imenu, na primjer UIImage(named: "toolbar_search"), a preostale zasebne kopije uklonite iz Copy Bundle Resources. Rezultat potvrdite usporedbom izvještaja za istu varijantu prije i poslije. Za ikone je bolje koristiti sistemske SF Symbols ako to dopuštaju dizajn i minimalna verzija OS-a.