kapt错误,Unsupported metadata version. Check that your Kotlin version is >= 1.0

Caused by: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0
        at dagger.internal.codegen.kotlin.KotlinMetadata.metadataOf(KotlinMetadata.java:206)
        at dagger.internal.codegen.kotlin.KotlinMetadata.from(KotlinMetadata.java:186)
        at dagger.internal.codegen.kotlin.KotlinMetadataFactory.create(KotlinMetadataFactory.java:56)
        at dagger.internal.codegen.kotlin.KotlinMetadataUtil.isCompanionObjectClass(KotlinMetadataUtil.java:100)
        at dagger.internal.codegen.ModuleProcessingStep.process(ModuleProcessingStep.java:116)
        at dagger.internal.codegen.ModuleProcessingStep.process(ModuleProcessingStep.java:59)
        at dagger.internal.codegen.validation.TypeCheckingProcessingStep.lambda$process$0(TypeCheckingProcessingStep.java:51)
        at com.google.common.collect.SingletonImmutableBiMap.forEach(SingletonImmutableBiMap.java:65)
        at dagger.internal.codegen.validation.TypeCheckingProcessingStep.process(TypeCheckingProcessingStep.java:48)
        at dagger.internal.codegen.ModuleProcessingStep.process(ModuleProcessingStep.java:104)
        at dagger.internal.codegen.ModuleProcessingStep.process(ModuleProcessingStep.java:59)
        at dagger.shaded.auto.common.BasicAnnotationProcessor$ProcessingStepAsStep.process(BasicAnnotationProcessor.java:495)
        at dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:228)
        at dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:208)
        at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)
        at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:166)
        at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)
        ... 41 more

更新Dagger版到2.46即可解决该问题。

在开始分析前因后果之前,我们先对metadata做个简单了解。

任何经过Kotlin/JVM编译器编译生成的class文件,都会带有@Metadata注解,如下是一个.kt文件生成的字节码反编译后的java代码

@Module
@Metadata(
   mv = {1, 9, 0},
   k = 1,
   d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\b\u0007\u0018\u0000 \u00032\u00020\u0001:\u0001\u0003B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0004"},
   d2 = {"Lcom/example/doudindemo/AnimalsModule;", "", "()V", "Companion", "doudindemo_debug"}
)
public final class AnimalsModule {
}

Kotlin.Metadata类中解释了每个属性的作用:

mv :编译时的元数据版本, 一般和kotlin 插件版本走,比如我现在用的kotlin 1.9.22, mv就是{1,9,0},  基本上就是mojor,minor

k :表明这个注解编码的元数据的种类,比如1是Class,2是File等, 超出范围的值就被当做非kotlin文件。

d1,d2 :根据k不同而不同

之所以这样简短命名,是为了减小生成的文件的大小。

那么生成的@Metadata有什么用呢?

字节码混淆器或者注解预处理器会用到,他们需要读取或修改metadata,为了简化样板代码和重复造轮子, kotlinx-metadata-jvm库就诞生了,提供了一套标准工具类。

现在我们回过头来看上面的错误,原因就是项目引用的Dagger库(2.26),它也使用了kotlinx-metadata-jvm库(0.1.0)来处理@Metadata注解,但是metadata库版本比较老,不支持当前编译环境生成的class文件中的Metadata,就好比我最多只支持java6, 你给我来个java 8, 我干不了。

那具体是怎么不支持呢?又是不支持哪个属性?

接下来需要看源码了,我们首先定位报错位置

Caused by: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0

        at dagger.internal.codegen.kotlin.KotlinMetadata.metadataOf(KotlinMetadata.java:206)

KotlinClassMetadata metadata = KotlinClassMetadata.read(header);
if (metadata == null) {
      // Should only happen on Kotlin < 1.0 (i.e. metadata version < 1.1)
      throw new IllegalStateException(
          "Unsupported metadata version. Check that your Kotlin version is >= 1.0");
    }

这里就是编译报错的信息位置,由此可见,KotlinClassMetadata.read(header)返回了null, 接着看为什么返回null

//kotlinx.metadata.jvm.KotlinClassMetadata.kt
companion object {
    /**
     * Reads and parses the given header of a Kotlin JVM class file and returns the correct type of [KotlinClassMetadata] encoded by
     * this header, or `null` if this header encodes an unsupported kind of Kotlin classes or has an unsupported metadata version.
     *
     * Throws [InconsistentKotlinMetadataException] if the metadata has inconsistencies which signal that it may have been
     * modified by a separate tool.
     *
     * @param header the header of a Kotlin JVM class file to be parsed
     */
    @JvmStatic
    fun read(header: KotlinClassHeader): KotlinClassMetadata? {
        // We only support metadata of version 1.1.* (this is Kotlin from 1.0 until today)
        if (!JvmMetadataVersion(
                header.metadataVersion,
                (header.extraInt and (1 shl 3)/* see JvmAnnotationNames.METADATA_STRICT_VERSION_SEMANTICS_FLAG */) != 0
            ).isCompatible()
        ) return null

        return try {
            when (header.kind) {
                KotlinClassHeader.CLASS_KIND -> KotlinClassMetadata.Class(header)
                KotlinClassHeader.FILE_FACADE_KIND -> KotlinClassMetadata.FileFacade(header)
                KotlinClassHeader.SYNTHETIC_CLASS_KIND -> KotlinClassMetadata.SyntheticClass(header)
                KotlinClassHeader.MULTI_FILE_CLASS_FACADE_KIND -> KotlinClassMetadata.MultiFileClassFacade(header)
                KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> KotlinClassMetadata.MultiFileClassPart(header)
                else -> KotlinClassMetadata.Unknown(header)
            }
        } catch (e: InconsistentKotlinMetadataException) {
            throw e
        } catch (e: Throwable) {
            throw InconsistentKotlinMetadataException("Exception occurred when reading Kotlin metadata", e)
        }
    }
}

这里会判断生成classMetadata版本是否兼容, 不兼容返回null

 if (!JvmMetadataVersion(
       header.metadataVersion,
       (header.extraInt and (1 shl 3)) != 0
    ).isCompatible()
) return null

是否兼容的要求(满足其中一条):

严格模式:    需要生成的Metadatamajor==依赖的major1), 生成的minor <= 依赖的minor(1)

非严格模式: 需要生成的Metadata中的major==1, minor<=4才算兼容

//kotlinx.metadata.internal.metadata.jvm.deserialization.JvmMetadataVersion.java
//依赖的metadata版本, major=1, minor=1
public static final JvmMetadataVersion INSTANCE = new JvmMetadataVersion(new int[]{1, 1, 15});

public boolean isCompatible() {
   return (this.getMajor() != 1 || this.getMinor() != 0) && (this.isStrictSemantics ? this.isCompatibleTo((BinaryVersion)INSTANCE) : this.getMajor() == 1 && this.getMinor() <= 4);
}

//kotlinx.metadata.internal.metadata.deserialization.BinaryVersion.java
protected final boolean isCompatibleTo(@NotNull BinaryVersion ourVersion) {
   Intrinsics.checkParameterIsNotNull(ourVersion, "ourVersion");
   return this.major == 0 ? ourVersion.major == 0 && this.minor == ourVersion.minor : this.major == ourVersion.major && this.minor <= ourVersion.minor;
}

很明显,我们生成的mvmajor=1, minor=9, 没有满足兼容性要求

@Metadata(

   mv = {1, 9, 0},

   k = 1

}

更新Dagger版到2.46即可,

implementation  'com.google.dagger:dagger:2.46'
implementation  'com.google.dagger:dagger-android:2.46'
kapt 'com.google.dagger:dagger-android-processor:2.46'
kapt 'com.google.dagger:dagger-compiler:2.46'

 更新后我们再看看之前报错的地方

这个版本和之前报错的地方metadataOf方法大致一样,

KotlinClassMetadata metadata = KotlinClassMetadata.read(header);

然后这里不会返回null了,因为它也更新了自己的kotlinx-metadata-jvm库,比如0.7.0, 再看read方法:

//kotlinx.metadata.jvm.KotlinClassMetadata.kt
@JvmStatic
fun read(annotationData: Metadata): KotlinClassMetadata {
    checkMetadataVersionForRead(annotationData)

    return wrapIntoMetadataExceptionWhenNeeded {
        when (annotationData.kind) {
            CLASS_KIND -> Class(annotationData)
            FILE_FACADE_KIND -> FileFacade(annotationData)
            SYNTHETIC_CLASS_KIND -> SyntheticClass(annotationData)
            MULTI_FILE_CLASS_FACADE_KIND -> MultiFileClassFacade(annotationData)
            MULTI_FILE_CLASS_PART_KIND -> MultiFileClassPart(annotationData)
            else -> Unknown
        }
    }
}

即使识别不了k属性,也只会返回Unknown Metadata对象而不是null, checkMetadataVersionForRead()检查版本也只要求生成的major<2即可。 

[versions] agp = "8.9.1" kotlin = "2.1.10" ksp = "2.1.10-1.0.30" compose-bom = "2025.02.00" lifecycle = "2.8.7" navigation = "2.8.7" activity-compose = "1.10.0" kotlinx-coroutines = "1.10.1" coil-compose = "2.7.0" compose-destination = "2.1.0-beta16" sheets-compose-dialogs = "1.3.0" markdown = "4.6.2" webkit = "1.12.1" appiconloader-coil = "1.5.0" parcelablelist = "2.0.1" libsu = "6.0.0" apksign = "1.4" cmaker = "1.2" compose-material = "1.7.8" compose-material3 = "1.3.1" compose-ui = "1.7.8" compose-foundation = "1.7.8" documentfile = "1.0.1" protobuf = "3.22.1" protobuf-gradle-plugin = "0.9.1" material = "1.10.0" androidxLifecycle = "2.8.7" squareRetrofit = "2.11.0" squareOkhttp = "4.12.0" kotlinxSerialization = "1.7.1" navigationFragmentKtx = "2.6.0" navigationUiKtx = "2.6.0" core-ktx = "1.13.0" gson = "2.10.1" room = "2.6.1" datastore-preferences = "1.1.1" serialization-protobuf = "1.6.0" work-manager = "2.10.0" zip4j = "2.11.5" apache-commons = "3.10.0" apache-commons-codec = "1.16.1" kotlinx-coroutines-core-jvm = "1.8.0" pickyou = "3.0.4" smbj = "0.14.0" smbj-rpc = "0.12.9" sshj = "0.38.0" guava-compat = "9999.0-empty-to-avoid-conflict-with-guava" sardine-next = "1.0.2" refine = "4.4.0" appcompat = "1.7.0" hilt-android = "2.49" hilt-android-compiler = "2.48" hilt-navigation-compose = "1.2.0" hilt-work = "1.2.0" hilt = "2.48" hilt-work-compiler = "1.2.0" mlkit-text = "16.0.1" mlkit-common-version = "18.11.0" activity = "1.9.1" savedstate = "1.2.1" espresso-core = "3.6.1" ktor-version = "2.0.3" quickie-bundled = "1.10.0" [plugins] agp-app = { id = "com.android.application", version.ref = "agp" } agp-lib = { id = "com.android.library", version.ref = "agp" } kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } lsplugin-apksign = { id = "org.lsposed.lsplugin.apksign", version.ref = "apksign" } lsplugin-cmaker = { id = "org.lsposed.lsplugin.cmaker", version.ref = "cmaker" } butterknife = { id = "com.jakewharton", version = "10.2.3" } com-google-protobuf = { id = "com.google.protobuf", version.ref = "protobuf-gradle-plugin" } hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } refine = { id = "dev.rikka.tools.refine", version.ref = "refine" } serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } application-common = { id = "application.common", version = "unspecified" } application-compose = { id = "application.compose", version = "unspecified" } application-hilt = { id = "application.hilt", version = "unspecified" } application-hilt-work = { id = "application.hilt.work", version = "unspecified" } library-common = { id = "library.common", version = "unspecified" } library-hilt = { id = "library.hilt", version = "unspecified" } library-hilt-work = { id = "library.hilt.work", version = "unspecified" } library-room = { id = "library.room", version = "unspecified" } library-compose = { id = "library.compose", version = "unspecified" } library-protobuf = { id = "library.protobuf", version = "unspecified" } library-test = { id = "library.test", version = "unspecified" } library-androidTest = { id = "library.androidTest", version = "unspecified" } library-firebase = { id = "library.firebase", version = "unspecified" } [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" } androidx-foundation = { module = "androidx.compose.foundation:foundation" } androidx-material3 = { module = "androidx.compose.material3:material3" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigation" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } androidx-compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended" } androidx-compose-material = { group = "androidx.compose.material", name = "material", version.ref = "compose-material" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "compose-material3" } androidx-compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose-ui" } androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "compose-ui" } androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose-foundation" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } androidx-ui = { module = "androidx.compose.ui:ui" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } com-github-topjohnwu-libsu-core = { group = "com.github.topjohnwu.libsu", name = "core", version.ref = "libsu" } com-github-topjohnwu-libsu-service = { group = "com.github.topjohnwu.libsu", name = "service", version.ref = "libsu" } com-github-topjohnwu-libsu-io = { group = "com.github.topjohnwu.libsu", name = "io", version.ref = "libsu" } dev-rikka-rikkax-parcelablelist = { module = "dev.rikka.rikkax.parcelablelist:parcelablelist", version.ref = "parcelablelist" } io-coil-kt-coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil-compose" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } me-zhanghai-android-appiconloader-coil = { group = "me.zhanghai.android.appiconloader", name = "appiconloader-coil", version.ref = "appiconloader-coil" } compose-destinations-core = { group = "io.github.raamcosta.compose-destinations", name = "core", version.ref = "compose-destination" } compose-destinations-ksp = { group = "io.github.raamcosta.compose-destinations", name = "ksp", version.ref = "compose-destination" } sheet-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets-compose-dialogs" } sheet-compose-dialogs-list = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "list", version.ref = "sheets-compose-dialogs" } sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "input", version.ref = "sheets-compose-dialogs" } markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" } lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "27.0.12077973" } androidx-documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" } androidx-lifecycle-service = { module = "androidx.lifecycle:lifecycle-service", version.ref = "androidxLifecycle" } androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } # Koin Inject # https://insert-koin.io/docs/setup/koin koin-core = { group = "io.insert-koin", name = "koin-core", version = "3.4.0" } koin-android = { group = "io.insert-koin", name = "koin-android", version = "3.4.0" } koin-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version = "3.4.4" } protoc = { group = "com.google.protobuf", name = "protoc", version.ref = "protobuf" } protobuf-javalite = { group = "com.google.protobuf", name = "protobuf-javalite", version.ref = "protobuf" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" } kotlinx-serialization-protobuf = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-protobuf", version.ref = "kotlinxSerialization" } square-okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "squareOkhttp" } square-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "squareOkhttp" } square-okhttp-dnsoverhttps = { group = "com.squareup.okhttp3", name = "okhttp-dnsoverhttps", version.ref = "squareOkhttp" } square-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "squareRetrofit" } square-retrofit-kotlinxSerialization = { group = "com.squareup.retrofit2", name = "converter-kotlinx-serialization", version.ref = "squareRetrofit" } retrofit-converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "squareRetrofit" } smbj = { module = "com.hierynomus:smbj", version.ref = "smbj" } smbj-rpc = { module = "com.rapid7.client:dcerpc", version.ref = "smbj-rpc" } sshj = { module = "com.hierynomus:sshj", version.ref = "sshj" } guava-compat = { module = "com.google.guava:listenablefuture", version.ref = "guava-compat" } sardine-next = { module = "com.github.xayahsususu:sardine-next", version.ref = "sardine-next" } # rhino mozilla-rhino = "org.mozilla:rhino:1.8.0" mozilla-rhino-xml = "org.mozilla:rhino-xml:1.8.0" mozilla-rhino-tools = "org.mozilla:rhino-tools:1.8.0" #navigation androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" } lifecycle-compiler = { group = "androidx.lifecycle", name = "lifecycle-compiler", version.ref = "lifecycle"} gson = { module = "com.google.code.gson:gson", version.ref = "gson" } serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "serialization-protobuf" } androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore-preferences" } # Dependencies of the included build-logic android-build-logic = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } kotlin-build-logic = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } ksp-build-logic = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } #firebase-crashlytics-build-logic = { group = "com.google.firebase", name = "firebase-crashlytics-gradle", version.ref = "firebase-crashlytics-gradle" } pickyou = { module = "com.github.xayahsususu:libpickyou", version.ref = "pickyou" } zip4j = { module = "net.lingala.zip4j:zip4j", version.ref = "zip4j" } androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work-manager" } apache-commons-net = { module = "commons-net:commons-net", version.ref = "apache-commons" } apache-commons-codec = { module = "commons-codec:commons-codec", version.ref = "apache-commons-codec" } kotlinx-coroutines-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "kotlinx-coroutines-core-jvm" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } refine-annotation = { module = "dev.rikka.tools.refine:annotation", version.ref = "refine" } refine-annotation-processor = { module = "dev.rikka.tools.refine:annotation-processor", version.ref = "refine" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt-android" } hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt-android-compiler" } hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hilt-work" } hilt-work-compiler = { module = "androidx.hilt:hilt-compiler", version.ref = "hilt-work-compiler" } androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "squareOkhttp" } # commons commons-exec = "org.apache.commons:commons-exec:1.3" commons-io = "commons-io:commons-io:2.6" timscriptov-apksigner = "com.github.TimScriptov:apksigner:1.2.0" core-ktx = { module = "androidx.core:core-ktx", version.ref = "core-ktx" } google-gson = { module = "com.google.code.gson:gson", version.ref = "gson" } # androidx compose compose-bom = "androidx.compose:compose-bom:2025.02.00" compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } compose-material = { module = "androidx.compose.material:material" } compose-ui = { module = "androidx.compose.ui:ui" } # mlkit mlkit-common = { group = "com.google.mlkit", name = "common", version.ref = "mlkit-common-version" } mlkit-text-recognition = { module = "com.google.mlkit:text-recognition", version.ref = "mlkit-text" } mlkit-text-recognition-chinese = { module = "com.google.mlkit:text-recognition-chinese", version.ref = "mlkit-text" } mlkit-text-recognition-devanagari = { module = "com.google.mlkit:text-recognition-devanagari", version.ref = "mlkit-text" } mlkit-text-recognition-japanese = { module = "com.google.mlkit:text-recognition-japanese", version.ref = "mlkit-text" } mlkit-text-recognition-korean = { module = "com.google.mlkit:text-recognition-korean", version.ref = "mlkit-text" } androidx-viewpager2 = "androidx.viewpager2:viewpager2:1.1.0" androidx-work = "androidx.work:work-runtime:2.9.1" androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version = "2.2.0" } androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activity" } documentfile = "androidx.documentfile:documentfile:1.0.1" androidx-savedstate = { module = "androidx.savedstate:savedstate", version.ref = "savedstate" } androidx-savedstate-ktx = { module = "androidx.savedstate:savedstate-ktx", version.ref = "savedstate" } preference-ktx = "androidx.preference:preference-ktx:1.2.1" androidx-annotation = "androidx.annotation:annotation:1.9.1" activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" } espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } # ktor ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor-version" } ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor-version" } ktor-server-websockets = { module = "io.ktor:ktor-server-websockets", version.ref = "ktor-version" } ktor-client-websockets = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor-version" } ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor-version" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor-version" } #shizuku shizuku-api = "dev.rikka.shizuku:api:13.1.5" shizuku-provider = "dev.rikka.shizuku:provider:13.1.5" kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } compose-material3 = "androidx.compose.material3:material3:1.3.1" compose-material3-window-size = "androidx.compose.material3:material3-window-size-class:1.3.1" compose-material3-adaptive-navigation-suite = "androidx.compose.material3:material3-adaptive-navigation-suite:1.3.1" #rxjava quickie-bundled = { module = "io.github.g00fy2.quickie:quickie-bundled", version.ref = "quickie-bundled" } rxjava2 = "io.reactivex.rxjava2:rxjava:2.2.21" rxjava2-rxandroid = "io.reactivex.rxjava2:rxandroid:2.1.1" rxjava3 = "io.reactivex.rxjava3:rxjava:3.1.5" rxjava3-rxandroid = "io.reactivex.rxjava3:rxandroid:3.0.2" javet-android-node = "com.caoccao.javet:javet-android-node:3.1.4" leakcanary-android = "com.squareup.leakcanary:leakcanary-android:2.13" leakcanary-objectinfo-watcher-android = "com.squareup.leakcanary:leakcanary-object-watcher-android:2.13" retrofit2-retrofit = "com.squareup.retrofit2:retrofit:2.11.0" retrofit2-converter-gson = "com.squareup.retrofit2:converter-gson:2.11.0" #Glide glide = "com.github.bumptech.glide:glide:4.8.0" glide-ksp = "com.github.bumptech.glide:ksp:4.14.2" glide-compiler = "com.github.bumptech.glide:compiler:4.12.0" #lifecycle lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" } lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycle" } lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime", version.ref = "lifecycle" } lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } lifecycle-viewmodel-savedstate = { module = "androidx.lifecycle:lifecycle-viewmodel-savedstate", version.ref = "lifecycle" } lifecycle-service = { module = "androidx.lifecycle:lifecycle-service", version.ref = "lifecycle" } androidx-swiperefreshlayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" ktsh = "com.jaredrummler:ktsh:1.0.0" coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil-compose" } [bundles] ktor = ["ktor-server-core", "ktor-server-netty", "ktor-server-websockets", "ktor-client-websockets", "ktor-client-okhttp", "ktor-client-core"] mlkit = [ "mlkit-text-recognition", "mlkit-text-recognition-chinese", "mlkit-text-recognition-devanagari", "mlkit-text-recognition-japanese", "mlkit-text-recognition-korean" ] shizuku = ["shizuku-api", "shizuku-provider"] 这个是一个Android Studio 的 libs.versions.toml 文件的代码,请帮我重构,去掉重复的代码,类似于ktsh = "com.jaredrummler:ktsh:1.0.0"这样的代码,修改为 module 或在 group 格式,并且在[versions]中定义版本号
08-19
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值