Runtime je softwarová vrstva, která řídí vykonávání kódu mobilní aplikace: přiděluje paměť, zpracovává výjimky, spouští garbage collection a distribuuje volání metod. Bez runtime nemůže běžet žádná aplikace — je to mezivrstva mezi zkompilovaným kódem a operačním systémem. Podle Android Developer Documentation, 2025 je běhové prostředí klíčovým prvkem platformy, který určuje výkon a kompatibilitu.
Nejdůležitější
Runtime (běhové prostředí) je infrastruktura, která zajišťuje vykonávání programu po jeho spuštění. V kontextu vývoje mobilních aplikací runtime zahrnuje zavaděč tříd, alokátor paměti, garbage collector, distributor metod a zpracování výjimek. Bez této mezivrstvy nemůže operační systém vykonat bajtkód Dalvik nebo zprávy Objective-C.
Mobilní platformy používají různé implementace runtime. Android používá ART (Android Runtime) s hybridní AOT/JIT kompilací. iOS používá Objective-C Runtime — dynamický systém založený na message passing a identifikátorech SEL. Oba přístupy řeší stejný úkol: vykonat kód vývojáře na konkrétním zařízení s maximálním výkonem.
Podle Google I/O 2024 zpracovává Android Runtime více než 10 miliard metod denně na zařízeních po celém světě. Výkon runtime přímo ovlivňuje rychlost spouštění aplikace, plynulost animací a spotřebu baterie. Každé volání metody, každé přidělení paměti a každý cyklus garbage collection prochází vrstvou runtime.
Runtime systém zahrnuje pět klíčových komponent: zavaděč tříd, správce paměti, interpret nebo kompilátor, distributor metod a bezpečnostní systém. Každá komponenta plní přesně definovanou funkci v procesu vykonávání kódu.
Když uživatel spustí aplikaci, ClassLoader načte soubory DEX (Android) nebo binární soubory Mach-O (iOS) do operační paměti. Na Androidu tato fáze zahrnuje ověřování bajtkódu: runtime kontroluje, že kód neobsahuje nebezpečné instrukce, nepřekračuje hranice polí a dodržuje typy. Ověřování je kritickým bezpečnostním krokem, který brání vykonávání škodlivého kódu.
Memory Manager přiděluje a uvolňuje paměť pro objekty. Na Androidu ART používá concurrent garbage collector s generačním sběrem: mladé objekty se kontrolují častěji, staré — méně často. Objective-C Runtime používá Automatic Reference Counting (ARC), kde kompilátor automaticky vkládá volání retain/release.
Method dispatcher určuje, která implementace metody bude volána. Ve statických jazycích (Kotlin, Swift) se distribuce provádí přes vtable — tabulku virtuálních metod. V dynamických (Objective-C) zpráva prochází přes objc_msgSend, který hledá implementaci ve třídě a jejích nadtřídách. Výsledek se ukládá do method cache pro urychlení opakovaných volání.
Android Runtime (ART) je virtuální stroj, který vykonává bajtkód DEX aplikací pro Android. ART nahradil Dalvik v Androidu 5.0 Lollipop a nabídl AOT kompilaci: aplikace se zkompiluje do strojového kódu jednou během instalace. To odstranilo režii JIT kompilace při každém spuštění.
Od Androidu 7.0 Nougat používá ART hybridní přístup. Při instalaci se JIT kompilace provádí pouze pro často používané metody (hot methods), zbytek kódu se interpretuje. Proces na pozadí (profile-guided optimization) analyzuje, které metody se volají nejčastěji, a kompiluje je AOT v době nečinnosti zařízení. To zkracuje dobu instalace a zároveň zajišťuje vysoký výkon.
ART také obsahuje AOT compiler (dex2oat), který převádí soubory DEX na binární soubory ELF se strojovým kódem ARM64. Kompilace probíhá se třemi úrovněmi optimalizace: quicken (rychlá), optimize (střední) a everything (úplná). Ve výchozím nastavení Android používá optimize, která vyvažuje rychlost kompilace a výkon kódu.
class RuntimeExample {
fun measureExecutionTime() {
val start = System.nanoTime()
// Volání metody, kterou kompiluje ART
processData()
val end = System.nanoTime()
println("Doba běhu: ${end - start} ns")
}
}Ve výše uvedeném příkladu je System.nanoTime() nativní metoda, jejíž volání je distribuováno přes ART runtime do jádra Linuxu. ART převádí bajtkód Kotlin na instrukce ARM64, které vykonává procesor zařízení. Tento proces probíhá pro vývojáře nepostřehnutelně, ale jeho optimalizace je klíčovým úkolem týmu Android Platform.
Optimalizace řízená profily je mechanismus ART, který shromažďuje profily používání metod. Soubor profiles/
Vývojář může v projektu Gradle povolit baseline profiles. Jsou to ruční anotace, které ART ukazují, které metody kompilovat AOT ihned po instalaci. Baseline profiles zkracují první spuštění o 40 % bez čekání na profilování na pozadí.
Objective-C Runtime je dynamická knihovna, která zajišťuje vykonávání kódu Objective-C na iOS a macOS. Jejím jádrem je funkce objc_msgSend, která implementuje message passing: místo přímého volání metody objekt odešle zprávu se selektorem a runtime určí, která implementace se má vykonat.
Každý objekt Objective-C obsahuje ukazatel isa na třídu a třída má dispatch table (tabulku distribuce), která mapuje selektory (SEL) na implementace (IMP). Když se volá metoda, objc_msgSend prochází řetězec: třída → nadtřída → NSObject, dokud nenajde IMP. Pokud se implementace nenajde, runtime spustí forwarding mechanism, který může zprávu zachytit nebo vygenerovat výjimku.
Objective-C Runtime také podporuje method swizzling — nahrazení IMP existujícího selektoru během běhu. Je to mocný mechanismus používaný v knihovnách AOP a nástrojích pro monitorování, ale vyžaduje opatrnost kvůli vlivu na celou aplikaci.
@interface RuntimeDemo : NSObject
- (void)printClassInfo;
@end
@implementation RuntimeDemo
- (void)printClassInfo {
// objc_getClass — funkce runtime
Class cls = objc_getClass("RuntimeDemo");
unsigned int count;
Method *methods = class_copyMethodList(cls, &count);
NSLog("Počet metod: %d", count);
}
@endKód demonstruje přímý přístup k Objective-C Runtime API: objc_getClass získá objekt třídy podle jména, class_copyMethodList extrahuje seznam všech metod. To je reflection v praxi — přístup k metadatům třídy za běhu. Tento přístup se používá v XCTest pro dynamickou registraci testů.
isa pointer je ukazatel na třídu objektu, uložený v prvních 8 bajtech každého objektu. Od iOS 12 Apple zavedl isa-swizzling pro optimalizaci: nižší bity isa kódují další informace o stavu objektu. Tagged pointers jsou další optimalizace, při níž se hodnoty do 60 bitů (NSNumber, NSDate) ukládají přímo do ukazatele bez přidělení objektu na haldě. To snižuje zatížení správce paměti o 30 %.
JIT (Just-In-Time) a AOT (Ahead-Of-Time) jsou dva přístupy ke kompilaci bajtkódu do strojového kódu. JIT kompiluje kód během běhu aplikace, analyzuje horká místa a optimalizuje je za běhu. AOT kompiluje celý kód předem — při instalaci aplikace nebo na straně vývojáře.
| Charakteristika | JIT | AOT |
|---|---|---|
| Doba kompilace | Během běhu | Při instalaci / sestavení |
| Velikost APK/IPA | Menší (jen bajtkód) | Větší (strojový kód) |
| Rychlost spouštění | Nižší (nutná kompilace) | Vyšší (kód připraven k běhu) |
| Optimalizace pro zařízení | Ano (adaptivní) | Omezená (generic) |
| Spotřeba RAM | Vyšší (kompilátor v paměti) | Nižší |
Hybridní přístup ART (Android 7+) je považován za optimální: aplikace používá interpret pro málo volané metody, JIT pro hot metody a AOT pro metody z profile-guided optimization. iOS naopak používá přísný AOT přes LLVM: Swift a Objective-C se kompilují do strojového kódu ve fázi sestavení v Xcode.
Podle Apple Developer Documentation, 2024 přidává Swift runtime k velikosti aplikace asi 15 MB. Flutter používá vlastní Dart VM, kde JIT kompilace funguje v režimu debug pro hot reload a AOT — v režimu release pro maximální výkon. React Native používá Hermes — JavaScriptový engine s AOT kompilací, který zkracuje dobu spouštění o 50 %.
ARM64 Runtime je úroveň, na které strojový kód interaguje s procesorem zařízení. Většina moderních mobilních zařízení běží na procesorech ARM64 (aarch64). Runtime překládá bajtkód nebo nativní volání na instrukce ARM64, které vykonává CPU.
Klíčové registry ARM64 používané runtime: x0–x7 (parametry funkcí), x8 (nepřímý výsledek), x30 (návratová adresa), sp (stack pointer), fp (frame pointer). ART generuje kód, který dodržuje ARM64 Procedure Call Standard: všechna volání metod procházejí protokolem definovaným architekturou procesoru.
Pochopení ARM64 ABI je důležité při optimalizaci výkonu: inline-caching, predikce větvení a zarovnání kódu v paměti přímo ovlivňují rychlost práce runtime. Profilovací nástroje (Android Studio Profiler, Instruments) ukazují, které části kódu tráví nejvíce času v runtime — právě jejich optimalizace přináší největší zlepšení.
// Příklad ARM64 assembly generovaného ART
// Volání metody se dvěma parametry
mov x0, x23 // self (this)
mov x1, x24 // param1
mov x2, x25 // param2
bl methodEntryPoint // volání přes runtime
str x0, [sp, #8] // uložení výsledkuV tomto příkladu instrukce ARM64 mov přenášejí argumenty do registrů x0–x2, bl volá vstupní bod metody a str ukládá návratovou hodnotu. Runtime generuje takové instrukce pro každé volání metody a optimalizuje sekvenci pomocí devirtualization a inlining.
Runtime overhead je nevyhnutelná cena za dynamickou distribuci. Každé volání metody přes runtime vyžaduje: hledání implementace v dispatch table, kontrolu typů, volání IMP a vrácení výsledku. Měření ukazují, že runtime přidává 10–50 ns na volání v Objective-C a 5–20 ns v ART.
Ke snížení režie používají vývojáři monomorphic inlining (ART) a method caching (Objective-C). Kotlin/Native a Swift se kompilují přímo do ARM64, zcela odstraňují vrstvu runtime, ale ztrácejí dynamické možnosti — reflection, swizzling, dynamické načítání tříd.
Často kladené otázky
SDK (Software Development Kit) je sada nástrojů pro vývoj aplikace (kompilátor, knihovny, nástroje). Runtime je prostředí, ve kterém se již vyvinutá aplikace spouští na zařízení. SDK potřebuje vývojář, runtime — uživatel.
Ne — runtime je součástí operačního systému a uživatel ho nemůže vyměnit. ART je zabudován do Android Framework, Objective-C Runtime — do iOS. Vývojář může zvolit jazyk (Kotlin/Native bez runtime) nebo použít virtuální stroje, jako je Dart VM ve Flutteru.
Ano, runtime ovlivňuje spotřebu energie. Garbage collection v ART a Swift runtime používají CPU, což zvyšuje spotřebu baterie. Optimalizace jako concurrent GC a tagged pointers v iOS snižují vliv runtime na baterii o 20–30 %.
Runtime error je chyba, která vzniká během běhu: null pointer exception, index out of bounds, dělení nulou. Na rozdíl od chyb v kompilaci se tyto při sestavení neodhalí. Zachytávají se pomocí bloků try-catch nebo crash reporting (Firebase Crashlytics, Sentry).
Swift runtime je lehčí než Objective-C: ve výchozím nastavení nepodporuje dynamic dispatch, používá value types (struct) bez přidělení na haldě a nemá message forwarding. Metody Swift se volají přímo přes vtable, pokud nejsou označeny @objc dynamic. To přináší zvýšení rychlosti až 5x v benchmarkách.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také