Hello, I get a runtime error whenever I run the ap...
# multiplatform
e
Hello, I get a runtime error whenever I run the app on iOS 17.5 simulator Uncaught Kotlin exception: kotlin.native.internal.FileFailedToInitializeException: There was an error during file or class initialization Anyone knows how to fix?
m
Hi, did you find a fix for this issue? I have it too when running the app on a real arm iOS device, but no issues on x64 simulator
e
can you send your gradle file pls I fixed but I don't remember what was the issue
m
Copy code
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import com.codingfeline.buildkonfig.compiler.FieldSpec
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.ir.backend.js.compile
import java.util.Properties

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.androidApplication)
    alias(libs.plugins.jetbrainsCompose)
    alias(libs.plugins.compose.compiler)
    alias(libs.plugins.googleServices)
    kotlin("native.cocoapods")
//    alias(libs.plugins.completeKotlin)
    alias(libs.plugins.sekretPlugin)
    kotlin("plugin.serialization")
    alias(libs.plugins.androidGitVersion)
    alias(libs.plugins.konfig)
    // Add the Crashlytics Gradle plugin
    alias(libs.plugins.firebase.crashlytics)
}

kotlin {
    androidTarget {
        @OptIn(ExperimentalKotlinGradlePluginApi::class)
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_17)
        }
    }

    @OptIn(ExperimentalKotlinGradlePluginApi::class)
    compilerOptions {
        freeCompilerArgs.add("-Xexpect-actual-classes")
    }

    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            binaryOption("bundleVersion", "0.5")
            binaryOption("bundleId", "eu.prepsoil.app")
            export(libs.kmpnotifier)
            baseName = "ComposeApp"
            isStatic = true
        }
    }

    cocoapods {
        // Required properties
        // Specify the required Pod version here. Otherwise, the Gradle project version is used.
        version = "1.0"
        summary = "Some description for a Kotlin/Native module"
        homepage = "Link to a Kotlin/Native module homepage"
        podfile = project.file("../iosApp/Podfile")

        // Optional properties
        // Configure the Pod name here instead of changing the Gradle project name
        ios.deploymentTarget = "15.4"
        if (DefaultNativePlatform.getCurrentOperatingSystem().isMacOsX) {
//            pod("FirebaseMessaging", libs.versions.ios.firebaseMessaging.get())
//            pod("FirebaseCrashlytics", libs.versions.ios.firebaseMessaging.get())
            pod("GoogleMaps") {
                version = libs.versions.ios.maps.get()
                extraOpts += listOf("-compiler-option", "-fmodules")
            }
            pod("GooglePlaces", libs.versions.ios.places.get())
        }

        framework {
            // Required properties
            // Framework name configuration. Use this property instead of deprecated 'frameworkName'
            baseName = "ComposeApp"

            // Optional properties
            // Specify the framework linking type. It's dynamic by default.
            isStatic = true
            // Dependency export
            export(libs.kmpnotifier)
////            export(project(":anotherKMMModule"))
//            transitiveExport = false // This is default.
            // Bitcode embedding
//            embedBitcode(BitcodeEmbeddingMode.BITCODE)
        }

        // Maps custom Xcode configuration to NativeBuildType
        xcodeConfigurationToNativeBuildType["CUSTOM_DEBUG"] = NativeBuildType.DEBUG
        xcodeConfigurationToNativeBuildType["CUSTOM_RELEASE"] = NativeBuildType.RELEASE
    }


    sourceSets {
        androidMain.dependencies {
            implementation(libs.compose.ui)
            implementation(libs.compose.ui.tooling.preview)
            implementation(libs.androidx.activity.compose)
            // Maps SDK for Android
            implementation(libs.play.services.maps)
            // Android Maps Compose composables for the Maps SDK for Android
            implementation(libs.maps.compose)

            // Utilities for Maps SDK for Android (requires Google Play Services)
            // You do not need to add a separate dependency for the Maps SDK for Android
            // since this library builds in the compatible version of the Maps SDK.
            implementation(libs.android.maps.utils)

            // Optionally add the Kotlin Extensions (KTX) for full Kotlin language support
            // See latest version at <https://github.com/googlemaps/android-maps-ktx>
            implementation(libs.maps.utils.ktx)
            implementation(libs.places)
            implementation(libs.koin.android)
            implementation(libs.kotlinx.coroutines.android)
            implementation(libs.kotlinx.coroutines.play.services)
            implementation(libs.androidx.core.ktx)
            implementation(libs.androidx.core.splashscreen)
            implementation(libs.ktor.client.okhttp)
            implementation(libs.customactivityoncrash)
            // Import the BoM for the Firebase platform
            implementation(project.dependencies.platform(libs.firebase.bom))

            // Add the dependencies for the Crashlytics and Analytics libraries
            // When using the BoM, you don't specify versions in Firebase library dependencies
            implementation(libs.firebase.crashlytics)
            implementation(libs.firebase.analytics)
        }
        commonMain.dependencies {
            implementation(compose.runtime)
            implementation(compose.foundation)
            implementation(compose.material3)
            implementation(compose.materialIconsExtended)
            implementation(compose.components.resources)
            api(libs.kmpnotifier)
            implementation(libs.compottie)
            api(libs.permissions)
            api(libs.permissions.compose)
            implementation(libs.koin.core)
            implementation(libs.kotlinx.coroutines.core)
            implementation(libs.koin.compose)
            implementation(libs.oidc.appsupport)
            implementation(libs.oidc.ktor)
            implementation(libs.rebugger)
            api(libs.image.loader)
            implementation(libs.kotlinx.datetime)
            implementation(libs.ktor.client.core)
            implementation(libs.ktor.client.auth)
            implementation(libs.ktor.client.json)
            implementation(libs.ktor.client.logging)
            implementation(libs.ktor.serialization.kotlinx.json)
            implementation(libs.kotlinx.serialization.json)
            implementation(libs.ktor.client.content.negotiation)
            api(compose.animation)
            api(libs.precompose)
            api(libs.precompose.viewmodel) // For ViewModel intergration
            api(libs.precompose.koin) // For Koin intergration
            implementation(libs.multiplatform.settings)
            implementation(libs.multiplatform.settings.coroutines)
            implementation(libs.kermit)
            implementation(libs.youtubeplayer.compose)
            implementation(libs.spraypaintkt.core)
            implementation(libs.spraypaintkt.koin.integration)
            implementation(libs.spraypaintkt.ktor.integration)
            implementation(libs.flagkit)
            api(libs.konnectivity)
            implementation(libs.precompose.navigation.typesafe)
            implementation(libs.richeditor.compose)
            implementation(libs.composeSettings)
            implementation(libs.composeSettings.extended)
            implementation(libs.sheetsComposeDialogs.core)
            implementation(libs.sheetsComposeDialogs.list)
            implementation(libs.peekaboo.image.picker)
            implementation(libs.crashlytics)
        }
        iosMain.dependencies {
            implementation(compose.material)
            implementation(libs.stately.common)
            implementation(libs.ktor.client.darwin)
        }
    }
}

android {
    namespace = "eu.prepsoil.app"
    compileSdk = libs.versions.android.compileSdk.get().toInt()

    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    sourceSets["main"].res.srcDirs("src/androidMain/res")
    sourceSets["main"].resources.srcDirs("src/commonMain/resources")

    defaultConfig {
        applicationId = "eu.prepsoil.app"
        minSdk = libs.versions.android.minSdk.get().toInt()
        targetSdk = libs.versions.android.targetSdk.get().toInt()
        versionCode = if (androidGitVersion.code() == 0) 1 else androidGitVersion.code()
        versionName = androidGitVersion.name()

        addManifestPlaceholders(
            mapOf("oidcRedirectScheme" to "prepsoilapp")
        )

        signingConfigs {
            val secrets = Properties().apply {
                load(project.rootProject.file("local.properties").inputStream())
            }
            getByName("debug") {
                storeFile = file("commpla.keystore")
                storePassword = secrets.getProperty("KEYSTORE_PASSWORD")
                keyAlias = "commpladebugkey"
                keyPassword = secrets.getProperty("KEYSTORE_PASSWORD")
            }

            create("release") {
                storeFile = file("commpla.keystore")
                storePassword = secrets.getProperty("KEYSTORE_PASSWORD")
                keyAlias = "commplareleasekey"
                keyPassword = secrets.getProperty("KEYSTORE_PASSWORD")
            }
        }
    }
    buildFeatures {
        compose = true
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
            merges += "values**"
        }
    }
    buildTypes {
        getByName("release") {
            // Enables code shrinking, obfuscation, and optimization for only
            // your project's release build type. Make sure to use a build
            // variant with `isDebuggable=false`.
            isMinifyEnabled = true

            // Enables resource shrinking, which is performed by the
            // Android Gradle plugin.
            isShrinkResources = true

            // Includes the default ProGuard rules files that are packaged with
            // the Android Gradle plugin. To learn more, go to the section about
            // R8 configuration files.
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )

            signingConfig = signingConfigs.getByName("release")
        }
        getByName("debug") {
            isDebuggable = true
            isJniDebuggable = true
            isMinifyEnabled = false
        }
    }
    compileOptions {
        isCoreLibraryDesugaringEnabled = true
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    dependencies {
        debugImplementation(libs.compose.ui.tooling)
    }
}
dependencies {
    implementation(libs.play.services.location)
    implementation(libs.androidx.browser)
    coreLibraryDesugaring(libs.desugar.jdk.libs)
}

sekret {
    properties {
        enabled = true
        packageName = "eu.prepsoil.app"
        encryptionKey = packageName
        nativeCopy {
            androidJNIFolder.set(File("src/androidMain/jniLibs"))
        }
    }
}

buildkonfig {
    packageName = "eu.prepsoil.app"
    defaultConfigs {
        buildConfigField(
            FieldSpec.Type.BOOLEAN,
            "isDev",
            gradleLocalProperties(rootDir, providers).getProperty("USE_STAGING_SERVER") ?: "false"
        )
    }
}
e
Your issue seems like different from mine. I got this error as I remember some silly gradle mistake. I checked the differences your gradle file and mine. I couldn't catch anything. Also your case is very different I got this error when I run on simulator
m
Just found the issue: it was thrown by a toDouble method in a val (inside a file)
156 Views