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.