Sobes.tech
Middle

Wat gebeurt er wanneer we lambda-uitdrukkingen gebruiken op oudere versies van Android?

sobes.tech AI

Antwoord van AI

Wanneer worden lambda-uitdrukkingen gebruikt in een project voor oudere Android-versies (voor API 24), en hoe zet de Kotlin- of Java-compiler (bij gebruik van de lambda-syntaxis van Java 8) ze om in anonieme klassen? Dit proces is automatisch en wordt uitgevoerd met build-tools zoals desugaring (voor Java) of bytecode-generatie in Kotlin.

Desugaring is een proces dat het mogelijk maakt om nieuwe functies van de Java-taal te gebruiken, zoals lambdas, standaardmethoden in interfaces, try-with-resources en andere, op oudere Android-versies waar deze functies niet beschikbaar zijn op JVM-niveau (Dalvik/ART). Build-tools (bijvoorbeeld D8/R8) transformeren de gegenereerde bytecode van broncode die deze nieuwe taalfeatures gebruikt, naar bytecode die compatibel is met de runtime-omgeving van de doel-Android-versie.

Voor Kotlin converteert de compiler ook lambdas naar geschikte bytecode-representaties, vaak met behulp van anonieme klassen. Bij compilatie voor oudere Android-versies is deze gegenereerde bytecode ook compatibel met de doel-runtime.

Hierdoor werkt de resulterende bytecode op oudere Android-versies, maar kan het extra klassen bevatten (één anonieme klasse per lambda), wat de APK-grootte en de uitvoeringstijd licht kan verhogen (door het creëren van nieuwe objecten).

// Voorbeeld van lambda in Java
Runnable r = () -> System.out.println("Hallo!");
 r.run();

Na desugaring kan dit ongeveer worden omgezet in de volgende bytecode, die gelijkwaardig is:

// Geëmuleerde desugaring-resultaat voor lambda
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hallo!");
    }
};
 r.run();

Voor Kotlin is het proces vergelijkbaar, de compiler zet lambdas ook om in een equivalente vorm.

// Voorbeeld van lambda in Kotlin
val action = { println("Hallo!") }
action.invoke()

Deze code wordt ook omgezet in bytecode die gebruikmaakt van anonieme klassen of equivalente constructies, compatibel met de doel-Android-versie.

Het is belangrijk op te merken dat in moderne Android-ontwikkelomgevingen (Android Studio, Gradle) desugaring standaard is ingeschakeld voor de meeste projecten die Kotlin of bepaalde Java-versies gebruiken. Dit maakt het gebruik van lambdas en andere nieuwe taalfeatures volledig transparant voor de ontwikkelaar, zonder extra stappen om oudere Android-versies te ondersteunen.