如何在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
相关产品推荐
相关产品推荐

