Назад к вопросам
Middle+
113
questionbank

Что такое desugaring и как этот процесс влияет на разработку под Android?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Desugaring — это процесс преобразования синтаксических "сахаров" Java (таких как лямбда-выражения, ссылки на методы, default methods в интерфейсах) в байткод, который совместим со старыми версиями Android SDK, где эти возможности изначально не поддерживались.

Это достигается путем трансформации кода на уровне компиляции или во время сборки Android Gradle Plugin.

Влияние на разработку:

  • Доступ к современным возможностям языка: Позволяет использовать новые фичи Java (например, Stream API, java.time) даже на старых версиях Android, повышая продуктивность и читаемость кода.
  • Совместимость: Обеспечивает работу кода, использующего новые возможности Java, на широком спектре устройств с различными версиями ОС.
  • Размер APK: В некоторых случаях может увеличивать размер APK за счет добавления дополнительного байткода и вспомогательных классов для эмуляции новых возможностей.
  • Производительность: Может иметь незначительное влияние на производительность по сравнению с нативной поддержкой той же функциональности в более новых версиях Android.
  • Сложность сборки: Интеграция desugaring осуществляется автоматически через AGP, упрощая настройку для разработчика. Необходимо убедиться, что используемая версия AGP и Java совместимы.

Пример использования лямбда-выражения, который требует desugaring для поддержки на старых API:

// Пример использования лямбда-выражения
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(s -> System.out.println(s));

// Desugaring преобразует это примерно в следующее (имплементация может отличаться):
/*
List<String> list = Arrays.asList("apple", "banana", "cherry");
for (String s : list) {
    // invoke appropriate method reference or synthetic class
    System.out.println(s);
}
*/

Desugaring для API-интерфейсов (например, java.time) осуществляется через специальную библиотеку и конфигурации в build.gradle.

// build.gradle (Module level)
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // Эта опция включает desugaring для синтаксиса Java 8+
        // И позволяет использовать API из android.jar для старых версий Android
        // которые были добавлены позже (например, java.time)
        // Требует minSdk >= 21
        coreLibraryDesugaringEnabled true
    }
}

dependencies {
    // Эта зависимость предоставляет реализацию недостающих API
    // Требуется для coreLibraryDesugaringEnabled
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}