Sobes.tech
Middle

Čo sa stane, keď používame lambda výrazy na starších verziách Androidu?

sobes.tech AI

Odpoveď od AI

Keď sa v projekte pre staré verzie Androidu (do API 24) používajú lambda výrazy, Kotlin alebo Java kompilátor (pri použití syntaxe lambda z Java 8) ich prevádza na anonymné triedy. Tento proces je automatický a vykonáva sa pomocou nástrojov na zostavovanie, ako je desugaring (pre Java) alebo generovanie bytecode pre Kotlin.

Desugaring je proces, ktorý umožňuje používať nové funkcie jazyka Java, ako sú lambdy, predvolené metódy v rozhraniach, try-with-resources a ďalšie, na starších verziách Androidu, kde tieto funkcie pôvodne nie sú dostupné na úrovni JVM (Dalvik/ART). Nástroje na zostavovanie (napríklad D8/R8) transformujú bytecode generovaný zo zdrojového kódu s použitím nových jazykových funkcií na bytecode kompatibilný s prostredím spustenia cieľovej verzie Androidu.

Pre Kotlin kompilátor tiež prevádza lambdy na príslušné bytecodeové reprezentácie, často pomocou anonymných tried. Pri kompilácii pre staršie verzie Androidu je tento generovaný bytecode tiež kompatibilný s cieľovým prostredím spustenia.

Takže na výstupe získavame bytecode, ktorý funguje na starších verziách Androidu, ale môže obsahovať ďalšie triedy (jednu anonymnú triedu pre každú lambda), čo môže mierne zväčšiť veľkosť APK a dobu behu (kvôli vytváraniu nových objektov).

// Príklad lambda v Jave
Runnable r = () -> System.out.println("Ahoj!");
r.run();

Po desugaringu to môže byť pretransformované na takýto bytecode, ktorý je ekvivalentný:

// Emulovaný výsledok desugaringu pre lambda
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Ahoj!");
    }
};
r.run();

Pre Kotlin je proces podobný, kompilátor prevádza lambdy na ekvivalentnú formu.

// Príklad lambda v Kotlin
val action = { println("Ahoj!") }
action.invoke()

Tento kód bude tiež pretransformovaný na bytecode využívajúci anonymné triedy alebo ekvivalentné konštrukcie, kompatibilné s cieľovou verziou Androidu.

Dôležité je poznamenať, že v moderných vývojových prostrediach Android (Android Studio, Gradle) je desugaring aktivovaný štandardne pre väčšinu projektov používajúcich Kotlin alebo určité verzie Java. To robí používanie lambda a ďalších nových funkcií jazyka Java úplne transparentné pre vývojára, bez potreby ďalších krokov na podporu starších verzií Androidu.