You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新版Android Studio中kotlin-parcelize与Safe Args导入异常

Android Studio Narwhal 版本下 Parcelize 与 Navigation Safe Args 配置问题

问题描述

已将Android Studio更新至最新版本(Narwhal | 2025.1.1 Patch 1)并创建新项目,目前遇到依赖系统配置问题:

  • 先后尝试使用id("kotlin-parcelize")和alias(libs.plugins.kotlin.parcelize)配置插件,且该插件已在libs.versions.toml文件中正确声明,但Model类(Clip类)仍存在@Parcelize相关报错
  • Navigation Safe Args无法正常导入

已向Google提交该Bug。

Clip Model类代码

import android.net.Uri
import android.os.Parcel
import android.os.Parcelable
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
import androidx.room.TypeConverters
import com.example.domain.utils.UriConverter
import kotlinx.parcelize.Parcelize


@Entity(tableName = "clips_table",  indices = [Index(value = ["artistId"])])
@TypeConverters(UriConverter::class)
@Parcelize
data class Clip(
    @PrimaryKey val id: Long,
    val name: String,
    val album: String,
    val artist: String,
    val albumId: Long,
    val artistId: Long,
    val duration: Long = 0,
    val contentUri: Uri?,
    val artUri: Uri?,
    var customArtUri: String? = null,
    val year: Int? = null,
    val dateAdded: Long? = null,
    val size: Long? = null,
    val genre: String? = null,
    val genreId: Long? = null,
    val trackNumber: Int? = null,
    var isSelected: Boolean = false,
    var isFavorite: Boolean = false,
    var lastPlayed: Long? = null,
    var playCount: Int = 0,
    val playlistIds: List<Long> = emptyList()
) : Parcelable {

    constructor(parcel: Parcel) : this(
        parcel.readLong(),
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readLong(),
        parcel.readLong(),
        parcel.readLong(),
        parcel.readTypedObject(Uri.CREATOR),
        parcel.readTypedObject(Uri.CREATOR),
        parcel.readString(),
        parcel.readInt().takeIf { it != 0 },
        parcel.readLong().takeIf { it != 0L },
        parcel.readLong().takeIf { it != 0L },
        parcel.readString(),
        parcel.readLong(),
        parcel.readInt().takeIf { it != Int.MIN_VALUE },
        parcel.readInt() == 1,
        parcel.readInt() == 1,
        parcel.readLong().takeIf { it != 0L },
        parcel.readInt(),
        parcel.createLongArray()?.toList() ?: emptyList()
    )

    override fun describeContents(): Int = 0

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeLong(id)
        dest.writeString(name)
        dest.writeString(album)
        dest.writeString(artist)
        dest.writeLong(albumId)
        dest.writeLong(artistId)
        dest.writeLong(duration)
        dest.writeParcelable(contentUri, flags)
        dest.writeParcelable(artUri, flags)
        dest.writeString(customArtUri)
        dest.writeInt(year ?: 0)
        dest.writeLong(dateAdded ?: 0L)
        dest.writeLong(size ?: 0L)
        dest.writeString(genre)
        dest.writeLong(genreId ?: 0L)
        dest.writeInt(trackNumber ?: Int.MIN_VALUE)
        dest.writeInt(if (isSelected) 1 else 0)
        dest.writeInt(if (isFavorite) 1 else 0)
        dest.writeLong(lastPlayed ?: 0L)
        dest.writeInt(playCount)
        dest.writeLongArray(playlistIds.toLongArray())
    }

    companion object CREATOR : Parcelable.Creator<Clip> {
        override fun createFromParcel(parcel: Parcel): Clip {
            return Clip(parcel)
        }

        override fun newArray(size: Int): Array<Clip?> {
            return arrayOfNulls(size)
        }
    }
}

项目级Build.Gradle代码

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.android.library) apply false
    alias(libs.plugins.dagger.hilt.plugin) apply false
    alias(libs.plugins.kotlin.kapt) apply false
    alias(libs.plugins.ksp) apply false
//    alias(libs.plugins.navigation.safe.args) apply false
    alias(libs.plugins.kotlin.parcelize) apply false
//    id("androidx.navigation.safeargs.kotlin")
//    id("org.jetbrains.kotlin.plugin.parcelize") version libs.versions.kotlin apply false


}

buildscript {

    dependencies {


        classpath ("androidx.navigation:navigation-safe-args-gradle-plugin:2.8.9")

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

libs.versions.toml插件配置

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
android-library = { id = "com.android.library", version.ref = "agp" }
dagger-hilt-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hiltVersion" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kapt-version" }
ksp = { id = "com.google.devtools.ksp", version = '2.1.21-2.0.1' }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }

应用级build.gradle.kts代码

plugins {
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.android.application)
    alias(libs.plugins.dagger.hilt.plugin)
    alias(libs.plugins.kotlin.kapt)
//    alias(libs.plugins.navigation.safe.args)
    alias(libs.plugins.kotlin.parcelize)
    alias(libs.plugins.ksp)
//    id("kotlin-parcelize")



}

android {
    namespace = "com.example.mmlaudioplayer"
    compileSdk = 36

    defaultConfig {
        applicationId = "com.example.mmlaudioplayer"
        minSdk = 24
        targetSdk = 36
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildFeatures {
        viewBinding = true
        android.buildFeatures.buildConfig = true
        buildConfig = true
    }


    buildTypes {
        debug {
            isDebuggable = true
            buildConfigField("boolean", "IS_DEBUG_MODE", "true")

        }
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            buildConfigField("boolean", "IS_DEBUG_MODE", "false")
        }
    }
    hilt {
        enableAggregatingTask = true
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = "11"
    }
}

dependencies {

    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    implementation(libs.material) {
        exclude(group = "androidx.recyclerview", module = "recyclerview")
        exclude(group = "androidx.recyclerview", module = "recyclerview-selection")
    }

    // تطبيق RecyclerView و Selection بشكل صريح
    implementation(libs.androidx.recyclerview)
//    implementation(libs.androidx.recyclerview.selection)

    implementation(libs.androidx.activity)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.coroutines)

//    implementation(libs.dagger.hilt)
//    ksp(libs.dagger.hilt.compiler)

    implementation(libs.dagger.hilt)
    implementation(libs.androidx.navigation.fragment.ktx)
//    implementation(libs.androidx.navigation.ui.ktx)
    ksp(libs.dagger.hilt.compiler)
    implementation(libs.play.review)
    implementation(libs.play.review.ktx)
    implementation(libs.shimmerAnimation)


    implementation(libs.androidx.viewmodel)
    implementation(libs.androidx.livedata)
    implementation(libs.androidx.lifecycle)
    implementation(libs.androidx.media)
    implementation(libs.room.runtime)
    implementation(libs.room.ktx)
    ksp(libs.room.compiler)

    implementation(libs.sdp)
    implementation(libs.ssp)

    implementation(libs.glide)
    ksp(libs.glide.compiler)

    implementation(libs.androidx.palette)
    implementation(libs.androidx.swiperefreshlayout)


    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)


    implementation(project(":domain"))
    implementation(project(":data"))
}

IDE版本信息

Android Studio Narwhal | 2025.1.1 Patch 1
Build #AI-251.25410.109.2511.13752376, built on July 9, 2025
Runtime version: 21.0.6+-13391695-b895.109 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Toolkit: sun.awt.windows.WToolkit
Windows 11.0
Kotlin plugin: K2 mode
GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation
Memory: 4096M
Cores: 28
Registry:
  ide.instant.shutdown=false
  ide.experimental.ui=true
  com.android.studio.ml.activeModel=com.android.studio.ml.AidaModel
Non-Bundled Plugins:
  wu.seal.tool.jsontokotlin (3.7.7)
  com.gionchat.json.bean (1.0.5)
  com.robohorse.robopojogenerator (2.6.3)
  com.thoughtworks.gauge (251.25410.129)

内容的提问来源于stack exchange,提问作者Dr Mido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:27:31