Sobes.tech
Middle

Co się dzieje, gdy używamy wyrażeń lambda na starszych wersjach Androida?

sobes.tech AI

Odpowiedź od AI

Kiedy w projekcie dla starszych wersji Androida (przed API 24) używane są wyrażenia lambda, kompilator Kotlin lub Java (przy użyciu składni lambda z Java 8) przekształca je w klasy anonimowe? Proces ten jest automatyczny i wykonywany za pomocą narzędzi budowania, takich jak desugaring (dla Java) lub generowanie bytecode w Kotlin.

Desugaring to proces, który pozwala na korzystanie z nowych funkcji języka Java, takich jak lambdy, metody domyślne w interfejsach, try-with-resources i inne, na starszych wersjach Androida, na których te funkcje nie są dostępne na poziomie JVM (Dalvik/ART). Narzędzia budowania (np. D8/R8) przekształcają bytecode generowany z kodu źródłowego korzystającego z nowych funkcji języka w bytecode kompatybilny z środowiskiem wykonawczym docelowej wersji Androida.

Dla Kotlin, kompilator również konwertuje lambdy na odpowiednie reprezentacje bytecode, często używając klas anonimowych. Przy kompilacji dla starszych wersji Androida, ten wygenerowany bytecode jest również kompatybilny z docelowym środowiskiem wykonawczym.

W związku z tym, wynikowy bytecode działa na starszych wersjach Androida, ale może zawierać dodatkowe klasy (jedna klasa anonimowa na każdą lambdę), co może nieznacznie zwiększyć rozmiar APK i czas wykonania (z powodu tworzenia nowych obiektów).

// Przykład lambdy w Java
Runnable r = () -> System.out.println("Cześć!");
r.run();

Po desugaringu, może on być przekształcony mniej więcej w taki bytecode, który jest równoważny:

// Emulowany wynik desugaringu dla lambdy
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Cześć!");
    }
};
 r.run();

Dla Kotlin, proces jest podobny, kompilator również przekształca lambdy w równoważną formę.

// Przykład lambdy w Kotlin
val action = { println("Cześć!") }
action.invoke()

Ten kod również zostanie przekształcony w bytecode używający klas anonimowych lub równoważnych konstrukcji, kompatybilnych z docelową wersją Androida.

Ważne jest, aby zauważyć, że w nowoczesnych środowiskach programistycznych Android (Android Studio, Gradle), desugaring jest domyślnie aktywowany dla większości projektów korzystających z Kotlin lub określonych wersji Java. To sprawia, że korzystanie z lambd i innych nowych funkcji języka jest całkowicie przezroczyste dla programisty, bez konieczności podejmowania dodatkowych kroków w celu obsługi starszych wersji Androida.