从原生AAR启动Flutter Activity崩溃问题排查求助
解决Flutter集成AAR打包后缺失依赖的崩溃问题
核心原因
你的Android项目打包成AAR时,默认不会将依赖的Flutter AAR及Flutter核心库打包进去,导致宿主项目缺少Flutter相关类,引发ClassNotFoundException。
具体解决步骤
1. 配置依赖传递
在你要打包成AAR的Android模块的build.gradle中,将Flutter相关依赖的implementation改为api,让依赖能传递给宿主项目:
// 替换原有的implementation为api api files('libs/flutter_release.aar') // 你导入的Flutter导出AAR api 'io.flutter:flutter_embedding_release:x.x.x' // 版本号需与你使用的Flutter SDK完全匹配
注意:
flutter_embedding_release的版本要和Flutter项目pubspec.lock里的Flutter版本一致。
2. 确保打包时保留依赖声明
如果使用旧版Gradle,在模块的build.gradle中添加如下配置(新版Gradle通常无需此操作):
android { // 其他配置... publishNonDefault true }
3. 宿主项目配置Flutter仓库
在宿主项目的根build.gradle中添加Flutter仓库地址,让宿主能拉取到依赖:
allprojects { repositories { // 其他仓库... maven { url "${flutterSdkPath}/bin/cache/artifacts/engine/android-release" } } }
其中
flutterSdkPath替换为你本地Flutter SDK的实际路径。
4. 验证依赖传递有效性
打包你的Android模块AAR后,解压查看其中的pom.xml文件,确认里面包含Flutter相关的依赖声明,确保宿主项目引入时能自动下载这些依赖。
5. 备选方案:强制打包Flutter核心库(不推荐)
如果宿主项目无法配置Flutter仓库,可将Flutter核心库打包进你的AAR(会增大体积且易引发版本冲突):
- 将Flutter的
flutter_release.aar和flutter_embedding_release.aar复制到模块libs目录 - 在
build.gradle中配置:
android { packagingOptions { pickFirst '**/*.so' merge '**/AndroidManifest.xml' } } dependencies { implementation (files('libs/flutter_release.aar'), files('libs/flutter_embedding_release.aar')) { transitive = true } }
额外注意事项
- 确保
IntegratedActivity在AndroidManifest.xml中正确声明,包含FlutterActivity所需配置:
<activity android:name=".IntegratedActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> </activity>
- 宿主项目的minSdkVersion不能低于Flutter要求的版本(通常为API 16及以上)。
内容的提问来源于stack exchange,提问作者Chris Maverick
相关产品推荐
相关产品推荐

