-
Notifications
You must be signed in to change notification settings - Fork 27.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[camera][iOS] using startImageStream() can lead to memory crash on iOS #97941
Comments
Hi @renanyoy, thanks for filing the issue. Please provide a complete minimal reproducible code sample and the full Also, what version of Thank you |
the log and the sample are in the first post we are using the latest camera addon 0.9.4 10. |
Neither of the info you provided in the initial post is complete, which is why I asked for a Also, the steps to reproduce aren't quite clear to me. Does the app crash on startup or does it crash after a certain period of time? Also, what device did you experience the crash with?
If this PR should fix the issue, then this issue should probably be dedup'd with #44436 |
it crash at startImageStream(..) made a mistake I don't think this PR will fix it finally.. I'll try to make a sample project |
the full code import 'dart:developer' as dev;
import 'dart:math';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Home(),
);
}
}
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
late CameraController controller;
bool initialized = false;
@override
void initState() {
super.initState();
init();
}
Future<CameraController> initCamera(CameraDescription camera) async {
final controller = CameraController(camera, ResolutionPreset.max,
enableAudio: false, imageFormatGroup: ImageFormatGroup.yuv420);
await controller.initialize();
controller.lockCaptureOrientation(DeviceOrientation.portraitUp);
return controller;
}
Future<void> init() async {
final cameras = await availableCameras();
controller = await initCamera(cameras.first);
initialized = true;
setState(() {});
controller.startImageStream((image) {
dev.log('frame');
});
(() async {
// OCR cpu usage simulation
while (true) {
await Future.delayed(const Duration(seconds: 2));
double z = 0;
for (int i = 0; i < 100000000; i ) {
z = cos(z);
}
}
})();
}
@override
Widget build(BuildContext context) {
return initialized ? CameraPreview(controller) : Container();
}
}
|
Hi @renanyoy, can you also provide the full |
it crash in debug and release https://pub.waves.pw/ms/crash.log.txt |
Hi @renanyoy, what device were you testing with? |
iPhone XR |
I can reproduce the memory crash in Tested on iPhone XS. Steps to reproduce
code sampleimport 'dart:developer' as dev;
import 'dart:math';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Home(),
);
}
}
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
late CameraController controller;
bool initialized = false;
@override
void initState() {
super.initState();
init();
}
Future<CameraController> initCamera(CameraDescription camera) async {
final controller = CameraController(camera, ResolutionPreset.max,
enableAudio: false, imageFormatGroup: ImageFormatGroup.yuv420);
await controller.initialize();
controller.lockCaptureOrientation(DeviceOrientation.portraitUp);
return controller;
}
Future<void> init() async {
final cameras = await availableCameras();
controller = await initCamera(cameras.first);
initialized = true;
setState(() {});
controller.startImageStream((image) {
dev.log('frame');
});
(() async {
// OCR cpu usage simulation
while (true) {
await Future.delayed(const Duration(seconds: 2));
double z = 0;
for (int i = 0; i < 100000000; i ) {
z = cos(z);
}
}
})();
}
@override
Widget build(BuildContext context) {
return initialized ? CameraPreview(controller) : Container();
}
}
crash logflutter doctor -v[✓] Flutter (Channel stable, 2.10.1, on macOS 12.2 21D49 darwin-arm, locale en-GB)
• Flutter version 2.10.1 at /Users/nexus/dev/sdks/flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision db747aa133 (2 days ago), 2022-02-09 13:57:35 -0600
• Engine revision ab46186b24
• Dart version 2.16.1
• DevTools version 2.9.2
[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
• Android SDK at /Users/nexus/Library/Android/sdk
• Platform android-31, build-tools 31.0.0
• Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 11.0.10 0-b96-7249189)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• CocoaPods version 1.11.2
[✓] Chrome - develop for the web
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Android Studio (version 2020.3)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build 11.0.10 0-b96-7249189)
[☠] IntelliJ IDEA Community Edition (the doctor check crashed)
✗ Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues.
✗ FormatException: Unexpected extension byte (at offset 5)
• #0 _Utf8Decoder.convertSingle (dart:convert-patch/convert_patch.dart:1789:7)
#1 Utf8Decoder.convert (dart:convert/utf.dart:351:42)
#2 InputStream.readString (package:archive/src/util/input_stream.dart:207:30)
#3 new ZipDirectory.read (package:archive/src/zip/zip_directory.dart:40:30)
#4 ZipDecoder.decodeBuffer (package:archive/src/zip_decoder.dart:19:30)
#5 ZipDecoder.decodeBytes (package:archive/src/zip_decoder.dart:14:12)
#6 IntelliJPlugins._findPluginXml (package:flutter_tools/src/intellij/intellij.dart:130:44)
#7 IntelliJPlugins._readPackageVersion (package:flutter_tools/src/intellij/intellij.dart:141:40)
#8 IntelliJPlugins.validatePackage (package:flutter_tools/src/intellij/intellij.dart:63:35)
#9 IntelliJValidator.validate (package:flutter_tools/src/intellij/intellij_validator.dart:103:15)
#10 asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:111:32)
#11 asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:109:18)
#12 _rootRun (dart:async/zone.dart:1426:13)
#13 _CustomZone.run (dart:async/zone.dart:1328:19)
#14 _runZoned (dart:async/zone.dart:1861:10)
#15 runZonedGuarded (dart:async/zone.dart:1849:12)
#16 runZoned (dart:async/zone.dart:1780:12)
#17 asyncGuard (package:flutter_tools/src/base/async_guard.dart:109:3)
#18 Doctor.startValidatorTasks (package:flutter_tools/src/doctor.dart:205:9)
#19 Doctor.diagnose (package:flutter_tools/src/doctor.dart:309:47)
#20 DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:50:48)
#21 FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:1320:12)
<asynchronous suspension>
#22 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1161:27)
<asynchronous suspension>
#23 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
<asynchronous suspension>
#24 CommandRunner.runCommand (package:args/command_runner.dart:209:13)
<asynchronous suspension>
#25 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:281:9)
<asynchronous suspension>
#26 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
<asynchronous suspension>
#27 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:229:5)
<asynchronous suspension>
#28 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9)
<asynchronous suspension>
#29 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
<asynchronous suspension>
#30 main (package:flutter_tools/executable.dart:94:3)
<asynchronous suspension>
[✓] VS Code (version 1.64.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.34.0
[✓] Connected device (2 available)
• macOS (desktop) • macos • darwin-arm64 • macOS 12.2 21D49 darwin-arm
• Chrome (web) • chrome • web-javascript • Google Chrome 98.0.4758.80
[✓] HTTP Host Availability
• All required HTTP hosts are available
! Doctor found issues in 1 category. [✓] Flutter (Channel master, 2.11.0-0.0.pre.509, on macOS 12.2 21D49 darwin-arm, locale en-GB)
• Flutter version 2.11.0-0.0.pre.509 at /Users/nexus/dev/sdks/flutters
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision 6656356bbf (10 hours ago), 2022-02-10 20:30:17 -0800
• Engine revision a57061eda8
• Dart version 2.17.0 (build 2.17.0-87.0.dev)
• DevTools version 2.10.0
[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
• Android SDK at /Users/nexus/Library/Android/sdk
• Platform android-31, build-tools 31.0.0
• Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 11.0.10 0-b96-7249189)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• CocoaPods version 1.11.2
[✓] Chrome - develop for the web
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Android Studio (version 2020.3)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build 11.0.10 0-b96-7249189)
[✓] IntelliJ IDEA Community Edition (version 2021.3)
• IntelliJ at /Applications/IntelliJ IDEA CE.app
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin version 213.5744.122
[✓] VS Code (version 1.64.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.34.0
[✓] Connected device (2 available)
• macOS (desktop) • macos • darwin-arm64 • macOS 12.2 21D49 darwin-arm
• Chrome (web) • chrome • web-javascript • Google Chrome 98.0.4758.80
[✓] HTTP Host Availability
• All required HTTP hosts are available
• No issues found! |
@danagbemava-nc how long did it take for you to crash on your device? I couldn't get it crash on my iPhone 13 mini but can try my old phone. |
I wasn't able to get it crashed on my phone, but i do notice the lagging, which is expected because of the expensive operation in the example:
@renanyoy does it crash for you if you remove this block? |
in the real app, there is a block doing the OCR using google ML kit, in that case it always crashes. you can try
to stress even more your iPhone 13. I tried to do a minimal reproducible sample, it's why this loop. we can't activate the OCR part in our app for our iOS users cause of that crash. without the loop it doesn't crash. I think the problem is that somewhere/sometime, when the flutter thread hang, the camera part is not skipping frames and retains them.. and in real app, consuming already lots of ram.. it crash quickly.. |
maybe it's possible to add a ram usage stress too, to get the crash more often. |
@hellohuanlin It took about 2 minutes. This time around, instead of moving the camera around, I just left the phone by itself. |
Not only IOS, but android experience issues with memory on several samsung and xiaomi phones. I'm intererested why "stopImageStream" actually somehow stops and resets camera. There is also a frequent error: |
the computation is here to reproduce the crash more often, like in a real app, with lots of async things running everywhere in the app, and in our case, also doing OCR same time. If you manage to reproduce the crash without it, just remove it. I think google ML kit runs in another thread/isolate, but copying images between isolates create some UI thread hang too. |
Duplicate of #44436 |
This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of |
Steps to Reproduce
flutter run
on the code sampleCode sample
Logs
The text was updated successfully, but these errors were encountered: