- Hi all. Beginner’s question. I have a KMM app th...
# multiplatform
d
• Hi all. Beginner’s question. I have a KMM app that imports (reusable) code from another KMM library (into shared module). The gradle sync works fine. If I build within Android Studio the build fails because it doesn’t find the imports from the shared lib. But if I run the Android emulator the app runs fine (I’ve made visual changes to make sure it is running a current build, and it is definitely executing the code that breaks the build). How is this possible? I’m hoping someone will recognize the strange behavior and give me a clue as to my error with the dependencies.
💯 1
j
What version of Android Studio are you using? There have been some issues in Chipmunk with false positive IDE errors not recognizing common code or expect/actuals. Dolphin and Electric Eel have better support for KMM.
d
Chipmunk 2021.2.1 Patch 2. Thanks for the response. It’s quite unsettling seeing this, especially for a gradle newbie who has no confidence in what he’s doing. I’ll try another version.
Same behavior in both Dolphin and Electric Eel ;-(
j
Did you upgrade the Android gradle plugin as well?
d
Yes. Curiously, I know that the dependency is getting into commonMain ok, partly because the gradle sync works, but also because the androidApp project has a transitive dependency on the same common code (via commonMain) and if I flip the dependency (in commonMain) from api to implementation then androidApp fails to compile too.
That, plus the app runs 🙂
p
@Don.Robertson can you share your build.gradle.kts of your shared module?
I just want to check a few things
d
From the shared module ..
Interestingly, if I use a composite build I get the same result. That is, the androidApp builds fine (picking up a transitive dependency), but the shared module fails to compile in the IDE.
I am using mavenLocal here, but I have cleaned out and repopulated it frequently, so I doubt that’s a problem.
p
And which library is giving the issue?
d
The shared module (the gradle files above) builds and deploys to local maven fine, as far as I can see. But I have a regular KMM app that imports from that shared module (com.teddyfreddy:common). The androidApp module in that project compiles and runs fine, even though it depends on the shared module (via the autogenerated project dependency). The commonMain code in the “shared” portion of the KMM app does not compile in the IDE (because it can’t find the dependencies). But Make Project succeeds and the app runs in the emulator fine.
The code in the “common” module has the definition of ValidatedField (eg), which is used in the store, and also indirectly used in the Compose UI (within androidAPP) in terms of store state references.
j
Did you change
Copy code
classpath("com.android.tools.build:gradle:7.2.2")
to
Copy code
classpath("com.android.tools.build:gradle:7.3.0-rc01")
when testing on Android Studio Dolphin? You can replace
Copy code
kotlin {
    targets {
        android()
        iosSimulatorArm64()
    }

    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach {
        it.binaries.framework {
            baseName = "shared"
        }
    }
    ...
with
Copy code
kotlin {
    android()
    ios {
        binaries.framework {
            baseName = "shared"
        }
    }
    ...
and replace all the individual
ios*
source sets and manual
dependsOn()
with
Copy code
kotlin {
    ...
    sourceSets {
        ...
        val iosMain by getting
        val iosTest by getting
    }
Since Kotlin 1.6.20, you don't have to target each individual ios architecture.
d
Jeff, I have upgraded the gradle plugin on both the library and consuming apps. Same behavior. I have simplified everything as much as I can in the gradle files. At this point I think finessing my ignorance of gradle has reached its limit and it’s time for me to make the effort. Thanks for the tips.
j
Did changing your targets and source sets as I described make a difference?
d
Unfortunately not. I’ve taken a step back and I’m trying to repurpose the template project from Android Studio for Multiplatform Library (which is a better fit anyway). I have hit other issues with this still, but that’s my problem. I’m working through the gradle material though to get on top of the whole project mechanism. Strange that the IDE and the gradle builds take different positions though.
s
It could be related to this: https://issuetracker.google.com/issues/231701341 I'm seeing a similar thing since upgrading to kotlin 1.7