Runtime är ett programvarulager som styr körningen av en mobilapps kod: det allokerar minne, hanterar undantag, startar garbage collection och distribuerar metodanrop. Utan runtime kan ingen app köras — det är ett mellanlager mellan kompilerad kod och operativsystemet. Enligt Android Developer Documentation, 2025 är körningsmiljön en nyckeldel av plattformen som avgör prestanda och kompatibilitet.
Viktigast
Runtime (körningsmiljö) är den infrastruktur som säkerställer att ett program körs efter att det startats. I mobilutvecklingssammanhang omfattar runtime klassladdaren, minnesallokatorn, garbage collector, metodutskickaren och undantagshanteraren. Utan detta mellanlager kan operativsystemet inte köra Dalvik-bytekod eller Objective-C-meddelanden.
Mobilplattformar använder olika implementationer av runtime. Android använder ART (Android Runtime) med hybrid AOT/JIT-kompilering. iOS använder Objective-C Runtime — ett dynamiskt system baserat på message passing och SEL-identifierare. Båda metoderna löser samma uppgift: att köra utvecklarens kod på en specifik enhet med maximal prestanda.
Enligt Google I/O 2024 bearbetar Android Runtime mer än 10 miljarder metoder per dag på enheter världen över. Runtimens prestanda påverkar direkt appens starttid, animationernas jämnhet och batteriförbrukningen. Varje metodanrop, varje minnesallokering och varje garbage collection-cykel passerar runtime-lagret.
Runtime-systemet omfattar fem nyckelkomponenter: klassladdare, minneshanterare, interpretator eller kompilator, metodutskickare och säkerhetssystem. Varje komponent fyller en strikt definierad funktion i kodkörningsprocessen.
När användaren startar appen laddar ClassLoader DEX-filer (Android) eller Mach-O-binärfiler (iOS) in i arbetsminnet. På Android inkluderar denna fas verifiering av bytekod: runtime kontrollerar att koden inte innehåller osäkra instruktioner, inte överskrider arraygränserna och följer typerna. Verifieringen är ett kritiskt säkerhetssteg som förhindrar exekvering av skadlig kod.
Memory Manager allokerar och frigör minne för objekt. På Android använder ART en samtidig garbage collector med generationsbaserad insamling: unga objekt kontrolleras oftare, äldre — mer sällan. Objective-C Runtime tillämpar Automatic Reference Counting (ARC), där kompilatorn automatiskt infogar retain/release-anrop.
Method dispatcher avgör vilken metodimplementation som ska anropas. I statiska språk (Kotlin, Swift) sker utskickningen via vtable — tabellen över virtuella metoder. I dynamiska språk (Objective-C) går meddelandet igenom objc_msgSend, som söker implementationen i klassen och dess superklasser. Resultatet cachelagras i method cache för att påskynda upprepade anrop.
Android Runtime (ART) är en virtuell maskin som kör DEX-bytekoden hos Android-appar. ART ersatte Dalvik i Android 5.0 Lollipop och erbjöd AOT-kompilering: appen kompileras till maskinkod en gång under installationen. Detta eliminerade overheaden från JIT-kompilering vid varje start.
Från och med Android 7.0 Nougat använder ART en hybridmetod. Vid installation utförs JIT-kompilering endast för ofta använda metoder (hot methods), medan resten av koden interpreteras. En bakgrundsprocess (profile-guided optimization) analyserar vilka metoder som anropas oftast och kompilerar dem AOT under perioder när enheten är inaktiv. Detta minskar installationstiden och ger samtidigt hög prestanda.
ART innehåller också AOT compiler (dex2oat), som omvandlar DEX-filer till ELF-binärfiler med ARM64-maskinkod. Kompileringen sker med tre optimeringsnivåer: quicken (snabb), optimize (medel) och everything (fullständig). Som standard tillämpar Android optimize, som balanserar kompileringstid och kodprestanda.
class RuntimeExample {
fun measureExecutionTime() {
val start = System.nanoTime()
// Anrop av en metod som kompileras av ART
processData()
val end = System.nanoTime()
println("Körningstid: ${end - start} ns")
}
}I exemplet ovan är System.nanoTime() en nativ metod vars anrop skickas via ART runtime till Linux-kärnan. ART omvandlar Kotlin-bytekod till ARM64-instruktioner som utförs av enhetens processor. Denna process sker osynligt för utvecklaren, men optimeringen av den är en nyckeluppgift för Android Platform-teamet.
Profilbaserad optimering är en ART-mekanism som samlar in profiler över metodanvändning. Filen profiles/
Utvecklaren kan aktivera baseline profiles i sitt Gradle-projekt. Det är manuella annoteringar som visar ART vilka metoder som ska kompileras AOT direkt efter installationen. Baseline profiles förkortar den första starten med 40 % utan att vänta på bakgrundsprofilering.
Objective-C Runtime är ett dynamiskt bibliotek som säkerställer körning av Objective-C-kod på iOS och macOS. Dess kärna är funktionen objc_msgSend, som implementerar message passing: istället för direkt metodanrop skickar objektet ett meddelande med en selector, och runtime avgör vilken implementation som ska köras.
Varje Objective-C-objekt innehåller en isa-pekare till klassen, och klassen har en dispatch table (utskickningstabell) som kopplar selectorer (SEL) till implementationer (IMP). När en metod anropas går objc_msgSend genom kedjan: klass → superklass → NSObject, tills det hittar en IMP. Om implementationen inte hittas anropar runtime forwarding mechanism, som kan fånga upp meddelandet eller generera ett undantag.
Objective-C Runtime stöder även method swizzling — att byta ut IMP:n för en befintlig selector under körningen. Det är en kraftfull mekanism som används i AOP-bibliotek och övervakningsverktyg, men som kräver försiktighet på grund av påverkan på hela appen.
@interface RuntimeDemo : NSObject
- (void)printClassInfo;
@end
@implementation RuntimeDemo
- (void)printClassInfo {
// objc_getClass — runtime-funktion
Class cls = objc_getClass("RuntimeDemo");
unsigned int count;
Method *methods = class_copyMethodList(cls, &count);
NSLog("Antal metoder: %d", count);
}
@endKoden visar direkt åtkomst till Objective-C Runtime API: objc_getClass hämtar klassobjektet efter namn, class_copyMethodList extraherar listan över alla metoder. Det är reflection i praktiken — åtkomst till klassens metadata under körningen. En sådan metod används i XCTest för dynamisk registrering av tester.
isa pointer är en pekare till objektets klass, lagrad i de första 8 byten av varje objekt. Från och med iOS 12 införde Apple isa-swizzling för optimering: isa:s lägre bitar kodar ytterligare information om objektets tillstånd. Tagged pointers är ytterligare en optimering där värden upp till 60 bitar (NSNumber, NSDate) lagras direkt i pekaren, utan att allokera ett objekt i heapen. Detta minskar belastningen på minneshanteraren med 30 %.
JIT (Just-In-Time) och AOT (Ahead-Of-Time) är två metoder för att kompilera bytekod till maskinkod. JIT kompilerar kod under appens körning, analyserar heta områden och optimerar dem i farten. AOT kompilerar all kod i förväg — vid appinstallation eller hos utvecklaren.
| Egenskap | JIT | AOT |
|---|---|---|
| Kompileringstid | Under körning | Vid installation / bygge |
| Storlek på APK/IPA | Mindre (endast bytekod) | Större (maskinkod) |
| Starttid | Längre (kompilering krävs) | Kortare (koden redo att köras) |
| Optimering för enheten | Ja (adaptiv) | Begränsad (generic) |
| RAM-förbrukning | Högre (kompilator i minnet) | Lägre |
ART:s hybridmetod (Android 7+) anses vara optimal: appen använder interpretatorn för sällan anropade metoder, JIT för hot-metoder och AOT för metoder från profile-guided optimization. iOS använder däremot strikt AOT via LLVM: Swift och Objective-C kompileras till maskinkod i byggfasen i Xcode.
Enligt Apple Developer Documentation, 2024 lägger Swift runtime till cirka 15 MB till appens storlek. Flutter använder sin egen Dart VM, där JIT-kompilering fungerar i debug-läge för hot reload och AOT — i release-läge för maximal prestanda. React Native använder Hermes — en JavaScript-motor med AOT-kompilering som minskar starttiden med 50 %.
ARM64 Runtime är den nivå där maskinkoden interagerar med enhetens processor. De flesta moderna mobila enheter körs på ARM64 (aarch64) processorer. Runtime översätter bytekod eller nativa anrop till ARM64-instruktioner som CPU:n utför.
Viktiga ARM64-register som runtime använder: x0–x7 (funktionsparametrar), x8 (indirekt resultat), x30 (returadress), sp (stack pointer), fp (frame pointer). ART genererar kod som följer ARM64 Procedure Call Standard: alla metodanrop går genom protokollet som definieras av processorarkitekturen.
Att förstå ARM64 ABI är viktigt vid prestandaoptimering: inline-cache, branch prediction och kodens justering i minnet påverkar direkt runtime:s arbetshastighet. Profileringsverktyg (Android Studio Profiler, Instruments) visar vilka kodavsnitt som tillbringar mest tid i runtime — det är just optimeringen av dessa som ger störst förbättring.
// Exempel på ARM64-assembly som genereras av ART
// Anrop av en metod med två parametrar
mov x0, x23 // self (this)
mov x1, x24 // param1
mov x2, x25 // param2
bl methodEntryPoint // anrop via runtime
str x0, [sp, #8] // spara resultatetI detta exempel överför ARM64-instruktionerna mov argumenten till registren x0–x2, bl anropar metodens entry point och str sparar returvärdet. Runtime genererar sådana instruktioner för varje metodanrop och optimerar sekvensen genom devirtualization och inlining.
Runtime overhead är det oundvikliga priset för dynamisk utskickning. Varje metodanrop via runtime kräver: sökning av implementationen i dispatch table, typkontroll, anrop av IMP och returnering av resultatet. Mätningar visar att runtime lägger till 10–50 ns per anrop i Objective-C och 5–20 ns i ART.
För att minska overheaden använder utvecklare monomorphic inlining (ART) och method caching (Objective-C). Kotlin/Native och Swift kompileras direkt till ARM64, vilket helt eliminerar runtime-lagret, men förlorar de dynamiska möjligheterna — reflection, swizzling, dynamisk laddning av klasser.
Vanliga frågor
SDK (Software Development Kit) är en verktygsuppsättning för att utveckla appen (kompilator, bibliotek, verktyg). Runtime är den miljö där en redan utvecklad app körs på enheten. SDK behövs av utvecklaren, runtime — av användaren.
Nej — runtime är en del av operativsystemet och kan inte bytas ut av användaren. ART är inbyggd i Android Framework, Objective-C Runtime — i iOS. Utvecklaren kan välja språk (Kotlin/Native utan runtime) eller använda virtuella maskiner som Dart VM i Flutter.
Ja, runtime påverkar energiförbrukningen. Garbage collection i ART och Swift runtime använder CPU, vilket ökar batteriförbrukningen. Optimeringar som concurrent GC och tagged pointers i iOS minskar runtime:s påverkan på batteriet med 20–30 %.
Runtime error är ett fel som uppstår under körningen: null pointer exception, index out of bounds, division med noll. Till skillnad från kompileringsfel upptäcks dessa inte vid bygget. De fångas via try-catch-block eller crash reporting (Firebase Crashlytics, Sentry).
Swift runtime är lättare än Objective-C: det stöder inte dynamic dispatch som standard, använder value types (struct) utan heapallokering och saknar message forwarding. Swift-metoder anropas direkt via vtable om de inte är markerade med @objc dynamic. Detta ger en hastighetsökning på upp till 5x i benchmarks.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också