Flutter插件集成AAR模块遇到Release构建失败及Debug模式导航黑屏返回问题
我来帮你拆解并解决这两个头疼的问题,咱们一个一个来捋:
一、Release构建失败:Could not find com.example.my_module:flutter_release:1.0
问题根源
从错误日志能看出来,Gradle在打包Release版本时,找不到你声明的AAR依赖com.example.my_module:flutter_release:1.0。结合你的插件Gradle配置,大概率是这几个情况:
- 你的Flutter模块生成的AAR没正确发布到指定的本地Maven仓库
D:/module_test/my_test_plugin/repo - 依赖声明的GroupId、ArtifactId或者版本号,和你实际发布的AAR信息对不上
- 本地Maven仓库的路径配置写错了,或者系统没有访问这个路径的权限
解决步骤
先确认AAR的Maven发布配置
你需要先确保你的Flutter模块(就是生成AAR的那个项目)的Android部分build.gradle里,有正确的Maven发布配置,能把AAR输出到指定的本地仓库。举个例子,配置大概长这样:apply plugin: 'maven-publish' publishing { publications { release(MavenPublication) { groupId 'com.example.my_module' artifactId 'flutter_release' version '1.0' artifact("$buildDir/outputs/aar/flutter-release.aar") } debug(MavenPublication) { groupId 'com.example.my_module' artifactId 'flutter_debug' version '1.0' artifact("$buildDir/outputs/aar/flutter-debug.aar") } } repositories { maven { url uri('D:/module_test/my_test_plugin/repo') } } }配好之后,在模块的根目录执行
./gradlew publish,把AAR发布到本地仓库里。检查本地仓库的文件结构
去D:/module_test/my_test_plugin/repo下面看看,有没有com/example/my_module/flutter_release/1.0/这个路径,里面是不是有flutter_release-1.0.pom和flutter_release-1.0.aar这两个文件。要是没有,说明发布过程出问题了,重新跑一遍发布命令。核对插件Gradle的依赖配置
确保插件里的Release依赖和你发布的AAR信息完全一致:releaseImplementation 'com.example.my_module:flutter_release:1.0'同时确认本地仓库的路径没写错,别打错大小写或者斜杠:
maven { url 'D:/module_test/my_test_plugin/repo' }
二、Debug模式导航黑屏返回,进不去模块屏幕
问题根源
结合你的模块代码和插件的MainActivity片段来看,问题可能出在这几个地方:
- FlutterEngine的启动逻辑有问题:你提到了
FlutterEngineCache但代码不完整,大概率是没正确初始化或缓存引擎,导致启动模块时引擎没加载起来 - 模块入口点的调用方式不对:虽然你加了
@pragma('vm:entry-point'),但插件可能没正确触发这个main函数,或者你的SplashScreen页面有自动返回的逻辑 - SplashScreen本身有问题:比如页面是空的,或者初始化时直接
pop回了原页面
解决步骤
修正插件里的FlutterEngine启动逻辑
你的插件代码片段到// Don't create engi就断了,正确的打开模块的逻辑应该是这样的(在onMethodCall里处理打开模块的方法):override fun onMethodCall(call: MethodCall, result: Result) { if (call.method == "openSdkModule") { activity?.let { act -> // 给引擎起个唯一ID,方便缓存 val engineId = "sdk_module_engine" var flutterEngine = FlutterEngineCache.getInstance().get(engineId) // 没有缓存的话就新建一个 if (flutterEngine == null) { flutterEngine = FlutterEngine(act.applicationContext) // 执行模块的main函数(对应你加了@pragma的那个入口) flutterEngine.dartExecutor.executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() .withEntrypoint("main") ) // 缓存引擎,下次不用重复创建 FlutterEngineCache.getInstance().put(engineId, flutterEngine) } // 用缓存的引擎启动FlutterActivity val intent = FlutterActivity .withCachedEngine(engineId) .build(act) act.startActivity(intent) } ?: result.error("ACTIVITY_NULL", "当前没有绑定Activity", null) } else { result.notImplemented() } }检查SplashScreen的代码
黑屏又返回,很大可能是SplashScreen里有自动返回的逻辑,比如写了Navigator.pop(context)或者定时器一到就跳回原页面。打开你的screens/splash_screen.dart,看看是不是有这种情况。比如如果是过渡页,应该跳转到模块内的其他页面,而不是直接pop:// 举个正确的SplashScreen例子,没有自动返回 class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @override State<SplashScreen> createState() => _SplashScreenState(); } class _SplashScreenState extends State<SplashScreen> { @override void initState() { super.initState(); // 如果要延迟跳转,应该跳转到模块内的主页,而不是pop // Future.delayed(const Duration(seconds: 2), () { // Navigator.pushReplacement(context, MaterialPageRoute(builder: (c) => HomeScreen())); // }); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Text("SDK模块启动页"), ), ); } }检查模块的主题和资源配置
你的模块代码里的MaterialApp配置看起来没问题,但可以先把SplashScreen换成一个简单的Scaffold加文本,排除是主题或页面配置导致的黑屏。另外,确保模块的screens/splash_screen.dart文件存在,没有语法错误。
额外要注意的点
- Debug模式的依赖也要加上:你的插件Gradle里注释掉了Debug的AAR依赖,Debug模式能运行可能是直接依赖了源码,但这样会导致模块代码没正确加载,所以才黑屏。记得加上:
debugImplementation 'com.example.my_module:flutter_debug:1.0' - Flutter版本要兼容:插件里的
flutter_embedding版本要和你用的Flutter SDK版本一致,不然可能出现引擎初始化失败。你可以用flutter doctor -v查看当前的embedding版本,然后替换到插件的依赖中。
内容来源于stack exchange

