Sobes.tech
Middle

Šta se dešava kada koristimo lambda izraze na starijim verzijama Androida?

sobes.tech АИ

Одговор од АИ

Када се у пројекту за старе верзије Андроид (до API 24) користе лямбда изрази, Kotlin или Java компајлер (при коришћењу синтаксиса лямбда из Java 8) их претвара у анонимне класе. Овај процес је аутоматски и извршава се помоћу алатки за изградњу као што је десугаринг (за Java) или генерација байткода за Kotlin.

Десугаринг је процес који омогућава коришћење нових могућности Јава језика, као што су лямбде, подразумеване методе у интерфејсима, try-with-resources и друге, на старијим верзијама Андроид-а, где ове могућности у почетку нису доступне на нивоу JVM (Dalvik/ART). Алатке за изградњу (нпр. D8/R8) трансформишу байткод генерисан из изворног кода са новим језичким могућностима у байткод који је компатибилан са окружењем извршења циљане верзије Андроид-а.

За Kotlin, компајлер такође претвара лямбде у одговарајућа байткодна представљања, често користећи анонимне класе. При компилацији за старе верзије Андроид-а, овај генерисани байткод је такође компатибилан са циљаним окружењем извршења.

Дакле, као резултат добијамо байткод који ради на старим верзијама Андроид-а, али може садржати додатне класе (једну анонимну класу за сваку лямбду), што може мало повећати величину APK-а и време извршавања (због креирања нових објеката).

// Пример лямбде у Јави
Runnable r = () -> System.out.println("Здраво!");
r.run();

Након десугаринга, ово може бити претворено у байткод који је еквивалентан:

// Емулирани резултат десугаринга за лямбду
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Здраво!");
    }
};
r.run();

За Kotlin, процес је сличан, компајлер претвара лямбде у еквивалентну форму.

// Пример лямбде у Kotlin
val action = { println("Здраво!") }
action.invoke()

Овај код ће такође бити претворен у байткод који користи анонимне класе или еквивалентне конструкције, компатибилне са циљаном верзијом Андроид-а.

Важно је напоменути да је у савременим окружењима за развој Андроид (Android Studio, Gradle) десугаринг активиран по подразумевану за већину пројеката који користе Kotlin или одређене верзије Јаве. Ово чини коришћење лямбда и других нових могућности ЈП лако доступним без додатних корака за подршку старим верзијама Андроид-а.