Перейти к содержанию
Fire Monkey от А до Я
  • 0

Частые сбои приложения при попытке запуска, Android.


Alex7wrt

Вопрос

Несколько приложений, созданных в Delphi XE 7, не всегда корректно запускаются. Иногда запускаются нормально и работают очень долго, пока не зкароешь, а иногда не запускаются. Появляется заставка и на этом все заканчивается. Не могу понять в чем причина и в какую сторону копать. Приложения разные, но в обоих есть загрузка ресурсов. Но ресурсы не тянут на много. Максимум - до 10 МБ, причем в этом приложении процент неудачных загрузок намного меньше. Проверено на 2-х Android устройствах (сматрфоне и планшете).

Прошу подсказать, в какую сторону смотреть. Может быть, как-то контролировать процесс запуска или еще что-то.

Заранее спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Попробуйте поймать момент в дебаг режиме студии, а ещё лучше сразу через SDK монитор (лежит примерно тут: C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk\tools), файл monitor.bat. Ставите фильтр на своё приложение и пробуете поймать этот момент.

Ссылка на комментарий
  • 0

Могу добавить - приложение практически 100% виснет, если сразу после запуска, т.е. после появления логотипа программы переключиться на другую программу или на рабочий стол, т.е сделать программу неактивной. После этого не приходит OnShow событие главной формы и всё... программа висит. Если на нее переключиться - черный экран уже без логотипа. OnCreate всех Auto-Create-форм срабатывают.

Ссылка на комментарий
  • 0

У вас, совершенно случайно, не висит никакой костыль на OnClose? Из всех найденных вариантов закрытия приложения, помог только способ ruslan, все остальное вело себя, примерно по вашему описанию. XE7(c++).

Ссылка на комментарий
  • 0

лучше без фильтра )

глянь http://fire-monkey.ru/topic/1046-reshenie-segmentation-fault11-ili-axe-beats-in-the-balls

авось поможет )

Попробовал с процедурой KillMe из этого модуля в FormClose. Результат - мне не помогло. Может этот способ помогает с закрытием приложений, но мои проблеммы,связанные с запуском, остались.

Я тут обнаружил, что одно приложение занимает около 70МБ RAM. На смартфоне с 512 МБ RAM виснет при запуске ощутимо чаще, чем на планшете с 1024 МБ. (интересно, что было бы на девайсе с 256 МБ...). То есть возникла логическая цепочка по поводу слишком большых требований к RAM. Но изменение настроек LargeHeap в VersionInfo на True не помогает,(хотя и не хочется трогать этот параметр). Поэтому все так же теряюсь в догадках по поводу причины сбоев. Но простейшие приложения всегда запускаются без проблем.

 

В этой связи, если все же догадки по поводу памяти верны, возникает такой вопрос:

В приложении используются PNG изображения в качестве ресурсов. Сами по себе файлы, в которых всего несколько цветов, весят очень мало. Но, насколько я понимаю, при загрузке в tbitmap на каждый пиксель выделяется 4 байта (3 на цвета и 1 на прозрачность), то есть в памяти это изображение png хранится как полноцветный bmp с альфа-каналом? Если так, то на изображения уходит очень много памяти.

Поэтому вот собственно и вопрос: есть ли способ хранить в RAM исходный png, а не BMP? Хотя, как я понимаю, изображение, закодированное таким образом, нельзя редактировать. Но неужели во всех приложениях с графикой в памяти все изображения хранятся как битмапы? Прошу тех, кто владеет темой, объяснить сей момент. 

Ссылка на комментарий
  • 0

Загружая картинку в TBitmap она хранится там именно как PMB и занимают {censored} сколько места. Сам не понимал почему у меня приложение на IOS без конца вылетало, потом глянул сколько памяти уходит при загрузке изображений и {censored}. Много гуглил, но так и не нашел нормального решения этого вопроса. Приходится хранить в памяти только те картинки которые реально нужны здесь и сейчас.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Загружая картинку в TBitmap она хранится там именно как PMB и занимают {censored} сколько места. Сам не понимал почему у меня приложение на IOS без конца вылетало, потом глянул сколько памяти уходит при загрузке изображений и {censored}.

Правильно я понимаю, что после оптимизации приложение вылетать перестало? 

 

Приходится хранить в памяти только те картинки которые реально нужны здесь и сейчас.

Логичный и хороший совет. Спасибо. Правда все-же хотелось бы как-то уменьшить объем занимаемой ими памяти.

Ссылка на комментарий
  • 0

После  оптимизации загрузки ресурсов "по надобности", использование RAM в Windows снизилось с 42 МБ до 12 МБ. При этом в Android с 73 до 60 МБ. По-моему это очень нелогично. Единственное объяснение, которое я нахожу, сводится к тому, что Android при запуске приложения грузит все ресурсы в оперативку, не зависимо от их вызова. А при загрузке ресурса в контейнер выделяет еще память. Приложение, которое весит 13 МБ, после установки занимает около 44 МБ в Android (думаю, PNG файлы ресурсов сразу конверитруются в BMP перед установкой). И почти все эти 44 МБ грузятся в RAM при каждом запуске, а остальное выделяется уже по коду. Кто-нибудь знает, так ли это и если так, то можно ли сделать, чтобы RAM под ресурсы выделялась только при их загрузке в самом коде? Может какая настройка в Delphi XE, отвечающая за ресурсы? Я такой не увидел.

Ссылка на комментарий
  • 0

Картинки png. Через deploy используются двумя способами: 

 

1.  image.Bitmap.LoadFromFile('some.png'); - 2 штуки
 

2.  it:=listview1.Items.Add;

     ..................................
     it.bitmap.LoadFromFile('some.png');   - 160 штук для списка в listview.
 
Раньше делал через it.bitmapref:=png, что по-моему тоже самое. Просто тут массив картинок, на которые ссылаются битмапы item-ов в listview. А так как написано в пункте 2 - без массива, но у каждого итема свой собственный битмап.

Еще есть 4 картинки, но они погоду не строят.
 

Значит вы их загружаете в память сами.

 

 

Да, я загружаю в контейнеры listview (пункт 2) и в два timage (пункт 1). Картинки размером около 220 на 150 пикселей.

Что в итоге дает 220*150*(160+2)*4 = 20 МБ.

 

Если пункт 2 заменить на 

        it:=listview1.Items.Add;

        ...................................

        b:=tbitmap.Create; b.LoadFromFile('some.png');
        it.Bitmap:=b.CreateThumbnail(80,56);

то экономится около 20 МБ памяти.

 

При этом, приложение занимает 70 МБ, корме картинок больше ничего ресурсоемкого нет.

По моим оценкам, оно должно занимать не более 20-30 МБ памяти .

Ссылка на комментарий
  • 0

Ну естественно они все в памяти висят. Ты создаешь считай объекты типа TBitmap методом LoadFromFile выделяешь память под размеры этой картинки. И пока этот битмап не уничтожен(а пока твой список существует, все битмапы живут), выделенная память под него будет занята. Этот момент уже не единожды обсуждался. Лично мое решение это при скроле листвью тебе нужно определять какие итемы сейчас находятся в области видимости и только для них держать картинки в памяти, т.е. ты должен при скроле динамически подгружать/выгружать картинки.  Если размеры картинок небольшие, то думаю что проблем возникнуть не должно. Так же, если у тебя там картинки больших размеров чем реальные битмапы, то лучше используй не LoadFromFile, а LoadThumbnailFromFile.

Ссылка на комментарий
  • 0

при скроле листвью тебе нужно определять какие итемы сейчас находятся в области видимости и только для них держать картинки в памяти, т.е. ты должен при скроле динамически подгружать/выгружать картинки.  Если размеры картинок небольшие, то думаю что проблем возникнуть не должно. 

Думал про это, но есть сомнения по поводу плавности прокрутки.

 

Так же, если у тебя там картинки больших размеров чем реальные битмапы, то лучше используй не LoadFromFile, а LoadThumbnailFromFile.

Спасибо за совет!

 

От 70мб занятой RAM приложение не будет вылетать. Проблема не в этом.

Мб утечки? На пустом приложении с листвью тоже самое?

У меня не вылетает, а не всегда запускается. 

Ссылка на комментарий
  • 0

Создаешь TStringList, сделал дело, добавил строку с сообщением что сделал, записал в файл, сделал еще 1 действие записал в файл TStringList.SaveToFile. Потом когда приложение завалится смотри на чем остановилось последний раз.

Ссылка на комментарий
  • 0

или попробовать запустить в режиме отладке на самом устройстве тогда должен отловить ошибку. 

 

но как я заметил, приложения написанные на огнеобезьяне сами по себе имеют такой прикол - периодически вылетают как при запуске так и во время работы ничего не сообщая при этом. был прикол. перенес исходники программы с одного компа на другой. компилирую. все нормально ошибок нет. запускаю - вылет. запускаю - вылет. собираю на старой машине - все работает. сделал полную пересборку - вылетает при запуске. снес dproj и восстановил от старого но рабочего варианта на этой машине - запустилась программа. при этом при старом dproj при сборке ругалось на ненайденные ресурсы но работало, в новом все было найдено, ни одной ошибки и вываливалась программа при запуске. 

 

думаю в обновлениях студии фраза - улучшена стабильность, никогда не исчезнет :)

Ссылка на комментарий
  • 0

Под IOS такого нет. Просто так приложение никогда не вываливается. Все вылеты всегда связаны с ошибками пограммиста. Каждый раз когда натыкаюсь на вылет или что-то подобное, после разбора полетов становится понятно, что это не какое-то мистическое поведение, а банальные ошибки или не знание каких-то нюансов.

Ссылка на комментарий
  • 0

скорее всего потому что под огрызком пашет в нативной среде а под андроидом используется как внешняя библиотека запущенная из под далвика и когда возникает ошибка не происходит ее отлов из под джавы.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...