Runtime is een softwarelaag die de uitvoering van de code van een mobiele app beheert: geheugen toewijzen, uitzonderingen afhandelen, garbage collection starten en methodeaanroepen verzenden. Zonder runtime kan geen enkele app worden uitgevoerd — het is een tussenlaag tussen gecompileerde code en het besturingssysteem. Volgens Android Developer Documentation, 2025 is de runtime-omgeving een sleutelelement van het platform dat prestaties en compatibiliteit bepaalt.
Belangrijkste punten
Runtime (uitvoeringsomgeving) is de infrastructuur die de uitvoering van een programma na het starten ervan verzorgt. In de context van mobiele ontwikkeling omvat runtime de klassenlader, geheugenallocator, garbage collector, methodeverzender en uitzonderingshandler. Zonder deze tussenlaag kan het besturingssysteem Dalvik-bytecode of Objective-C-berichten niet uitvoeren.
Mobiele platforms gebruiken verschillende implementaties van runtime. Android past ART (Android Runtime) toe met hybride AOT/JIT-compilatie. iOS gebruikt Objective-C Runtime — een dynamisch systeem gebaseerd op message passing en SEL-identificatoren. Beide benaderingen lossen hetzelfde probleem op: de code van de ontwikkelaar op een specifiek apparaat uitvoeren met maximale prestaties.
Volgens Google I/O 2024 verwerkt Android Runtime dagelijks meer dan 10 miljard methoden op apparaten wereldwijd. De prestaties van runtime beïnvloeden rechtstreeks de opstartsnelheid van de app, de vloeiendheid van animaties en het batterijverbruik. Elke methodeaanroep, elke geheugentoewijzing en elke garbage collection-cyclus gaat door de runtielaag.
Het runtime-systeem omvat vijf sleutelcomponenten: klassenlader, geheugenbeheer, interpreter of compiler, methodeverzender en beveiligingssysteem. Elke component vervult een strikt gedefinieerde functie in het proces van code-uitvoering.
Wanneer de gebruiker een app start, laadt ClassLoader DEX-bestanden (Android) of Mach-O-binaire bestanden (iOS) in het werkgeheugen. Op Android omvat deze fase de verificatie van bytecode: runtime controleert of de code geen onveilige instructies bevat, niet buiten de grenzen van arrays treedt en types respecteert. Verificatie is een kritieke beveiligingsstap die de uitvoering van schadelijke code voorkomt.
Memory Manager wijst geheugen toe aan en maakt geheugen vrij voor objecten. In Android gebruikt ART een concurrent garbage collector met generationele collectie: jonge objecten worden vaker gecontroleerd, oude — minder vaak. Objective-C Runtime past Automatic Reference Counting (ARC) toe, waarbij de compiler automatisch retain/release-aanroepen invoegt.
Method dispatcher bepaalt welke implementatie van een methode wordt aangeroepen. In statische talen (Kotlin, Swift) gebeurt verzending via vtable — de tabel van virtuele methoden. In dynamische talen (Objective-C) gaat het bericht door objc_msgSend, dat de implementatie zoekt in de klasse en zijn superklassen. Het resultaat wordt opgeslagen in de method cache om herhaalde aanroepen te versnellen.
Android Runtime (ART) is een virtuele machine die de DEX-bytecode van Android-apps uitvoert. ART verving Dalvik in Android 5.0 Lollipop en bood AOT-compilatie: de app wordt één keer tijdens de installatie naar machinecode gecompileerd. Dit elimineerde de overhead van JIT-compilatie bij elke start.
Vanaf Android 7.0 Nougat gebruikt ART een hybride aanpak. Tijdens de installatie wordt JIT-compilatie alleen uitgevoerd voor veelgebruikte methoden (hot methods), de rest van de code wordt geïnterpreteerd. Een achtergrondproces (profile-guided optimization) analyseert welke methoden het vaakst worden aangeroepen en compileert ze AOT in periodes dat het apparaat inactief is. Dit verkort de installatietijd en levert tegelijkertijd hoge prestaties.
ART bevat ook AOT compiler (dex2oat), die DEX-bestanden omzet naar ELF-binaire bestanden met ARM64-machinecode. De compilatie gebeurt met drie optimalisatieniveaus: quicken (snel), optimize (gemiddeld) en everything (volledig). Standaard past Android optimize toe, dat een balans vindt tussen compilatiesnelheid en code-prestaties.
class RuntimeExample {
fun measureExecutionTime() {
val start = System.nanoTime()
// Aanroep van een methode die door ART wordt gecompileerd
processData()
val end = System.nanoTime()
println("Uitvoeringstijd: ${end - start} ns")
}
}In het bovenstaande voorbeeld is System.nanoTime() een native methode waarvan de aanroep via ART runtime naar de Linux-kernel wordt verzonden. ART zet Kotlin-bytecode om naar ARM64-instructies die door de processor van het apparaat worden uitgevoerd. Dit proces vindt voor de ontwikkelaar onmerkbaar plaats, maar de optimalisatie ervan is een kerntaak van het Android Platform-team.
Profile-guided optimalisatie is een ART-mechanisme dat gebruikersprofielen van methoden verzamelt. Het bestand profiles/
De ontwikkelaar kan baseline profiles inschakelen in zijn Gradle-project. Dit zijn handmatige annotaties die ART aangeven welke methoden onmiddellijk na installatie AOT te compileren. Baseline profiles verkorten de eerste start met 40% zonder te wachten op achtergrondprofilering.
Objective-C Runtime is een dynamische bibliotheek die de uitvoering van Objective-C-code op iOS en macOS verzorgt. De kern is de functie objc_msgSend, die message passing implementeert: in plaats van een directe methodeaanroep stuurt het object een bericht met een selector, en bepaalt runtime welke implementatie moet worden uitgevoerd.
Elk Objective-C-object bevat een isa-aanwijzer naar de klasse, en de klasse heeft een dispatch table (verzendtabel) die selectors (SEL) koppelt aan implementaties (IMP). Wanneer een methode wordt aangeroepen, doorloopt objc_msgSend de keten: klasse → superklasse → NSObject, totdat het een IMP vindt. Als de implementatie niet wordt gevonden, roept runtime het forwarding mechanism aan, dat het bericht kan onderscheppen of een uitzondering kan genereren.
Objective-C Runtime ondersteunt ook method swizzling — het vervangen van de IMP van een bestaande selector tijdens de uitvoering. Dit is een krachtig mechanisme dat wordt gebruikt in AOP-bibliotheken en monitoringtools, maar dat voorzichtigheid vereist vanwege de impact op de hele app.
@interface RuntimeDemo : NSObject
- (void)printClassInfo;
@end
@implementation RuntimeDemo
- (void)printClassInfo {
// objc_getClass — runtime-functie
Class cls = objc_getClass("RuntimeDemo");
unsigned int count;
Method *methods = class_copyMethodList(cls, &count);
NSLog("Aantal methoden: %d", count);
}
@endDe code toont directe toegang tot Objective-C Runtime API: objc_getClass haalt het klasse-object op op naam, class_copyMethodList extraheert de lijst van alle methoden. Dit is reflectie in actie — toegang tot klasse-metadata tijdens de uitvoering. Een dergelijke aanpak wordt in XCTest gebruikt voor dynamische registratie van tests.
isa pointer is een aanwijzer naar de klasse van een object, opgeslagen in de eerste 8 bytes van elk object. Vanaf iOS 12 heeft Apple isa-swizzling ingevoerd voor optimalisatie: de lagere bits van isa coderen aanvullende informatie over de status van het object. Tagged pointers zijn een andere optimalisatie, waarbij waarden tot 60 bits (NSNumber, NSDate) rechtstreeks in de aanwijzer worden opgeslagen, zonder een object in de heap toe te wijzen. Dit vermindert de belasting van de geheugenbeheerder met 30%.
JIT (Just-In-Time) en AOT (Ahead-Of-Time) zijn twee benaderingen om bytecode naar machinecode te compileren. JIT compileert code tijdens de uitvoering van de app, analyseert hot spots en optimaliseert ze ter plaatse. AOT compileert alle code vooraf — bij de installatie van de app of aan de kant van de ontwikkelaar.
| Kenmerk | JIT | AOT |
|---|---|---|
| Compilatietijd | Tijdens de uitvoering | Bij installatie / build |
| Grootte van APK/IPA | Kleiner (alleen bytecode) | Groter (machinecode) |
| Opstartsnelheid | Lager (compilatie nodig) | Hoger (code klaar voor uitvoering) |
| Optimalisatie voor apparaat | Ja (adaptief) | Beperkt (generic) |
| RAM-verbruik | Hoger (compiler in geheugen) | Lager |
De hybride aanpak van ART (Android 7+) wordt als optimaal beschouwd: de app gebruikt de interpreter voor zelden aangeroepen methoden, JIT voor hot-methoden en AOT voor methoden uit profile-guided optimization. iOS gebruikt daarentegen strikte AOT via LLVM: Swift en Objective-C worden in de build-fase in Xcode naar machinecode gecompileerd.
Volgens Apple Developer Documentation, 2024 voegt Swift runtime ongeveer 15 MB toe aan de grootte van de app. Flutter gebruikt zijn eigen Dart VM, waar JIT-compilatie in debug-modus werkt voor hot reload en AOT — in release-modus voor maximale prestaties. React Native gebruikt Hermes — een JavaScript-engine met AOT-compilatie die de opstarttijd met 50% verkort.
ARM64 Runtime is het niveau waarop machinecode interageert met de processor van het apparaat. De meeste moderne mobiele apparaten draaien op ARM64 (aarch64) processors. Runtime vertaalt bytecode of native aanroepen naar ARM64-instructies die de CPU uitvoert.
Belangrijke ARM64-registers die runtime gebruikt: x0–x7 (functieparameters), x8 (indirect resultaat), x30 (retouradres), sp (stack pointer), fp (frame pointer). ART genereert code die de ARM64 Procedure Call Standard respecteert: alle methodeaanroepen doorlopen het protocol dat door de processorarchitectuur is gedefinieerd.
Het begrijpen van ARM64 ABI is belangrijk bij prestatieoptimalisatie: inline-caching, branch prediction en het uitlijnen van code in het geheugen beïnvloeden rechtstreeks de werksnelheid van runtime. Profilingtools (Android Studio Profiler, Instruments) tonen welke codedelen het meeste tijd in runtime doorbrengen — juist de optimalisatie daarvan levert de grootste winst op.
// Voorbeeld van ARM64 assembly gegenereerd door ART
// Aanroep van een methode met twee parameters
mov x0, x23 // self (this)
mov x1, x24 // param1
mov x2, x25 // param2
bl methodEntryPoint // aanroep via runtime
str x0, [sp, #8] // opslaan van het resultaatIn dit voorbeeld brengen ARM64-instructies mov argumenten over naar de registers x0–x2, roept bl het entry point van de methode aan en slaat str de retourwaarde op. Runtime genereert dergelijke instructies voor elke methodeaanroep, waarbij de sequentie wordt geoptimaliseerd via devirtualization en inlining.
Runtime overhead is de onvermijdelijke prijs van dynamische verzending. Elke methodeaanroep via runtime vereist: het zoeken van de implementatie in de dispatch table, het controleren van types, het aanroepen van IMP en het retourneren van het resultaat. Metingen tonen aan dat runtime 10–50 ns per aanroep toevoegt in Objective-C en 5–20 ns in ART.
Om de overhead te verminderen gebruiken ontwikkelaars monomorphic inlining (ART) en method caching (Objective-C). Kotlin/Native en Swift worden rechtstreeks naar ARM64 gecompileerd, waardoor de runtielaag volledig wordt geëlimineerd, maar de dynamische mogelijkheden — reflectie, swizzling, dynamisch laden van klassen — verloren gaan.
Veelgestelde vragen
SDK (Software Development Kit) is een set tools voor het ontwikkelen van de app (compiler, bibliotheken, hulpprogramma's). Runtime is de omgeving waarin een reeds ontwikkelde app op het apparaat wordt uitgevoerd. SDK is nodig voor de ontwikkelaar, runtime — voor de gebruiker.
Nee — runtime is onderdeel van het besturingssysteem en kan niet door de gebruiker worden vervangen. ART is ingebouwd in Android Framework, Objective-C Runtime — in iOS. De ontwikkelaar kan een taal kiezen (Kotlin/Native zonder runtime) of virtuele machines gebruiken zoals Dart VM in Flutter.
Ja, runtime beïnvloedt het energieverbruik. Garbage collection in ART en Swift runtime gebruiken de CPU, wat het batterijverbruik verhoogt. Optimalisaties zoals concurrent GC en tagged pointers in iOS verminderen de impact van runtime op de batterij met 20–30%.
Runtime error is een fout die tijdens de uitvoering optreedt: null pointer exception, index out of bounds, delen door nul. In tegenstelling tot compile-time-fouten worden deze niet gedetecteerd bij de build. Ze worden opgevangen via try-catch-blokken of crash reporting (Firebase Crashlytics, Sentry).
Swift runtime is lichter dan Objective-C: het ondersteunt geen dynamic dispatch standaard, gebruikt value types (struct) zonder toewijzing in de heap en heeft geen message forwarding. Swift-methoden worden direct via vtable aangeroepen als ze niet met @objc dynamic zijn gemarkeerd. Dit levert een snelheidswinst tot 5x op in benchmarks.
Conclusies
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook