A Gradle plugin for simple setup of Kotlin Multiplatform mobile Gradle modules

Mobile Multiplatform gradle plugin

This is a Gradle plugin for simple setup of Kotlin Multiplatform mobile Gradle modules.

Setup

buildSrc/build.gradle.kts

repositories {
    mavenCentral()
    google()
}

dependencies {
    implementation("dev.icerock:mobile-multiplatform:0.12.0")
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20")
    implementation("com.android.tools.build:gradle:4.1.1")
}

Usage

Setup mobile targets without config

build.gradle.kts

plugins {
    id("com.android.library")
    id("org.jetbrains.kotlin.multiplatform")
    id("dev.icerock.mobile.multiplatform.targets")
}

Plugin automatically setup android, ios targets. Android target also automatically configured with dev.icerock.mobile.multiplatform.android-manifest and dev.icerock.mobile.multiplatform.android-sources plugins.

By default used ios() targets creation with intermediate source set iosMain. To disable it add into gradle.properties line:

mobile.multiplatform.useIosShortcut=false

To disable warning about used ios targets add into gradle.properties line:

mobile.multiplatform.iosTargetWarning=false

Setup AndroidManifest.xml in androidMain sourceSet

build.gradle.kts

plugins {
    id("dev.icerock.mobile.multiplatform.android-manifest")
}

After enable this plugin you can move AndroidManifest.xml from src/main/AndroidManifest.xml to src/androidMain/AndroidManifest.xml

Setup android sourceSets in android prefixed source sets

build.gradle.kts

plugins {
    id("dev.icerock.mobile.multiplatform.android-sources")
}

After enable this plugin you can move android's main source set to androidMain, release to androidRelease, test to androidTest etc.

Setup cocoapods integration for iOS

build.gradle.kts

plugins {
    id("dev.icerock.mobile.multiplatform.ios-framework")
}

Plugin will setup sync gradle tasks in group cocoapods for cocoapods integration.

Example of podspec for integration here - https://github.com/icerockdev/moko-template/blob/master/mpp-library/MultiPlatformLibrary.podspec

Add artifacts to export

// optional for export dependencies into framework header
framework {
    export(project = project(":myproject"))
    export(kotlinNativeExportable = MultiPlatfomLibrary(<...>))
    export(kotlinNativeExportable = MultiPlatfomModule(<...>))
    export(arm64Dependency = "my.group:name-iosarm64:0.1.0", x64Dependency = "my.group:name-iosx64:0.1.0")
    export(artifact = "my.group:name:0.1.0") // common artifact
    export(provider = libs.myLib) // gradle 7 version catalog libraries accessors
}

Setup cocoapods integration for all Apple frameworks

build.gradle.kts

plugins {
    id("dev.icerock.mobile.multiplatform.apple-framework")
}

with framework configuration you can add dependencies to export (just like in iOS framework).

Setup CocoaPods interop

build.gradle.kts

plugins {
    id("dev.icerock.mobile.multiplatform.cocoapods")
}

cocoaPods {
    podsProject = file("../ios-app/Pods/Pods.xcodeproj") // here should be path to your Pods project
    buildConfiguration = "dev-debug" // optional, default is "debug"

    pod("MBProgressHUD") // create cInterop and link with CocoaPod where schema and module is same
    pod(schema = "moko-widgets-flat", module = "mokoWidgetsFlat") // create cInterop and link with CocoaPod where schema and module is different
    pod(schema = "moko-widgets-flat", module = "mokoWidgetsFlat", onlyLink = true) // not create cInterop - just link framework with this CocoaPod
}

Also path to Pods project and configuration can be set globally into gradle.properties

mobile.multiplatform.podsProject=ios-app/Pods/Pods.xcodeproj
mobile.multiplatform.podsConfiguration=dev-debug

podsProject should be relative path from root gradle project.

Multiple plugins in one line (deprecated, saved for backward compatibility)

plugins { 
    id("dev.icerock.mobile.multiplatform")
}

This line will enable:

  • dev.icerock.mobile.multiplatform.cocoapods
  • dev.icerock.mobile.multiplatform.targets
  • publish of android build variants - release and debug

Definition of dependencies (deprecated, saved for backward compatibility)

val mokoTime = MultiPlatformLibrary(
    android = "dev.icerock.moko:time-android:0.1.0",
    common = "dev.icerock.moko:time:0.1.0",
    iosX64 = "dev.icerock.moko:time-iosx64:0.1.0",
    iosArm64 = "dev.icerock.moko:time-iosarm64:0.1.0"
)

val appCompat = AndroidLibrary(
    name = "androidx.appcompat:appcompat:1.1.0"
)

val myFeature = MultiPlatformModule(
    name = ":mpp-library:feature:myFeature"
)

Setup dependencies (deprecated, saved for backward compatibility)

build.gradle.kts

dependencies {
    mppLibrary(mokoTime)
    androidLibrary(appCompat)
    mppModule(myFeature)
}

GitHub

https://github.com/icerockdev/mobile-multiplatform-gradle-plugin