Sobes.tech
Middle

Kas vyksta, kai naudojame lambda išraiškas senesnėse Android versijose?

sobes.tech AI

Atsakymas iš AI

Kai projekte naudojami lambda išraiškos senesnėms Android versijoms (iki API 24), Kotlin arba Java kompiliatorius (naudojant Java 8 lambda sintaksę) juos paverčia į anonimines klases. Šis procesas yra automatinis ir vykdomas naudojant statybos įrankius, tokius kaip desugaring (Java) arba bytecode generavimą Kotlin.

Desugaring – tai procesas, leidžiantis naudoti naujas Java kalbos galimybes, tokias kaip lambdas, numatytas metodus interfeisuose, try-with-resources ir kt., senesnėse Android versijose, kuriose šios galimybės iš pradžių nėra JVM lygyje (Dalvik/ART). Statybos įrankiai (pvz., D8/R8) transformuoja sugeneruotą iš naujų kalbos galimybių šaltinio kodo bytecode į bytecode, suderinamą su tikslinės Android versijos vykdymo aplinka.

Kotlin kompiliatorius taip pat paverčia lambdas į atitinkamas bytecode reprezentacijas, dažnai naudojant anonimines klases. Kompiliuojant senesnėms Android versijoms, šis sugeneruotas bytecode taip pat yra suderinamas su vykdymo aplinka.

Taigi, galutinis rezultatas yra bytecode, kuris veikia senesnėse Android versijose, tačiau gali turėti papildomų klasių (po vieną anoniminių klasių kiekvienai lambda), kas gali šiek tiek padidinti APK dydį ir vykdymo laiką (dėl naujų objektų kūrimo).

// Lambda pavyzdys Java
Runnable r = () -> System.out.println("Labas!");
 r.run();

Po desugaring, tai gali būti paversta į tokį bytecode, kuris yra ekvivalentas:

// Desugaring emuliuotas rezultatas lambda
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Labas!");
    }
};
r.run();

Kotlin procese panašiai, kompiliatorius paverčia lambdas į ekvivalentinę formą.

// Kotlin lambda pavyzdys
val action = { println("Labas!") }
action.invoke()

Šis kodas taip pat bus paverstas į bytecode, naudojant anonimines klases ar ekvivalentines konstrukcijas, suderinamas su tikslinės Android versijos reikalavimais.

Svarbu pažymėti, kad šiuolaikinėse Android kūrimo aplinkose (Android Studio, Gradle) desugaring yra aktyvuotas pagal numatytuosius nustatymus daugumai projektų, naudojančių Kotlin arba tam tikras Java versijas. Tai daro lambda ir kitas naujas kalbos galimybes visiškai skaidrias kūrėjui, nereikalaujant papildomų žingsnių senesnėms Android versijoms palaikyti.