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

如何在Android AAR构件库中完整包含Flutter模块?

如何在Android AAR构件库中包含完整的Flutter模块?

问题场景

我正在开发一个包含Flutter模块的Android SDK模块,已按官方指引将Flutter模块集成到Android项目中,集成代码如下(settings.gradle中):

setBinding(new Binding([gradle: this]))
evaluate(new File(                                                     
settingsDir.parentFile,                                           
'flutter_module/.android/include_flutter.groovy'                   
))                                                                     

同时在Android模块的app/build.gradle中添加了Flutter模块依赖:

implementation project(':flutter')

目前已通过Method Channel完成Flutter模块集成,运行正常,但使用以下Gradle代码生成的AAR并未包含Flutter子模块:

group = 'com.example.myAndroidSdk'
version = '1.0.0'

// Add sources as an artifact
task sourceJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier "source"
}

// Loop over all variants
android.libraryVariants.all { variant ->
    variant.outputs.all { output ->
        // This creates a publication for each variant
        publishing.publications.create(variant.name, MavenPublication) {
            // The sources artifact from earlier
            artifact sourceJar

            // Variant dependent artifact, e.g. release, debug
            artifact source: output.outputFile, classifier: output.name

            // Go through all the dependencies for each variant and add them to the POM
            // file as dependencies
            pom.withXml {
                def dependencies = asNode().appendNode('dependencies')

                // Filter out anything that's not an external dependency. You shouldn't
                // be publishing artifacts that depend on local (e.g. project) dependencies,
                // but who knows...
                configurations.getByName(variant.name + "CompileClasspath").allDependencies
                        .findAll { it instanceof ExternalDependency }
                        .each {
                            def dependency = dependencies.appendNode('dependency')

                            dependency.appendNode('groupId', it.group)
                            dependency.appendNode('artifactId', it.name)
                            dependency.appendNode('version', it.version)
                        }
            }
        }
    }
}

// Ensure that the publish task depends on assembly
tasks.all { task ->
    if (task instanceof AbstractPublishToMaven) {
        task.dependsOn assemble
    }
}

解决方案

要让AAR包含完整的Flutter模块,需要从依赖作用域、产物合并、发布配置三个维度修改:

1. 调整依赖作用域

将Android库模块中对Flutter的依赖从implementation改为api,确保Flutter的依赖能被传递到AAR的使用者:

api project(':flutter')

2. 修改发布配置,保留项目依赖

原代码过滤了本地项目依赖(如:flutter),导致POM文件中未包含Flutter模块的依赖声明。修改POM生成逻辑,将项目依赖也加入:

// 替换原发布配置中的pom.withXml部分
pom.withXml {
    def dependencies = asNode().appendNode('dependencies')

    configurations.getByName(variant.name + "CompileClasspath").allDependencies.each {
        def dependency = dependencies.appendNode('dependency')
        if (it instanceof ExternalDependency) {
            dependency.appendNode('groupId', it.group)
            dependency.appendNode('artifactId', it.name)
            dependency.appendNode('version', it.version)
        } else if (it instanceof ProjectDependency) {
            // 处理本地项目依赖,适配Flutter模块
            dependency.appendNode('groupId', group)
            dependency.appendNode('artifactId', it.name.replace(':', ''))
            dependency.appendNode('version', version)
        }
    }
}

3. 合并Flutter的原生产物与资源

Flutter模块包含JNI库、assets资源等,需要将这些内容合并到Android库的构建产物中:

// 在android{}块中添加JNI库合并配置
android {
    sourceSets {
        main {
            // 引入Flutter的JNI库
            jniLibs.srcDirs += project(':flutter').file('build/intermediates/library_jni/release/jni')
        }
    }
}

// 添加Flutter assets资源合并任务
task mergeFlutterAssets(type: Copy) {
    from project(':flutter').file('.android/Flutter/build/intermediates/flx/release/flutter_assets')
    into android.sourceSets.main.assets.srcDirs[0]
}

// 确保资源合并任务在构建前执行
preBuild.dependsOn mergeFlutterAssets

4. 确保发布任务依赖Flutter构建

修改发布任务的依赖,保证Flutter模块的产物已生成:

tasks.all { task ->
    if (task instanceof AbstractPublishToMaven) {
        task.dependsOn assemble, project(':flutter').assemble
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:58:10