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

发布Android库至Maven Local时遇未解析引用问题求助

解决Android库发布到Maven Local后DSL/扩展函数无法解析的问题

以下是针对问题的具体修复方案,按优先级排序:

1. 修正发布变体配置,确保包含Kotlin元数据

Kotlin的扩展函数、DSL语法依赖.kotlin_module元数据文件,若发布配置未正确关联Kotlin产物,会导致消费方无法解析相关符号。建议使用release变体发布(更符合库发布规范),并确保变体配置包含源码和元数据:

修改library/build.gradle.kts中的配置:

android {
    namespace = ".."
    publishing {
        // 对应发布的release变体,启用源码Jar
        singleVariant("release") {
            withSourcesJar()
            withJavadocJar() // 可选,建议添加以提供API文档
        }
    }
    kotlinOptions {
        freeCompilerArgs += "-Xexplicit-api=strict"
    }
}

publishing {
    publications {
        register<MavenPublication>("sdkLibrary") {
            groupId = "<group_id>"
            artifactId = "<artifact_id>"
            version = "0.0.1-SNAPSHOT"

            // 直接关联release组件,自动包含aar、Kotlin元数据等产物
            from(components["release"])
        }
    }
}

若必须使用debug变体发布,需手动添加Kotlin元数据产物:

publishing {
    publications {
        register<MavenPublication>("sdkLibrary") {
            // ... 其他配置
            from(components["debug"])
            // 手动添加Kotlin元数据文件
            artifact(tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().findByName("debugKotlin")?.outputs?.files?.first { it.name.endsWith(".kotlin_module") })
        }
    }
}

2. 确保KSP生成代码被打包进发布产物

你的预编译插件启用了KSP,生成的代码需要被纳入库的源码集合,否则消费方无法访问KSP生成的DSL或扩展函数。修改precompiled_plugin/android-library-base.kts:

android {
    // ... 其他现有配置
    sourceSets {
        // 将KSP生成的代码添加到对应变体的源码路径
        getByName("main").java.srcDir("build/generated/ksp/main/kotlin")
        getByName("debug").java.srcDir("build/generated/ksp/debug/kotlin")
        getByName("release").java.srcDir("build/generated/ksp/release/kotlin")
    }
}

3. 检查Explicit API模式下的符号可见性

你启用了-Xexplicit-api=strict,该模式要求所有对外暴露的API必须显式标注public修饰符。若你的DSL类、扩展函数未显式声明public,会默认被标记为internal,导致消费方无法访问:

错误示例(默认internal):

fun Context.showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

正确示例(显式public):

public fun Context.showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

4. 验证Maven Local发布产物的完整性

执行./gradlew publishToMavenLocal后,前往本地仓库路径(默认~/.m2/repository/<group_id>/<artifact_id>/0.0.1-SNAPSHOT)检查以下文件是否存在:

  • <artifact_id>-0.0.1-SNAPSHOT.aar:库的核心产物
  • <artifact_id>-0.0.1-SNAPSHOT-sources.jar:源码包
  • <artifact_id>-0.0.1-SNAPSHOT.module:Kotlin元数据文件

若缺失任意文件,说明发布配置存在问题,需重新检查上述步骤。

5. 消费方依赖配置检查

确保消费方项目中正确引入依赖,并启用Kotlin Android插件:

// 消费方build.gradle.kts
plugins {
    id("com.android.application")
    kotlin("android") // 必须启用该插件才能解析Kotlin扩展函数
}

dependencies {
    // 若发布的是release变体,直接引入
    implementation("<group_id>:<artifact_id>:0.0.1-SNAPSHOT")
    // 若发布的是debug变体,需指定debugImplementation
    // debugImplementation("<group_id>:<artifact_id>:0.0.1-SNAPSHOT")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:42:05