Flutter应用release版本APK无法打开摄像头,调试模式正常如何解决?
我开发了一款调用手机摄像头的Flutter应用,调试模式下可以正常使用摄像头功能,但打包生成的release版本APK安装后打开摄像头出现白屏。我已经在AndroidManifest中添加了相关权限,应用也会主动请求用户授予摄像头权限。
调试模式下的显示效果如下:
安装app-release.apk后的显示效果如下:
请问这个问题可能是什么原因导致的?
混淆规则缺失
Flutter Release包默认开启R8混淆,若未添加相机插件对应的混淆规则,相关类会被误裁剪导致功能调用失败。解决方法:在android/app/proguard-rules.pro文件中添加对应插件的保留规则,如果你使用官方camera插件,添加规则如下:-keep class io.flutter.plugins.camera.** { *; }若使用第三方相机库,参照库文档添加对应混淆规则即可。
异步时序异常
调试模式为JIT编译,执行速度慢于Release模式的AOT编译,很容易出现调试模式下相机初始化时序刚好符合预期、Release模式下未完成初始化就提前渲染预览组件的情况,导致白屏。解决方法:给相机Controller添加初始化完成的监听,只有确认初始化成功后再挂载预览组件,避免空渲染。<uses-feature>声明缺失
仅添加相机权限不满足部分Android系统的校验要求,Release模式下会被拒绝分配相机资源。需要在AndroidManifest.xml中补充硬件特性声明:<uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />资源裁剪误删依赖
若你在android/app/build.gradle中开启了shrinkResources true,打包时可能会误裁剪相机插件依赖的资源文件,导致渲染异常。可以临时将shrinkResources改为false打包测试,如果问题消失,添加对应资源保留规则即可。版本兼容问题
部分版本的Flutter SDK和相机插件存在Release模式专属的兼容性bug,可尝试将你使用的相机插件升级到最新稳定版,或回退到社区验证无问题的历史版本验证。
内容的提问来源于stack exchange,提问作者Kevnlan

