jenly1314 / MLKit

🌝 MLKit是一个强大易用的工具包。通过ML Kit您可以很轻松的实现文字识别、条码识别、图像标记、人脸检测、对象检测等功能。
Apache License 2.0
869 stars 156 forks source link

继承BarcodeCameraScanActivity扫描二维码OOM闪退 #39

Closed ITAnt closed 11 months ago

ITAnt commented 11 months ago

①机型 诺基亚 8, LG V10, Nubia Z50 Ultra, HTC one 11,Google Pixel 3都有复现

②二维码内容 TVRpeExqUXdMakUyT0M0eE56VitNVEZpTW1SaFpUTXdOMlptTm1FM09YNHlOaXczTml3MU9Dd3RPVElzTFRFd05DdzNPQ3cxT1N3ME5Td3RNaklzTFRFd0xESXdMRE0zTEMwMU5Dd3RNVEkwTEMwMk1pd3RPRGNzTFRneUxEZ3lMQzAwTlN3ek9DdzNNeXd0TWprc055d3RNVEkwTEMweE1UQXNMVGc0TERjd0xDMHhMQzAyTml3M055dzRPQ3d4TWpWK05qZzVPWDQwTWpRMWZqWTRPVGgrTkRJME5BPT0=

③崩溃日志 E FATAL EXCEPTION: main Process: com.itant.rt, PID: 21419 java.lang.OutOfMemoryError: Failed to allocate a 3110416 byte allocation with 2242968 free bytes and 2MB until OOM, max allowed footprint 268435456, growth limit 268435456 at com.king.mlkit.vision.camera.util.BitmapUtils.getBitmap(BitmapUtils.java:43) at com.king.mlkit.vision.common.analyze.CommonAnalyzer.lambda$analyze$0(CommonAnalyzer.java:74) at com.king.mlkit.vision.common.analyze.CommonAnalyzer.$r8$lambda$YzrPtrvPc7n-tKhE0ChAq3N2oAE(CommonAnalyzer.java:0) at com.king.mlkit.vision.common.analyze.CommonAnalyzer$$ExternalSyntheticLambda0.onSuccess(R8$$SyntheticClass:0) at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.2:1) at android.os.Handler.handleCallback(Handler.java:874) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:198) at android.app.ActivityThread.main(ActivityThread.java:6729) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876) E Java Crash Happen cause by main(2)

④现象 由于二维码内容较多,识别耗时相对较长,偶现OOM闪退,Profiler观察到扫描二维码时内存有飙升,不扫描时app占用100MB内存左右,扫描时内存占用迅速上升,如果长时间没扫描出结果,到占用300多MB内存的时候,会抛出OOM闪退。部分机型复现概率稍低,多次重复扫描成功后,重新打开扫描Activity扫描这个操作,也容易复现。

jenly1314 commented 11 months ago

①机型 诺基亚 8, LG V10, Nubia Z50 Ultra, HTC one 11,Google Pixel 3都有复现

②二维码内容 TVRpeExqUXdMakUyT0M0eE56VitNVEZpTW1SaFpUTXdOMlptTm1FM09YNHlOaXczTml3MU9Dd3RPVElzTFRFd05DdzNPQ3cxT1N3ME5Td3RNaklzTFRFd0xESXdMRE0zTEMwMU5Dd3RNVEkwTEMwMk1pd3RPRGNzTFRneUxEZ3lMQzAwTlN3ek9DdzNNeXd0TWprc055d3RNVEkwTEMweE1UQXNMVGc0TERjd0xDMHhMQzAyTml3M055dzRPQ3d4TWpWK05qZzVPWDQwTWpRMWZqWTRPVGgrTkRJME5BPT0=

③崩溃日志 E FATAL EXCEPTION: main Process: com.itant.rt, PID: 21419 java.lang.OutOfMemoryError: Failed to allocate a 3110416 byte allocation with 2242968 free bytes and 2MB until OOM, max allowed footprint 268435456, growth limit 268435456 at com.king.mlkit.vision.camera.util.BitmapUtils.getBitmap(BitmapUtils.java:43) at com.king.mlkit.vision.common.analyze.CommonAnalyzer.lambda$analyze$0(CommonAnalyzer.java:74) at com.king.mlkit.vision.common.analyze.CommonAnalyzer.$r8$lambda$YzrPtrvPc7n-tKhE0ChAq3N2oAE(CommonAnalyzer.java:0) at com.king.mlkit.vision.common.analyze.CommonAnalyzer$$ExternalSyntheticLambda0.onSuccess(R8$$SyntheticClass:0) at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.2:1) at android.os.Handler.handleCallback(Handler.java:874) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:198) at android.app.ActivityThread.main(ActivityThread.java:6729) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876) E Java Crash Happen cause by main(2)

④现象 由于二维码内容较多,识别耗时相对较长,偶现OOM闪退,Profiler观察到扫描二维码时内存有飙升,不扫描时app占用100MB内存左右,扫描时内存占用迅速上升,如果长时间没扫描出结果,到占用300多MB内存的时候,会抛出OOM闪退。部分机型复现概率稍低,多次重复扫描成功后,重新打开扫描Activity扫描这个操作,也容易复现。

出现这种OOM的情况一般有如下两种解决方案:

  1. 可以在清单文件Manifest的application中添加如下配置:
    android:largeHeap="true"
  2. 根据需求场景,可以适当的调整下分析图像的质量;即:CameraConfig 相关配置。