如何降级 kotlin 多平台项目上的 gradle 以使用 Android Studio 稳定版本?

问题描述 投票:0回答:3

最近我开始做一个kotlin多平台项目,我开始时没有任何经验,而且我得到的项目已经创建了基础。创建该项目的开发人员有想法在 android 开发部分使用 compose 库。 然后他辞去了工作,我开始了。 但我选择不使用 compose,因为急于交付应用程序。

所以项目 gradle 版本目前在

6.8
上,android 插件在
7.0.0-alpha05
上 但我想降级以停止在 Canary 版本上使用 Android Studio,并在稳定版本上使用。但是当我降级 gradle 时,我收到此错误:

A problem occurred configuring project ':shared'.
> Failed to notify project evaluation listener.
   > /Users/jhonata/Documents/Projetos/Aurea/quicktendr-mgmt/shared/src/main/AndroidManifest.xml (No such file or directory)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':shared'.
    at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:75)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:68)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:51)
    at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:191)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    at ...

gradle 属性:

distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

共享等级:

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("kotlin-parcelize")
    id("dev.icerock.mobile.multiplatform-resources")
    kotlin("plugin.serialization")
}
android {
    configurations {
        create("androidTestApi")
        create("androidTestDebugApi")
        create("androidTestReleaseApi")
        create("testApi")
        create("testDebugApi")
        create("testReleaseApi")
    }
}

kotlin {
//    jvm()
    android()
    ios {
        binaries {
            framework {
                baseName = "shared"
                when (val target = this.compilation.target.name) {
                    "iosX64" -> {
                        export(Deps.Decompose.iosX64)
                    }

                    "iosArm64" -> {
                        export(Deps.Decompose.iosArm64)
                    }

                    else -> error("Unsupported target: $target")
                }
            }
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {
                api(Deps.Decompose.decompose)
                api(Deps.coroutines)
                implementation(Deps.ktxSerializationJson)
                implementation(Deps.ktorCore)
                implementation(Deps.ktorSerialization)
                implementation(Deps.kissMeCommon)
                implementation("ch.qos.logback:logback-classic:1.2.3")
                implementation("dev.icerock.moko:mvvm-core:0.10.1")
                implementation("dev.icerock.moko:mvvm-livedata:0.10.1")
                api("dev.icerock.moko:resources:0.15.1")
                api("dev.icerock.moko:mvvm:0.9.1")
                implementation("io.ktor:ktor-client-logging:1.4.2")
                implementation("io.ktor:ktor-client-auth:1.4.2")
            }
        }

        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }

//        val mobileMain by creating {
//            dependsOn(commonMain)
//            dependencies {
//
//            }
//        }

        val androidMain by getting {
            dependencies {
                implementation(Deps.ktorAndroid)
                implementation(Deps.kissMeAndroid)
            }
        }
        val androidTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
                implementation("junit:junit:4.13")
            }
        }
        val iosMain by getting {
            dependencies {
                implementation(Deps.ktorIOS)
                implementation(Deps.kissMeIOS)
            }
        }
        val iosTest by getting
//        val jvmMain by getting {
//            dependencies {
//                implementation("io.ktor:ktor-client-okhttp:1.4.2")
//            }
//        }

        named("iosX64Main") {
            dependencies {
                api(Deps.Decompose.iosX64)
            }
        }

        named("iosArm64Main") {
            dependencies {
                api(Deps.Decompose.iosArm64)
            }
        }
    }
}

multiplatformResources {
    multiplatformResourcesPackage = "com.quicktendr.mgmt" // required
    iosBaseLocalizationRegion = "es" // optional, default "en"
}

android {
    compileSdkVersion(29)
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdkVersion(24)
        targetSdkVersion(29)
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

}

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

val packForXcode by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework =
        kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)
}

tasks.getByName("build").dependsOn(packForXcode)

梯度:

buildscript {
    repositories {
        gradlePluginPortal()
        jcenter()
        google()
        mavenCentral()
        maven("https://kotlin.bintray.com/kotlinx")
        maven("https://dl.bintray.com/jetbrains/kotlin-native-dependencies")
        maven("https://dl.bintray.com/kotlin/kotlin-dev")
        maven("https://dl.bintray.com/icerockdev/plugins")
    }
    dependencies {
        val kotlinVersion = "1.4.31"
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
        classpath("org.jetbrains.kotlin:kotlin-serialization:$kotlinVersion")
        classpath("com.android.tools.build:gradle:4.2.1")
        classpath("com.github.jengelman.gradle.plugins:shadow:5.2.0")
        classpath("dev.icerock.moko:resources-generator:0.15.1")
        classpath("com.google.gms:google-services:4.3.5")
        classpath("com.google.firebase:firebase-crashlytics-gradle:2.5.2")
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven("https://dl.bintray.com/arkivanov/maven")
        maven("https://dl.bintray.com/icerockdev/moko")
        maven("https://dl.bintray.com/netguru/maven/")
        maven("https://repo.repsy.io/mvn/chrynan/public")
        maven("https://jitpack.io")
    }
}
android-studio gradle android-gradle-plugin kotlin-multiplatform kotlin-multiplatform-mobile
3个回答
0
投票

如果您只想降级 gradle,您可以在您发布的 gradle 属性文件中降级 gradle。

distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

您需要将其设置为 Android Studio 4.2.1 支持的最新版本。还有与 Android gradle 插件的兼容性考虑。您可以在此处查看兼容性矩阵:

https://developer.android.com/studio/releases/gradle-plugin#4-2-0

请注意,如果您的项目使用诸如 compose 之类依赖于特定版本的 AGP/Gradle 的东西,您可能需要重写这些部分。使用 android studio 的金丝雀版本或 intellij 的最新版本是可以的 - 除非您遇到一些问题。您可以使用

AndroidView

一起使用 compose 和旧视图类

https://developer.android.com/jetpack/compose/interop/interop-apis#views-in-compose


0
投票

要降级Gradle,您需要在项目的build.gradle文件中设置您想要的版本:

dependencies {
    classpath 'com.android.tools.build:gradle:7.4.2'
    .....
}

然后您还需要通过在 gradle.wrapper.properties 文件中设置版本来降级 Gradle 包装器:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

请注意,Gradle 版本和 Gradle 包装器版本通常不匹配。只需将 Gradle 包装器设置为与您的 Gradle 相同的版本,然后 Android Studio 会将其更正为正确的版本。


0
投票

其他答案都不适用于我的 Android Studio Hedgehog(2023.1.1 补丁 1)。 Hedgehog 版本为许多配置添加了一个

.toml
文件,但似乎尚未将该文件与项目结构设置同步。

对我有用的修复:

  1. 在 Android 视图中打开 Gradle Scripts

    gradle-wrapper.properties
    。将分布设置为 8.2。这个可以 也可以从菜单中使用 File >> Project Structure >> 完成 项目 >> Gradle 版本 >> 设置为
    8.2

    distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
    
  2. 还在 Gradle 脚本下打开

    libs.versions.toml
    。将 agp 设置为
    8.2.1

    将其设置为
    8.2
    会导致错误。

    [versions]
    agp = "8.2.1"
    
  3. 我还必须从应用程序级别build.gradle文件中删除

    Java编译选项部分。这可能不适用于您。另请注意,我使用的是 Java 17。您的可能会有所不同。例如,Java 1.8 将显示为 
    VERSION_1_8
    。我改变了这个:

    android { kotlinOptions { jvmTarget = "17" } compileOptions { sourceCompatibility = VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } ... other settings ... }
    对此:

    android { kotlinOptions { jvmTarget = "17" } ... other settings ... }
    
    
© www.soinside.com 2019 - 2024. All rights reserved.