Как настроить плагин библиотеки Android Gradle для KMP

Плагин Gradle com.android.kotlin.multiplatform.library – это официально поддерживаемый инструмент для добавления целевой платформы Android в модуль библиотеки Kotlin Multiplatform (KMP). Он упрощает настройку проекта, повышает производительность сборки и обеспечивает лучшую интеграцию с Android Studio.

Использование плагина com.android.library для разработки KMP зависит от API плагина Android Gradle, которые устарели и требуют согласия в плагине Android Gradle версии 9.0 и выше (четвертый квартал 2025 года). Планируется, что эти API будут удалены из плагина Android Gradle версии 10.0 (вторая половина 2026 г.).

Чтобы применить этот плагин, ознакомьтесь с разделом Применение плагина Android-KMP. Если вам нужно перейти с устаревших API, ознакомьтесь с руководством по переносу.

Чтобы перейти на AGP 9.0+, вы можете использовать навык агента, созданный JetBrains для приложений KMP. Подробнее о том, как использовать навыки в Android Studio… Помните, что результаты ИИ не полностью предсказуемы.

Основные функции и различия

Плагин Android-KMP разработан специально для проектов KMP и отличается от стандартного плагина com.android.library по нескольким ключевым аспектам:

  • Архитектура с одним вариантом. Плагин использует один вариант, удаляя поддержку версий продукта и типов сборки, что упрощает настройку и повышает производительность сборки.

  • Оптимизация для KMP. Плагин разработан для библиотек KMP и ориентирован на общий код Kotlin и совместимость. Он не поддерживает нативные сборки для Android, AIDL и RenderScript.

  • Тесты отключены по умолчанию. Чтобы ускорить сборку, модульные и инструментальные тесты отключены по умолчанию. При необходимости вы можете включить их.

  • Нет расширения Android верхнего уровня. Конфигурация обрабатывается с помощью блока android в Gradle KMP DSL, что позволяет поддерживать согласованную структуру проекта KMP. Отсутствует блок расширения android верхнего уровня.

  • Включить компиляцию Java. По умолчанию компиляция Java отключена. Чтобы включить его, используйте withJava() в блоке android. Это позволяет сократить время сборки, когда компиляция Java не требуется.

Преимущества плагина библиотеки Android-KMP

Плагин Android-KMP предоставляет следующие преимущества для проектов KMP:

  • Повышенная производительность и стабильность сборки. Плагин разработан для оптимизации скорости сборки и повышения стабильности проектов KMP. Ориентация на рабочие процессы KMP способствует более эффективному и надежному процессу сборки.

  • Улучшенная интеграция с IDE. Она обеспечивает более эффективное автозаполнение кода, навигацию, отладку и в целом упрощает работу с библиотеками KMP Android.

  • Упрощенная настройка проекта. Плагин упрощает настройку проектов KMP, устраняя сложности, связанные с Android, такие как варианты сборки. Это позволяет создавать более понятные и удобные в обслуживании файлы сборки. Ранее при использовании плагина com.android.library в проекте KMP могли создаваться наборы исходных файлов с непонятными названиями, например androidAndroidTest. Это соглашение об именах было менее интуитивным для разработчиков, знакомых со стандартными структурами проектов KMP.

Обходные решения для неподдерживаемых функций

По сравнению с интеграцией KMP с плагином com.android.library в плагине com.android.kotlin.multiplatform.library отсутствуют некоторые функции. Вот что можно сделать в этом случае:

  • Варианты сборки

    Типы сборки и версии продукта не поддерживаются. Это связано с тем, что в новом плагине используется архитектура с одним вариантом, которая упрощает настройку и повышает производительность сборки.

    Если вам нужны варианты сборки, рекомендуем создать отдельный модуль библиотеки Android с помощью плагина com.android.library, настроить типы сборки и версии продукта в этом модуле, а затем использовать его как стандартную зависимость проекта из набора исходных файлов androidMain мультиплатформенной библиотеки Kotlin. Подробную информацию вы найдете в статьях Как создать библиотеку Android и Как настроить варианты сборки.

  • Привязка данных и привязка представлений

    Это функции фреймворка пользовательского интерфейса, предназначенные для Android и тесно связанные с системой View и макетами XML. С новым плагином библиотеки Android-KMP мы рекомендуем обрабатывать пользовательский интерфейс с помощью мультиплатформенного фреймворка, такого как Compose Multiplatform. Привязка данных и привязка представлений считаются деталями реализации конечного приложения Android, а не общей библиотеки.

  • Поддержка нативных сборок

    Новый плагин предназначен для создания стандартного AAR для целевой платформы Android. Интеграция нативного кода в Kotlin Multiplatform обрабатывается непосредственно собственными нативными целями KMP (такими как androidNativeArm64 и androidNativeX86) и его возможностями взаимодействия с C. Если вам нужно включить нативный код C/C++, определите его как часть общего или нативного набора исходных файлов и настройте взаимодействие с C в блоке kotlin, а не используйте механизм externalNativeBuild, предназначенный для Android.

    Если вам нужна поддержка нативной сборки через externalNativeBuild, рекомендуем создать отдельный модуль com.android.library, в который можно интегрировать нативный код, и использовать эту библиотеку из набора исходных файлов androidMain проекта библиотеки Kotlin Multiplatform. Подробнее о том, как создать библиотеку Android и как добавить в проект код C и C++…

  • Класс BuildConfig

    Функция BuildConfig наиболее полезна в средах с несколькими вариантами. Поскольку новый плагин библиотеки Kotlin Multiplatform не зависит от вариантов и не поддерживает типы сборки и версии продукта, эта функция не реализована. В качестве альтернативы мы рекомендуем использовать плагин BuildKonfig или аналогичные решения сообщества, чтобы генерировать метаданные для всех целей.

Требования

Чтобы использовать плагин com.android.kotlin.multiplatform.library, в вашем проекте должны быть настроены следующие минимальные версии:

  • Плагин Android Gradle (AGP): 8.10.0.
  • Плагин Kotlin Gradle (KGP): 2.0.0.

Как применить плагин Android-KMP к существующему модулю

Чтобы применить плагин Android-KMP к существующему модулю библиотеки KMP, выполните следующие действия:

  1. Объявите плагины в каталоге версий. Откройте TOML-файл каталога версий (обычно gradle/libs.versions.toml) и добавьте раздел определений плагинов:

    # To check the version number of the latest Kotlin release, go to
    # https://kotlinlang.org/docs/releases.html
    
    [versions]
    androidGradlePlugin = "9.4.0"
    kotlin = "KOTLIN_VERSION"
    
    [plugins]
    kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
    android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" }
    
  2. Примените объявление плагина в корневом файле сборки. Откройте файл build.gradle.kts, расположенный в корневом каталоге проекта. Добавьте псевдонимы плагинов в блок plugins с помощью apply false. Это делает псевдонимы плагинов доступными для всех подпроектов без применения логики плагина к самому корневому проекту.

    Kotlin

    // Root build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }

    Яркий

    // Root build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }
  3. Примените плагин в файле сборки модуля библиотеки KMP. Откройте файл build.gradle.kts в модуле библиотеки KMP и примените плагин в верхней части файла в блоке plugins:

    Kotlin

    // Module-specific build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }

    Яркий

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. Настройте целевую платформу Android KMP. Настройте блок Kotlin Multiplatform (kotlin), чтобы определить целевую платформу Android. В блоке kotlin укажите целевую платформу Android с помощью android:

    Kotlin

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               sourceSetTreeName = "test"
           }
    
           compilerOptions.configure {
               jvmTarget.set(
                   org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
               )
           }
       }
    
       sourceSets {
           androidMain {
               dependencies {
                   // Add Android-specific dependencies here
               }
           }
           getByName("androidHostTest") {
               dependencies {
               }
           }
    
           getByName("androidDeviceTest") {
               dependencies {
               }
           }
       }
       // ... other targets (JVM, iOS, etc.) ...
    }

    Яркий

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               it.sourceSetTreeName = "test"
           }
    
           compilerOptions.options.jvmTarget.set(
               org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
           )
       }
    
       sourceSets {
           androidMain {
               dependencies {
               }
           }
           androidHostTest {
               dependencies {
               }
           }
           androidDeviceTest {
               dependencies {
               }
           }
       }
       // ... other targets (JVM, iOS, etc.) ...
    }
  5. Примените изменения. После применения плагина и настройки блока kotlin синхронизируйте проект Gradle, чтобы применить изменения.

Как перейти с устаревшего плагина

В этом руководстве рассказывается, как перейти с устаревшего плагина com.android.library на плагин com.android.kotlin.multiplatform.library.

1. Переместить источники

Устаревший плагин позволял использовать наборы исходных кодов src/main, src/test и src/androidTest в дополнение к src/androidMain, src/androidHostTest и src/androidDeviceTest. Новый плагин использует только последние каталоги, поэтому вам нужно будет переместить исходные файлы из src/main в src/androidMain, из src/test в src/androidHostTest и из src/androidTest в src/androidDeviceTest.

2. Как настроить пользовательские каталоги источников и ресурсов

Если у вас есть источники или ресурсы в нестандартных каталогах, вы ранее настраивали их с помощью блока sourceSets. В новом плагине используйте расширение androidComponents, чтобы добавить в вариант статические каталоги с исходными файлами.

Обратите внимание, что в новом плагине метод addStaticSourceDirectory добавляет каталог в существующий список каталогов с исходными файлами. В устаревшем плагине метод setSrcDirs заменяет список, а метод srcDir добавляет в него элементы.

Android-KMP

В новом плагине для взаимодействия с источниками вариантов используется блок onVariants.

// build.gradle.kts

androidComponents {
    onVariants { variant ->
        // Add a directory for Kotlin sources
        variant.sources.kotlin?.addStaticSourceDirectory("other/kotlin")

        // Add a directory for Android assets
        variant.sources.assets?.addStaticSourceDirectory("other/assets")
    }
}

Устаревший плагин

В плагине com.android.library блок sourceSets использовался для настройки или добавления каталогов с исходными файлами.

// build.gradle.kts

android {
    sourceSets {
        getByName("main") {
            // Replaces the directory for Kotlin sources.
            kotlin.setSrcDirs(listOf("other/kotlin"))

            // Appends a directory for assets.
            assets.srcDir("other/assets")
        }
    }
}

3. Объявление зависимостей

Обычно это зависимости для наборов исходных файлов Android. В новом плагине их нужно явно размещать в блоке sourceSets, а не в общем блоке dependencies, как раньше.

Android-KMP

Новый плагин обеспечивает более чистую структуру, группируя зависимости Android в наборе исходных файлов androidMain. Помимо основного набора исходных файлов, есть два набора исходных файлов для тестирования, которые создаются по запросу: androidDeviceTest и androidHostTest. Подробнее о настройке тестов хоста и устройства…

// build.gradle.kts

kotlin {
    android {}
    //... other targets

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
        }

        // Dependencies are now scoped to the specific Android source set
        androidMain.dependencies {
            implementation("androidx.appcompat:appcompat:1.7.0")
            implementation("com.google.android.material:material:1.11.0")
        }
    }
}

Наборы исходных файлов имеют соответствующие компиляции Kotlin с названиями main, deviceTest и hostTest. Наборы исходных файлов и компиляции можно настроить в скрипте сборки следующим образом:

// build.gradle.kts

kotlin {
    android {
        compilations.getByName("deviceTest") {
            kotlinOptions.languageVersion = "2.0"
        }
    }
}

Устаревший плагин

В устаревшем плагине можно было объявлять зависимости для Android в блоке зависимостей верхнего уровня, что иногда приводило к путанице в мультиплатформенном модуле.

// build.gradle.kts

kotlin {
  androidTarget()
  //... other targets
}

// Dependencies for all source sets were often mixed in one block
dependencies {
  // Common dependencies
  commonMainImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")

  // Android-specific dependencies
  implementation("androidx.appcompat:appcompat:1.7.0")
  implementation("com.google.android.material:material:1.11.0")
}

4. Включить ресурсы Android

В новом плагине поддержка ресурсов Android (папки res) по умолчанию отключена, чтобы оптимизировать производительность сборки. Чтобы начать работу с ними, их необходимо включить. Это изменение помогает гарантировать, что проекты, не требующие ресурсов для Android, не будут обременены связанными с этим накладными расходами на сборку.

Android-KMP

Вам необходимо явно включить обработку ресурсов Android. Ресурсы должны быть размещены в src/androidMain/res.

// build.gradle.kts

kotlin {
  android {
    // ...
    // Enable Android resource processing
    androidResources {
      enable = true
    }
  }
}

// Project Structure
// └── src
//     └── androidMain
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

Устаревший плагин

Обработка ресурсов включена по умолчанию. Вы можете сразу добавить каталог res в src/main и начать добавлять XML-объекты Drawable, значения и т. д.

// build.gradle.kts

android {
    namespace = "com.example.library"
    compileSdk = 34
    // No extra configuration was needed to enable resources.
}

// Project Structure
// └── src
//     └── main
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

5. Настройка тестов хоста и устройства

По умолчанию новый плагин отключает тесты Android на стороне хоста (модульные) и на стороне устройства (инструментальные). Вам нужно явно согласиться на создание наборов исходных файлов и конфигураций для тестирования, тогда как устаревший плагин создавал их автоматически.

Такая модель согласия позволяет убедиться, что в проекте нет ничего лишнего и он содержит только логику сборки и наборы исходных файлов, которые вы активно используете.

Android-KMP

В новом плагине тесты включаются и настраиваются в блоке kotlin.android. Это делает настройку более явной и позволяет избежать создания неиспользуемых тестовых компонентов. Набор исходных файлов androidUnitTest становится androidHostTest (каталог test меняется с src/androidUnitTest на src/androidHostTest), а androidInstrumentedTest становится androidDeviceTest (каталог test меняется с src/androidInstrumentedTest на src/androidDeviceTest).

// build.gradle.kts

kotlin {
  android {
    // ...

    // Opt-in to enable and configure host-side (unit) tests
    withHostTest {
      isIncludeAndroidResources = true
    }

    // Opt-in to enable and configure device-side (instrumented) tests
    withDeviceTest {
      instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
      execution = "HOST"
    }
  }
}

// Project Structure (After Opt-in)
// └── src
//     ├── androidHostTest
//     └── androidDeviceTest

Устаревший плагин

При использовании плагина com.android.library наборы исходных файлов androidUnitTest и androidInstrumentedTest создаются по умолчанию. Их поведение настраивается в блоке android, обычно с помощью DSL testOptions.

// build.gradle.kts

android {
  defaultConfig {
    // Runner was configured in defaultConfig
    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  }

  testOptions {
    // Configure unit tests (for the 'test' source set)
    unitTests.isIncludeAndroidResources = true

    // Configure device tests (for the 'androidTest' source set)
    execution = "HOST"
  }
}

// Project Structure (Defaults)
// └── src
//     ├── test
//     └── androidTest

6. Включить компиляцию исходного кода Java

Если вашей библиотеке KMP необходимо скомпилировать исходные коды Java для целевого устройства Android, вы должны явно включить эту функцию с помощью нового плагина. Обратите внимание, что это позволяет компилировать файлы Java, расположенные непосредственно в вашем проекте, а не его зависимости. Также изменился способ настройки целевой версии JVM для компиляторов Java и Kotlin.

Android-KMP

Чтобы включить компиляцию Java, вызовите withJava(). Цель JVM теперь настраивается непосредственно в блоке kotlin { android {} }, что делает настройку более унифицированной. Значение jvmTarget здесь применяется к компиляции Kotlin и Java для целевой платформы Android.

// build.gradle.kts

kotlin {
  android {
    //  Opt-in to enable Java source compilation
    withJava()
    // Configure the JVM target for both Kotlin and Java sources
    compilerOptions {
      jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
    }
  }
  // ...
}

// Project Structure:
// └── src
//     └── androidMain
//         ├── kotlin
//         │   └── com/example/MyKotlinClass.kt
//         └── java
//             └── com.example/MyJavaClass.java

Устаревший плагин

Компиляция Java включена по умолчанию. Целевая JVM для источников Java и Kotlin была задана в блоке android с помощью compileOptions.

// build.gradle.kts

android {
  // ...
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
  }
}

kotlin {
  androidTarget {
    compilations.all {
      kotlinOptions.jvmTarget = "1.8"
    }
  }
}

7. Как взаимодействовать с вариантами сборки с помощью androidComponents

Расширение androidComponents по-прежнему доступно для программного взаимодействия с артефактами сборки. Хотя API Variant в основном не изменился, новый интерфейс AndroidKotlinMultiplatformVariant более ограничен, поскольку плагин создает только один вариант.

В результате свойства, связанные с типами сборки и версиями продукта, больше не доступны в объекте варианта.

Android-KMP

Блок onVariants теперь выполняет итерацию по одному варианту. Вы по-прежнему можете обращаться к общим свойствам, таким как name и artifacts, но не к свойствам, зависящим от типа сборки.

// build.gradle.kts

androidComponents {
  onVariants { variant ->
      val artifacts = variant.artifacts
  }
}

Устаревший плагин

При наличии нескольких вариантов вы можете получить доступ к свойствам, зависящим от типа сборки, чтобы настроить задачи.

// build.gradle.kts

androidComponents {
  onVariants(selector().withBuildType("release")) { variant ->
    // ...
  }
}

8. Выберите варианты зависимостей библиотеки Android

Библиотека KMP создает один вариант для Android. Однако вы можете зависеть от стандартной библиотеки Android (com.android.library), у которой есть несколько вариантов (например, free/paid версии продукта). Обычно требуется контролировать, как проект выбирает вариант из этой зависимости.

Android-KMP

Новый плагин централизует и уточняет эту логику в блоке kotlin.android.localDependencySelection. Это позволяет гораздо лучше понять, какие варианты внешних зависимостей будут выбраны для вашей библиотеки KMP с одним вариантом.

// build.gradle.kts
kotlin {
  android {
    localDependencySelection {
      // For dependencies with multiple build types, select 'debug' first, and 'release' in case 'debug' is missing
      selectBuildTypeFrom.set(listOf("debug", "release"))

      // For dependencies with a 'type' flavor dimension...
      productFlavorDimension("type") {
        // ...select the 'typeone' flavor.
        selectFrom.set(listOf("typeone"))
      }
    }
  }
}

Устаревший плагин

Вы настроили стратегии выбора зависимостей в блоках buildTypes and productFlavors. Часто для этого использовался блок missingDimensionStrategy, чтобы задать вариант по умолчанию для параметра, которого не было в библиотеке, или блок matchingFallbacks в определенном варианте, чтобы задать порядок поиска.

Подробную информацию об использовании API можно найти в статье Как устранить ошибки сопоставления.

9. Добавьте зависимости предварительного просмотра Compose

Обычно мы хотим, чтобы определенные библиотеки были ограничены нашей локальной средой разработки, чтобы внутренние инструменты не попали в окончательный опубликованный артефакт. Это становится проблемой с новым плагином KMP Android, поскольку он удаляет архитектуру типа сборки, используемую для отделения зависимостей разработки от кода выпуска.

Android-KMP

Чтобы добавить зависимость только для локальной разработки и тестирования, добавьте ее непосредственно в конфигурацию пути к классам среды выполнения (в блоке dependencies верхнего уровня) основной компиляции Android. Это гарантирует, что зависимость будет доступна во время выполнения (например, для таких инструментов, как Compose Preview), но не будет частью пути к классам компиляции или опубликованного API вашей библиотеки.

// build.gradle.kts
dependencies {
  "androidRuntimeClasspath"(libs.androidx.compose.ui.tooling)
}

Устаревший плагин

В мультиплатформенных проектах Kotlin, в которых для Android используется плагин com.android.library, следует применять конфигурацию debugImplementation. Она ограничивает зависимость отладочной сборкой и не позволяет включить ее в версию библиотеки, используемую потребителями.

// build.gradle.kts
dependencies {
  debugImplementation(libs.androidx.compose.ui.tooling)
}

10. Настройте целевую JVM для целевой платформы KMP Android.

Плагин KMP Android задает целевую версию JVM с помощью android.compilerOptions.jvmTarget, которая применяется и к Java, и к Kotlin. Это упрощает настройку по сравнению с отдельными блоками compileOptions и kotlinOptions в проектах для Android.

Android-KMP

При работе с проектом Kotlin Multiplatform (KMP), включающим цель Android, у вас есть несколько способов настроить целевую версию JVM как для компилятора Kotlin, так и для компилятора Java. Чтобы управлять совместимостью байт-кода проекта, важно понимать область действия и иерархию этих конфигураций.

Ниже приведены три основных способа задать целевую версию JVM, упорядоченные от самого низкого до самого высокого приоритета. Целевые значения JVM с более высоким приоритетом применяются к меньшему подмножеству настроенных целей и переопределяют значения с более низким приоритетом. Это означает, что вы можете задать разные версии JVM для разных целей и компиляций в рамках целей в проекте.

Использование тулчейна Kotlin (самый низкий приоритет)

Самый общий способ задать целевую JVM – указать тулчейн в блоке kotlin файла build.gradle.kts. Этот подход задает целевую версию для задач компиляции Kotlin и Java во всех целевых объектах на основе JVM в вашем проекте, включая Android.

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

В этой конфигурации и kotlinc, и javac нацелены на JVM 21. Это отличный способ установить согласованную базовую линию для всего вашего проекта.

Использование параметров компилятора целевого уровня Android (средний приоритет)

Вы можете указать целевую JVM специально для целевой платформы Android KMP в блоке android. Эта настройка переопределяет конфигурацию jvmToolchain на уровне проекта и применяется ко всем компиляциям Android.

// build.gradle.kts
kotlin {
    android {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_11)
        }
    }
}

В этом случае, даже если для jvmToolchain задана другая версия, код Kotlin и Java для Android будет скомпилирован для JVM 11.

Использование параметров компилятора на уровне компиляции (наивысший приоритет)

Для более точного контроля можно настроить параметры компилятора для каждой компиляции (например, только для androidMain или androidHostTest). Это полезно, если для определенной компиляции требуется другая версия JVM. Эта настройка переопределяет как набор инструментов Kotlin, так и параметры целевого уровня Android.

// build.gradle.kts
kotlin {
    android {
        compilations.all {
            compileTaskProvider.configure {
                compilerOptions.jvmTarget.set(JvmTarget.JVM_11)
            }
        }
    }
}

Эта конфигурация помогает гарантировать, что все компиляции в целевом объекте Android используют JVM 11, обеспечивая детальный контроль.

Устаревший плагин

В проекте KMP, использующем стандартный плагин библиотеки Android (com.android.library), конфигурация немного отличается от конфигурации при использовании плагина KMP Android (но концептуально похожа).

Использование набора инструментов Kotlin

Метод kotlin.jvmToolchain() работает аналогично, задавая sourceCompatibility и targetCompatibility для Java и jvmTarget для Kotlin. Мы рекомендуем использовать именно этот подход.

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

compileOptions и kotlinOptions

Если вы не используете тулчейн Kotlin, вам нужно настроить целевые платформы JVM, используя отдельные блоки для Java и Kotlin.

// build.gradle.kts
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = "11"
    }
}

11. Опубликовать правила хранения для потребителей

Если вашей библиотеке KMP необходимо поставлять потребителям правила хранения (например, правила ProGuard для R8), вам необходимо явно включить публикацию с помощью нового плагина. Ранее правила хранения для потребителей публиковались по умолчанию, если они были указаны.

Android-KMP

В новом плагине необходимо задать optimization.consumerKeepRules.publish = true и указать файлы правил в блоке consumerKeepRules, чтобы опубликовать правила сохранения для потребителей.

// build.gradle.kts
kotlin {
  android {
    optimization {
      consumerKeepRules.apply {
        publish = true
        file("consumer-proguard-rules.pro")
      }
    }
  }
}

Устаревший плагин

При использовании com.android.library любые файлы правил, указанные с помощью consumerProguardFiles в android.defaultConfig, по умолчанию публикуются в артефактах библиотеки.

// build.gradle.kts
android {
  defaultConfig {
    consumerProguardFiles("consumer-proguard-rules.pro")
  }
}

12. Опубликуйте библиотеку в Maven

Если вы планируете опубликовать библиотеку KMP в Maven для использования в других проектах, процесс будет отличаться в зависимости от того, используете ли вы новый плагин Android-KMP или устаревший плагин.

Android-KMP

Плагин com.android.kotlin.multiplatform.library интегрируется со стандартными механизмами публикации Kotlin Multiplatform. Помимо стандартного процесса публикации библиотеки KMP, никаких дополнительных действий для Android не требуется.

Чтобы опубликовать библиотеку, следуйте официальной документации JetBrains: Настройка публикации для мультиплатформенной библиотеки.

Устаревший плагин

При использовании com.android.library для целевой платформы Android в проекте KMP вам необходимо следовать стандартному руководству по публикации библиотек Android, чтобы подготовить и опубликовать артефакт для Android (.aar).

Подробные инструкции приведены в разделе Подготовка библиотеки к выпуску.

Документация по API плагина

У нового плагина другой API, не такой, как у com.android.library. Подробную информацию о новом DSL и интерфейсах можно найти в документации по API:

Известные проблемы с плагином библиотеки Android-KMP

Ниже перечислены известные проблемы, которые могут возникнуть при применении нового плагина com.android.kotlin.multiplatform.library.