При запуске приложения Android оно вылетает
Когда я компилирую и запускаю приложение на достаточно мощном смартфоне, то всё работает прекрасно, но как только я пробую запустить его на эмуляторе или на старом смартфоне, то оно просто вылетает, так и не запустившись. Ошибка в логах:
java.lang.RuntimeException: Canvas: trying to draw too large(850888900bytes) bitmap.
at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229)
at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:97)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:529)
at android.widget.ImageView.onDraw(ImageView.java:1367)
at android.view.View.draw(View.java:19192)
at android.view.View.updateDisplayListIfDirty(View.java:18142)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.draw(View.java:19195)
at android.view.View.updateDisplayListIfDirty(View.java:18142)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.updateDisplayListIfDirty(View.java:18133)
at android.view.View.draw(View.java:18920)
at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
at android.view.View.draw(View.java:19195)
at com.android.internal.policy.DecorView.draw(DecorView.java:788)
at android.view.View.updateDisplayListIfDirty(View.java:18142)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:669)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:675)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:783)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2992)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2806)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2359)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Я понял, что проблема в том, что приложение не запускается из-за попытки нарисовать слишком большое изображение. Но что за изображение? В приложении их полно. Как найти это изображение и уменьшить его?
BitmapDrawable:
final boolean clearColorFilter;
if (mBlendModeFilter != null && paint.getColorFilter() == null) {
paint.setColorFilter(mBlendModeFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
}
ImageView:
public void drawableHotspotChanged(float x, float y) {
super.drawableHotspotChanged(x, y);
if (mDrawable != null) {
mDrawable.setHotspot(x, y);
}
}
Ответы (1 шт):
Ваша ошибка если прям ее брать:
Canvas: trying to draw too large(850888900bytes) bitmap
Переводим все на человеческий язык: Приложение упало при попытке отрисовать очень большую картинку (850888900 байт). Если я ничего не путаю то ваша картинка как-бы довольно тяжелая:
Итак у вас картинка на 1гб почти, а это много, очень много если быть точным. Вы это пытаетесь показать в ImageView судя по логу. Причина проблемы ( как мне кажется):
Запуская приложение и пытаясь отобразить гиговую картинку, вы загружаете ОЗУ устройства, ОС как довольно жизнелюбивый алгоритм принимает решение грохнуть приложение но не помереть самой. В итоге происходит краш.
Насколько я знаю Samsung S20 довольно свежее устройство с неплохим объемом ОЗУ (8 гб) которое потянет вашу картинку. Конечно можно юзать приложение только на крутых и мощных устройствах но это будет немного странно по меньшей мере. Вам нужно пересмотреть алгоритмы которые приводят к данной ошибке и провести их оптимизацию. В вашем случае приложение падает на этих строках (могу ошибаться):
DisplayListCanvas.java:229
RecordingCanvas.java:97
В ваших кусках кода я не понял какой это класс и что за строки. Но по простому если сказать - ваши устройства не тянут ту графику которую вы пытаетесь реализовать. Вот есть подобные вопросы, может помогут с решением: 1, 2, 3 и 4. Так же советую посмотреть в сторону уменьшения размера картинки. Я не знаю что это за картинка ( я не супер силен в графике) но могу допустить что у нее будет просто супер разрешение. Попробуйте "ухудшить" разрешение картинки.
