4、Android项目集成Flutter:Gradle配置、添加Flutter依赖、同步项目
好,咱们接着往下走。上一章我们把Flutter模块塞进了Android项目的目录里,但这时候它俩还是「各玩各的」。想让Android认识Flutter,得在Gradle这边牵个线。
说白了,Gradle就是Android项目的「大管家」。你告诉它Flutter模块在哪、需要哪些依赖,它就能帮你把两边的代码和资源揉到一起。我刚开始搞混合项目时,总觉得Gradle配置很玄学,后来摸清了套路,发现其实就是几个关键步骤。
核心思路:让Android项目在编译时,能自动找到Flutter模块的源码和产物。就像你告诉编译器:「嘿,隔壁Flutter那小子也是咱们团队的,编译时带上他。」
4.1 修改settings.gradle:引入Flutter模块
第一步,打开Android项目根目录下的 settings.gradle 文件。这个文件负责告诉Gradle「项目里有哪些模块」。默认情况下,它只认识 app 模块。我们要把Flutter模块加进去。
// settings.gradle
include ':app'
// 添加Flutter模块
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
'flutter_module/.android/include_flutter.groovy'
))
嗯,这里要注意路径。我的习惯是把 flutter_module 放在Android项目的同级目录下,所以用 settingsDir.parentFile 往上跳一级。如果你的Flutter模块在别的位置,记得调整路径。
我曾经遇到一个坑:路径写成了相对路径,结果在不同机器上编译时路径解析失败。后来统一用 new File() 构造绝对路径,再也没出过问题。
小技巧:如果你用的是Android Studio,修改完settings.gradle后,IDE通常会提示「Sync Now」。别急着点,先把后面几步配完再一起同步。
4.2 修改app/build.gradle:添加Flutter依赖
接下来,打开 app/build.gradle。这是Android应用模块的构建脚本。我们要在这里声明对Flutter的依赖。
// app/build.gradle
dependencies {
implementation project(':flutter')
// 其他依赖...
}
等等,就这么简单?对,就一行。但前提是上一步的settings.gradle配置正确。这行代码告诉Gradle:「我需要依赖一个叫 flutter 的模块,它的构建配置在刚才引入的那个groovy脚本里。」
你可能会问:为什么是 :flutter 而不是 :flutter_module?因为Flutter模块内部,Android子模块的名字就叫 flutter。这是Flutter工具链自动生成的,咱们别乱改。
注意:如果你的Flutter模块里启用了Kotlin或者Java 8特性,记得在 android 块里配置对应的编译选项。比如:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
4.3 配置Flutter的Gradle仓库
Flutter本身也依赖一些第三方库,比如AndroidX、Google的Maven仓库。这些需要在项目级的 build.gradle 里声明。
// 项目根目录下的 build.gradle
buildscript {
repositories {
google()
mavenCentral()
// 添加Flutter的仓库
maven { url 'https://storage.googleapis.com/download.flutter.io' }
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.0'
// 注意:Flutter Gradle插件不需要在这里声明
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://storage.googleapis.com/download.flutter.io' }
}
}
为什么Flutter需要这个仓库?因为Flutter引擎的预编译产物(比如libflutter.so)是托管在Google的云存储上的。Gradle编译时,会从这里下载对应的文件。
我记得有一次,公司内网限制了外网访问,结果编译时一直卡在下载Flutter引擎那一步。后来我们搭了个本地Maven代理,把Flutter的产物缓存到内网,才解决了问题。如果你也遇到类似情况,可以考虑离线部署Flutter引擎。
4.4 同步项目:让配置生效
配置写完了,接下来就是见证奇迹的时刻——同步项目。
- 点击Android Studio工具栏上的「Sync Now」按钮(或者File → Sync Project with Gradle Files)。
- 观察底部Build窗口的输出。如果一切顺利,你会看到类似这样的日志:
Executing tasks: [clean, :flutter:generateDebugSources, :app:generateDebugSources]
...
BUILD SUCCESSFUL in 2m 15s
如果出现错误,别慌。最常见的错误有几种:
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
| Could not find method binding() | settings.gradle中setBinding语法错误 | 检查是否漏了 new Binding([gradle: this]) |
| Project with path ':flutter' could not be found | Flutter模块路径配置错误 | 检查include_flutter.groovy的路径是否正确 |
| Failed to resolve: io.flutter:flutter_embedding | Flutter仓库未配置或网络不通 | 检查build.gradle中的maven仓库地址 |
我的经验:同步成功后,建议先跑一次 flutter clean 和 ./gradlew clean,把之前的缓存清掉。有时候旧缓存会导致一些莫名其妙的编译问题。
4.5 验证集成是否成功
项目同步完成后,怎么知道Flutter真的集成进来了?一个简单的方法:在Android的 MainActivity 里尝试引用Flutter的类。
// MainActivity.java
import io.flutter.embedding.android.FlutterActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 如果能正常导入FlutterActivity,说明集成成功
// 后续可以在这里启动Flutter页面
}
}
如果IDE没有报红,import语句能正常解析,那就说明Flutter的依赖已经成功添加到项目里了。
你想想看,这一步其实就是在验证Gradle的「牵线」工作是否到位。线牵好了,两边就能互相调用了。
4.6 本章小结
这一章我们做了三件事:
- 在
settings.gradle里引入Flutter模块 - 在
app/build.gradle里添加Flutter依赖 - 配置Flutter的Maven仓库并同步项目
嗯,看起来步骤不多,但每一步都关系到后续能不能正常编译。我个人建议,每改完一个文件就同步一次,别攒到一块儿改。这样出错了也容易定位问题。
下一章,我们会真正开始写代码——在Android项目里启动Flutter页面。到时候你会发现,前面这些Gradle配置的功夫,全都没白费。
公众号:蓝海资料掘金营,微信deep3321