Flutter 项目本地 Maven 引入 AAR 找不到?一次 Gradle 路径问题排查

2 阅读2分钟

Flutter 本地 Maven 引入 AAR,为什么 settings.gradle.kts 里配置了却不生效?

在 Flutter Android 项目里接入本地 AAR 时,我一开始把本地 Maven 仓库配置写在了 settings.gradle.kts:

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven { url = uri("local-maven") }
    }
}

依赖写在 android/app/build.gradle.kts:

dependencies {
    implementation("com.example.sdk:example-sdk:1.0.0")
}

本地 Maven 目录结构也是正确的:

android/local-maven/com/example/sdk/example-sdk/1.0.0/example-sdk-1.0.0.aar

但 Gradle 仍然提示找不到:

com.example.sdk:example-sdk:1.0.0

原因

问题不在 AAR,也不在 Maven 目录结构,而是 Flutter Android 项目里 project 级 repositories 覆盖/影响了 settings 里的 repositories。

Gradle 里有两个常见仓库配置位置:

settings.gradle.kts
android/build.gradle.kts

settings.gradle.kts 里的:

dependencyResolutionManagement {
    repositories { ... }
}

理论上可以统一管理依赖仓库。

但在 Flutter 项目里,android/build.gradle.kts 通常还会有:

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

同时 Flutter Gradle Plugin 自己也可能给 project 动态添加仓库。

在这种情况下,project 级 repositories 会参与依赖解析。默认模式下,如果 project 自己声明了 repositories,settings.gradle.kts 里的仓库配置就不一定是最终使用的那一套。

所以你只在 settings.gradle.kts 里加本地 Maven,有时不会生效。

正确做法

把本地 Maven 仓库加到 android/build.gradle.kts 的 allprojects.repositories 里:

allprojects {
    repositories {
        maven {
            url = rootProject.layout.projectDirectory
                .dir("local-maven")
                .asFile
                .toURI()
        }

        google()
        mavenCentral()
    }
}

这样 :app 模块和其他 Android 子模块都能看到这个本地 Maven 仓库。

为什么不要直接写相对路径?

不要这样写:

maven { url = uri("local-maven") }

因为在多模块项目里,相对路径可能会按当前模块目录解析。

例如在 :app 模块中,它可能会去找:

android/app/local-maven

但真实目录是:

android/local-maven

所以更稳的是用:

rootProject.layout.projectDirectory.dir("local-maven")

它永远从 Android 根工程目录开始找。

总结

settings.gradle.kts 里配置本地 Maven 不生效,主要是因为 Flutter Android 项目里 project 级 repositories 也参与了依赖解析,最终没有使用到 settings 里的仓库配置。

所以更稳的方式是在 android/build.gradle.kts 里配置:

allprojects {
    repositories {
        maven {
            url = rootProject.layout.projectDirectory
                .dir("local-maven")
                .asFile
                .toURI()
        }
        google()
        mavenCentral()
    }
}

一句话总结:

Flutter 项目里,本地 Maven 仓库最好配置到 android/build.gradle.kts 的 allprojects.repositories,并且用 rootProject 固定路径。