https://kotlinlang.org logo
#multiplatform
Title
# multiplatform
v

Vinod Rai

11/28/2020, 6:30 AM
Hey, Can anyone please guide or provide any link here to generate a native Universal framework with minimum size? I am generating a Universal framework and it's working perfectly but it's increasing IPA size drastically. Here is my build.gradle.kts file.
Copy code
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    kotlin("plugin.serialization")
    id("com.squareup.sqldelight")
}

kotlin {
    val iosX64 = iosX64("ios")
    val iosArm64 = iosArm64("iosArm64")
    val iosArm32 = iosArm32("iosArm32")
    val frameworkName = "EmtCore"
    configure(listOf(iosX64, iosArm64, iosArm32)) {
        binaries.framework {
            baseName = frameworkName
        }
    }
    sqldelight {
        database("EmtCoreDatabase") {
            packageName = "com.emt_core.db"
        }
    }
    jvm("android")

    sourceSets["commonMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
        implementation("io.ktor:ktor-client-core:1.4.1")
        implementation("io.ktor:ktor-client-json:1.4.1")
        implementation("com.russhwolf:multiplatform-settings-no-arg:0.6.1")
        implementation("io.ktor:ktor-client-serialization:1.4.1")
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9-native-mt-2")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-rc")
        implementation("com.soywiz.korlibs.klock:klock:1.12.0")
        implementation("io.ktor:ktor-client-logging:1.4.1")
        implementation("com.squareup.sqldelight:runtime:1.4.3")
    }

    sourceSets["androidMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib")
        implementation("io.ktor:ktor-client-android:1.4.1")
        //implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-rc")
        implementation("io.ktor:ktor-client-okhttp:1.4.1")
        api("io.ktor:ktor-client-logging-jvm:1.4.1")
        implementation("io.ktor:ktor-client-json-jvm:1.4.1")
        implementation("io.ktor:ktor-client-serialization-jvm:1.4.1")
        implementation("com.squareup.okhttp3:logging-interceptor:4.4.1")
        implementation("com.squareup.sqldelight:android-driver:1.4.3")

    }

    sourceSets["iosMain"].dependencies {
        implementation("io.ktor:ktor-client-ios:1.4.1")
        //implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-rc")
        implementation("io.ktor:ktor-client-json-native:1.3.2")
        api("io.ktor:ktor-client-logging-native:1.3.2")
        implementation("io.ktor:ktor-client-serialization-iosx64:1.4.1")
        //implementation("io.ktor:ktor-client-serialization-iosarm64:1.4.0")
        implementation("com.squareup.sqldelight:native-driver:1.4.3")
    }

    sourceSets["iosArm64Main"].dependencies {
        implementation("io.ktor:ktor-client-ios:1.4.1")
        //implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-rc")
        implementation("io.ktor:ktor-client-json-native:1.3.2")
        api("io.ktor:ktor-client-logging-native:1.3.2")
        implementation("io.ktor:ktor-client-serialization-iosarm64:1.4.1")
        //implementation("io.ktor:ktor-client-serialization-iosarm64:1.4.0")
        implementation("com.squareup.sqldelight:native-driver:1.4.3")
    }

    sourceSets["iosArm32Main"].dependencies {
        implementation("io.ktor:ktor-client-ios:1.4.1")
        //implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-rc")
        implementation("io.ktor:ktor-client-json-native:1.3.2")
        api("io.ktor:ktor-client-logging-native:1.3.2")
        implementation("io.ktor:ktor-client-serialization-iosarm32:1.4.1")
        //implementation("io.ktor:ktor-client-serialization-iosarm64:1.4.0")
        implementation("com.squareup.sqldelight:native-driver:1.4.3")
    }

    val debugFatFramework by tasks.creating(org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask::class) {
        baseName = frameworkName
        from(
           iosArm32.binaries.getFramework("debug"),
            iosArm64.binaries.getFramework("debug"),
            iosX64.binaries.getFramework("debug")
        )
        destinationDir = buildDir.resolve("fat-framework/debug")
        group = "Universal framework"
        description = "Builds a debug universal (fat) framework"
    }

    val releaseFatFramework by tasks.creating(org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask::class) {
        baseName = frameworkName
        from(
            iosArm32.binaries.getFramework("release"),
            iosArm64.binaries.getFramework("release")
        )
        destinationDir = buildDir.resolve("fat-framework/release")
        group = "Universal framework"
        description = "Builds a release universal (fat) framework"
    }

    val zipDebugFatFramework by tasks.creating(Zip::class) {
        dependsOn(debugFatFramework)
        from(debugFatFramework)
       // from("LICENSE.md")
    }

    val zipReleaseFatFramework by tasks.creating(Zip::class) {
        dependsOn(releaseFatFramework)
        from(releaseFatFramework)
        //from("LICENSE.md")
    }
}
k

Kuba Petržílka

11/28/2020, 10:58 AM
Starting from kotlin 1.4 it is not necessary to specify the dependencies to multiplatform libs for each end every target platform.. For instance you can define just:
Copy code
sourceSets["commonMain"].dependencies {
        implementation("io.ktor:ktor-client-serialization:1.4.1")
}
and you don't have to mention that dependency elsewhere again
❤️ 2
r

russhwolf

11/28/2020, 4:02 PM
You could do that before 1.4 as well, if the library was built for it. There were metadata-enabled libraries being published since at least the beginning of 2019. The JetBrains libs just had a weird name for it (it was the -native dependency) before 1.4.
To the original question, be careful in how you measure size because it can be pretty subtle on iOS. But one thing to watch out for it that public declarations have a much greater impact on size than non-public ones, so if you can make stuff internal that you're not using from ios, it will help a lot. @kpgalligan has some notes on that in his recent talks, for example around 31:32 in this video

https://youtu.be/hrRqX7NYg3Q?t=1892

3 Views