Как исправить ошибку нехватки памяти в робо-тесте Firebase

На моих полудюжинах физических устройств и в эмуляторах приложение не падает, но при тестировании на устройствах Firebase 4/10 тест не прошел с:

java.lang.OutOfMemoryError: не удалось выделить 42465612 байтов с 13253240 свободными байтами и 12 МБ до OOM

FATAL EXCEPTION: main
Process: technocrats.com.gymaholic, PID: 24886
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
at android.content.res.Resources.loadDrawable(Resources.java:2150)
at android.content.res.Resources.getDrawable(Resources.java:715)
at android.support.v7.widget.ResourcesWrapper.getDrawable(ResourcesWrapper.java:130)
at android.support.v7.widget.TintResources.getDrawable(TintResources.java:46)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:465)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:203)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:191)
at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:102)
at android.support.v7.widget.AppCompatImageHelper.loadFromAttributes(AppCompatImageHelper.java:59)
at android.support.v7.widget.AppCompatImageButton.<init>(AppCompatImageButton.java:79)
at android.support.v7.widget.AppCompatImageButton.<init>(AppCompatImageButton.java:69)
at android.support.v7.app.AppCompatViewInflater.createImageButton(AppCompatViewInflater.java:202)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:122)
at android.support.v7.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1266)
at android.support.v7.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1316)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:684)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:469)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at technocrats.com.gymaholic.MainActivity.onCreate(MainActivity.java:57)
at android.app.Activity.performCreate(Activity.java:5275)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2255)
at android.app.ActivityThread.access$800(ActivityThread.java:142)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5118)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
at dalvik.system.NativeStart.main(Native Method)

person DEXTOR_ANTONY    schedule 15.11.2018    source источник
comment
Я загрузил отладочный apk! Это проблема?   -  person DEXTOR_ANTONY    schedule 15.11.2018
comment
Это не похоже на проблему Firebase. Вы загружаете большое растровое изображение/рисунок из ресурсов? Можете ли вы поделиться своим кодом из MainActivity, особенно строкой 57 и методом onCreate (at technocrats.com.gymaholic.MainActivity.onCreate(MainActivity.java:57))?   -  person Grimthorr    schedule 15.11.2018
comment
Я не уверен, в чем проблема, все, что у меня есть в строке 57, это setContentView(R.layout.activity_main); и я использую GIF.@Grimthorr   -  person DEXTOR_ANTONY    schedule 15.11.2018
comment
Насколько большой GIF? Ошибка возникает при загрузке в память большого файла ресурсов (например, для ImageView), поэтому вам потребуется уменьшить размер изображения или уменьшить количество изображений. Кроме того, вы можете включить largeHeap, что может помочь. Тем временем, пожалуйста, отредактируйте свой вопрос, включив в него всю необходимую информацию для создания Минимальный, полный и поддающийся проверке пример, включая ваш код и макет XML, чтобы мы могли сформулировать ответ.   -  person Grimthorr    schedule 15.11.2018
comment
у меня есть два GIF размером 12kb и 800kb, я также понял, что у меня есть фоновое изображение размером 1,6 mb на 10 макетах @Grimthorr   -  person DEXTOR_ANTONY    schedule 15.11.2018
comment
вместо использования bitmapfactory я решил использовать nuget Glide, и это решило все мои проблемы с OOM. Я неправильно управлял памятью... и я не хотел тратить на это время, так как кто-то уже сделал это в этом замечательном nuget.   -  person Christophe Chenel    schedule 15.11.2018
comment
Серьезно, я понятия не имею, о чем вы говорите, извините, вы знаете точную причину, почему это происходит? Могу ли я опубликовать свое приложение, это фатально? @Кристоф Гудлейк   -  person DEXTOR_ANTONY    schedule 15.11.2018
comment
Вы, вероятно, положили в кеш растровые изображения, они слишком большие или что-то в этом роде.   -  person Christophe Chenel    schedule 15.11.2018
comment
На моих полудюжине физических устройств он работает нормально, могу ли я его опубликовать? @КристофГудлейк   -  person DEXTOR_ANTONY    schedule 15.11.2018
comment
ну это ваш выбор. На данный момент это контроль качества, который терпит неудачу. Так что они будут сбои в поле, и вы потеряете свою пользовательскую базу, если он будет постоянно падать. Вы также можете просто управлять своим растровым изображением по-другому, и, вероятно, вообще не будет сбоев. Взгляните на Glide или Picasso, чтобы управлять растровым изображением.github.com/bumptech/glide или square.github.io/picasso   -  person Christophe Chenel    schedule 15.11.2018


Ответы (1)


Как уже упоминал Кристоф в комментариях, это не похоже на проблему с тестовой лабораторией Firebase. На самом деле это говорит вам о том, что вы плохо используете доступные ресурсы устройства.

Сообщение об ошибке предполагает, что ваше приложение пытается выделить изображение размером 40 МБ, что определенно слишком много.

Постарайтесь сделать использование изображений более разумным:

  • Используйте PNG или VectorDrawables, так как они обеспечивают лучшую степень сжатия, чем GIF, при том же качестве.
  • Если вам нужны анимации, попробуйте анимированные векторные рисунки.
  • Используйте другие типы рисунков, такие как ShapeDrawable или NinePatchDrawable, которые особенно полезны. для фонов, которые необходимо масштабировать в зависимости от размеров устройства и плотности экрана.
person Maik    schedule 16.11.2018
comment
У меня есть какое-нибудь быстрое решение, у меня около 70+ изображений в режиме просмотра изображений, 2 GIF, 5 mp3 в папке RAW @maik - person DEXTOR_ANTONY; 16.11.2018
comment
Без дополнительной информации о том, как работает ваше приложение и как оно использует эти изображения, не существует простого быстрого решения. Возможно, попробуйте понять, почему вы получаете эту ошибку, говорящую о том, что она пытается выделить 40 МБ буфера для изображения. Для справки: 32-битное растровое изображение шириной 1024 и высотой 1024 займет 4 МБ. Итак, что вы делаете, что ему нужно в 10 раз больше? - person Maik; 16.11.2018