使用google_ml_vision进行手部检测时Android应用持续崩溃
Android端使用google_ml_vision崩溃:java.lang.NoClassDefFoundError: com.google.mlkit.vision.common.internal.Detector
我在Flutter应用中使用google_ml_vision插件实现手部检测功能,但Android端启动相机并处理图像时立即崩溃,iOS暂未测试。已尝试插件最新版本^0.0.8及旧版本^0.0.7,执行过flutter clean、flutter pub get并清除缓存重启,问题依然存在。
崩溃日志
E/AndroidRuntime(14020): Process: com.synergates.dob.digital_onboarding.js, PID: 14020 E/AndroidRuntime(14020): java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/mlkit/vision/common/internal/Detector; E/AndroidRuntime(14020): at com.brianmtully.flutter.plugins.googlemlvision.MlVisionHandler.handleDetection(GoogleMlVisionHandler.java:71) E/AndroidRuntime(14020): at com.brianmtully.flutter.plugins.googlemlvision.MlVisionHandler.onMethodCall(GoogleMlVisionHandler.java:37) E/AndroidRuntime(14020): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:258) E/AndroidRuntime(14020): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) E/AndroidRuntime(14020): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:322) E/AndroidRuntime(14020): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) E/AndroidRuntime(14020): at android.os.Handler.handleCallback(Handler.java:942) E/AndroidRuntime(14020): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(14020): at android.os.Looper.loopOnce(Looper.java:240) E/AndroidRuntime(14020): at android.os.Looper.loop(Looper.java:351) E/AndroidRuntime(14020): at android.app.ActivityThread.main(ActivityThread.java:8380) E/AndroidRuntime(14020): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(14020): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) E/AndroidRuntime(14020): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013) E/AndroidRuntime(14020): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.mlkit.vision.common.internal.Detector" on path: DexPathList[[zip file "/data/app/~~o2uTxdDT44Su9DZpXChTgQ==/com.synergates.dob.digital_onboarding.js-EbcLJllgqv4-YKz7ykAixA==/base.apk"],nativeLibraryDirectories=[/data/app/~~o2uTxdDT44Su9DZpXChTgQ==/com.synergates.dob.digital_onboarding.js-EbcLJllgqv4-YKz7ykAixA==/lib/arm64, /data/app/~~o2uTxdDT44Su9DZpXChTgQ==/com.synergates.dob.digital_onboarding.js-EbcLJllgqv4-YKz7ykAixA==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] E/AndroidRuntime(14020): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259) E/AndroidRuntime(14020): at java.lang.ClassLoader.loadClass(ClassLoader.java:379) E/AndroidRuntime(14020): at java.lang.ClassLoader.loadClass(ClassLoader.java:312) E/AndroidRuntime(14020): ... 14 more I/Process (14020): Sending signal. PID: 14020 SIG: 9 Lost connection to device.
测试代码
Future<void> _captureImage() async { _cameraController?.setFocusMode(FocusMode.auto); capturedImage = await _cameraController!.takePicture(); log('capturing'); if (capturedImage != null) { final ImageLabeler imageLabeler = GoogleVision.instance.imageLabeler(const ImageLabelerOptions()); final GoogleVisionImage visionImage = GoogleVisionImage.fromFile(File(capturedImage!.path)); final List<ImageLabel> labels = await imageLabeler.processImage(visionImage); if (labels.isEmpty) { log('label not found'); _captureImage(); } else { log('label found'); for (var value in labels) { log('labels $value'); } } } }
也尝试过用GoogleMlVision.fromBytes处理图像流,依然崩溃。
解决方法
修复ML Kit依赖版本冲突
错误源于插件依赖的ML Kit内部类缺失,可在android/app/build.gradle中强制指定兼容的ML Kit版本,确保和插件依赖匹配:dependencies { implementation 'com.google.mlkit:image-labeling:17.0.7' implementation 'com.google.mlkit:vision-common:17.3.0' }版本号可查看插件的
android/build.gradle文件确认。启用MultiDex
应用方法数超限可能导致类打包异常,在android/app/build.gradle中配置:android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'androidx.multidex:multidex:2.0.1' }若自定义了Application类,需继承
MultiDexApplication,或在onCreate方法中调用MultiDex.install(this)。替换为官方ML Kit插件
google_ml_vision插件长期未更新(最新版本停留在2021年),建议替换为Flutter官方维护的插件:- 移除旧插件,在
pubspec.yaml中添加:dependencies: google_mlkit_hand_detection: ^0.10.0 - 按新插件文档修改代码,官方插件适配最新ML Kit和Flutter版本,稳定性更强。
- 移除旧插件,在
彻底清理重建
执行以下命令完成深度清理:flutter clean rm -rf android/.gradle rm -rf ~/.gradle/caches flutter pub get flutter run --clean
内容的提问来源于stack exchange,提问作者Areeba Jawed
相关产品推荐
相关产品推荐

