Posted by Olegas
on Январь 23, 2012
IT /
2 Comments
На Stackoverflow часто встречаются вопросы по выполнению на Android фоновых задач, в т.ч. и повторяющихся с заданным промежутком времени. Как правило, первое, что используется, это Service.
Такой подход в некоторых случаях может привести к тормозам и низкой скорости ответа пользовательского интерфейса. Расскажу когда так бывает и как с этим бороться…
Continue reading…
Tags: Android, Java
Posted by Olegas
on Сентябрь 27, 2011
IT /
1 Comment
Поскольку я являюсь разработчиком Android-приложения, то слежу за появлением новых ссылок на него с помощью подписок Google. Сегодня утром я с радостью обнаружил в ящике письмо, в котором присутствовала новая ссылка на мое приложение. Все отлично! И отзыв положительный, и количество загрузок отличное от 0 вот только версия почему-то старая и… размер APK целых 3 мегабайта против оригинальных ~200К
После загрузки и распаковки APK (вспоминаем что APK это просто ZIP-архив) в нем обнаружилась «набивка» из 153 PNG файлов (переименованных зачем-то в .temp) со свидетелем из Фрязино и собственно «приложение»…
Как и следовало ожидать, от оригинального приложения там ничего не осталось. Ни иконки, ни, тем более, кода. А при дальнейшем рассмотрении (похоже что) ВСЕ файлы на androides-os.com – одна и та же программа! Я скачал несколько разных программ из разных разделов и все они были одного размера и с одинаковым содержимым!
Внутри оказалось нечто, которое по беглому анализу ресурсов оказалось приложением, запрашивающим активацию путем отправки SMS. Попробуем разобраться, куда и что отправляется…
Continue reading…
Tags: Android, Java
Posted by Olegas
on Июль 11, 2011
IT /
No Comments
При разработке приложения неизбежно приходится сталкиваться с ошибками в коде и/или окружении. И очень печально когда подобные ошибки встречаются не на тестовом телефоне/эмуляторе а у живых пользователей. Еще печальнее если это не ваш друг бета-тестер и толком никто не может объяснить что и где свалилось.
Обычно при внезапном падении приложения Android предлагает отправить отчет об ошибке, где будет и подробный стэк-трейс и информация о версии вашего приложения. К сожалению пользователи не всегда нажимают кнопку «отправить отчет» а для дебаг-приложений или приложений не из маркета такая функциональность и вовсе недоступна.
Что же делать? На помощь приедет возможность языка Java обрабатывать исключения (Exceptions), в том числе и непойманные (unhandled).
Continue reading…
Tags: Android, Java
Posted by Olegas
on Май 04, 2011
IT /
No Comments
Обнаружили с коллегой занятный баг в Android, связанный с работой TabHost.
Суть в следующем. Если после onCreate в вашей TabActivity внутри TabHost не будет создано ни одной корректной вкладки все хозяйство с треском осыпается. Причем стэк очень интересный. По нему сложно выявить причину ибо в нем нет ничего, кроме кода ядра ОС.
Выглядит примерно так
Exception: java.lang.NullPointerException
Message: null
Stacktrace:
android.widget.TabWidget.dispatchDraw(TabWidget.java:241)
android.view.ViewGroup.drawChild(ViewGroup.java:1565)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1294)
android.view.ViewGroup.drawChild(ViewGroup.java:1565)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1294)
android.view.ViewGroup.drawChild(ViewGroup.java:1565)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1294)
android.view.View.draw(View.java:6588)
android.widget.FrameLayout.draw(FrameLayout.java:383)
android.view.ViewGroup.drawChild(ViewGroup.java:1567)
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1294)
android.view.View.draw(View.java:6588)
android.widget.FrameLayout.draw(FrameLayout.java:383)
com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1869)
android.view.ViewRoot.draw(ViewRoot.java:1384)
android.view.ViewRoot.performTraversals(ViewRoot.java:1149)
android.view.ViewRoot.handleMessage(ViewRoot.java:1668)
android.os.Handler.dispatchMessage(Handler.java:130)
android.os.Looper.loop(Looper.java:154)
android.app.ActivityThread.main(ActivityThread.java:4416)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:552)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:910)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668)
dalvik.system.NativeStart.main(Native Method)
Лечится, очевидно, корректной подготовкой табов в onCreate. Что интересно, в 2.2 такого бага уже нет.
Tags: Android, Java