Опыт разработки приложений под Android

Знакомство с Android

Мой опыт разработки под Android начался на втором курсе университета, да и вообще какой-либо опыт разработки в коммерческих целях. На моём втором курсе обучений, знакомый со старшего курса предложил написать систему автоматизации для кальян-бара. Задача была поставлена таким образом, что нужно было избавиться от бумажных записок, в которые официантки пишут заказы, а также было необходимо чтобы велась какая-то статистика заказов. Моему одногруппнику Кудояру В.И. понравилась идея попробовать поучавствовать в какой-то коммерческой разработке для увеличения опыта. Этот проект и стал первым профессиональной деятельности.

На тот момент, все знания ограничивались абстрактными примерами алгоритмов из университета. Перед тем как приступить к разработке, мы долго пытались понять с чего нужно начинать и как всё правильно сделать. Так как project-manager отсутвовал в нашей команде, то соответственно технического задания у нас не было. Своими усилиями мы в грубой форме сформулировали ряд требований, которых необходимо было придерживаться в проекте. Далее стоял вопрос выбора платформы на чем это нужно писать. Серверную часть было решено писать на QT, на языке C++. Такой выбор был обоснован тем, что опыт в этой области был значительно больше чем в других. Для клиента был выбран Android SDK и язык Java, о кроссплатформенной разработке и речи не шло.

Разработка серверной части двигалась быстро, а вот клиентская часть очень медленно продвигалась. Это обосновано тем, что это был первый проект под Android и на тот момент порог вхождения в разработку под Android был достаточно большой. Не очень понятная IDE, недостаточное количество документации, малое колчество вопросов и ответов на различных форумах - всё это, как оказалось, очень важнные параметры для скорости и качества разработки(На данный момент все эти недостатки устранены). Разобравшись с азами разработки под Android, с IDE Android Studio, я понял чем я хочу дальше заниматься. Параллельно с изучением Android, мне посчастливилось разобраться с текстовым редактором VIM, которым пользуюсь до сих пор. Это уникальное средство для удобного и быстрого написания кода, с большим количеством биндов, с возможностью писать собственные макросы, доступ в консольную строку прямо из редактора. Всё не перечислить, это нужно пробовать.

pic1

Рисунок 1 — Проверка безопрасности в приложениях Android
(анимация: 84 кадров, циклов повторения — замкнутый , размер 196 Кб)

На втором курсе университета актуальной версией Android была 5.0. Большой трудностью для разработчиков является то, что в процессе разработки Android выпускает новые версии. Сначала может показаться, что никаких проблем тут нет, да и что вообще может быть плохого, если все вокруг пишут о том, что вышла на новая, улучшенная версия, с большим количеством исправлений. Однако для разработчика это в первую очередь - ряд трудностей и новых проблем. Дело в том, что Google при обновлении системы постоянно пытается увеличить количество часов автономной работы без зарядки(ведь для мобильных устройств это один из самых важных аспектов), а также устраняет проблемы безопасности. Всё это достигается путём введения различных ограничений. Так с первой проблемой, которой столкнулся - это то, что если экран смартфона выключен, то в некоторый момент приложение уйдет в спящий режим вместе с системой и перестанет выполнять какие-либо действия. В проекте необходимо было держать постоянное соединение с сервером по сокету, для получения мгновенных уведомлений от бара к официантам. Получилось так, что в какой-то момент времени система Android убивает процесс приложений. Для версий Android < 5.0 эта проблема решалась использованием WakeLock – это компонент, с помощью которой можно сказать системе, чтобы при использовании приложения система не уходила в спящий режим. Этим пользовались разработчики вирусов, чтобы выполнять вредоносные действия и в связи с этим эту возможность убрали. Взамен этому можно использовать Foreground Service для постоянного соединения. Foreground Service - это компонент, который возможно настроить так, чтобы он был приоритетным и не выключался автоматически системой. Может появится вопрос: зачем нужно было запретить одно и разрешить другое? Это было сделано с целью того, что WakeLock можно использовать без сервиса и если злоумышленник будет его использовать, то пользователь может этого не заметить. А в случае с Foreground Service невозможно скрыть непрерывную активность приложения, так как активность сервиса всегда показана в шторке системы.

Данный проект закончился неудачей, так как были проблемы с заказчиком. Однако это был отличный старт в мире разработки в целом, а также большой опыт в разработке клиент-серверных приложений и разработке под Android.

Выбор Android в качестве основного вида деятельности

В рамках летней практики на третьем курсе я продолжил освоение Android на предприятии. Так как небольшой опыт в этой области уже имелся, мне довелось разбираться с первым большим проектом Landlord. Для понимания работы приложения необходимо было читать и разбираться с огромным количеством кода. В этот момент пришло понимание того, что помимо умения что-то запрограмиировать необходимо также уметь писать понятный и читабельный код, чтобы можно было привлекать сторонних разработчиков в проект.

После прочтения множества статей я смог выделить несколько основных паттернов проектирования для Android: Model–View–View–Model(MVVM), Model View Presenter(MVP), Model View Controler(MVC) и Clean Architecture. Изначально может показаться, что использование этих паттернов сразу упростит жизнь, но на деле, в начале разработки это всё значительно усложняет, тем более когда не использовал их раньше. Написав несоклько тестовых проектов и использованием различных паттернов, был сделан вывод, что наиболее простой для использования – это MVP. Однако такое усложнение архитектуры оправдано только для больших и долгосрочных проектов.

В данном проекте также возникли трудности с безопасностью в Android. Приложение должно было запускаться при включении устройства. Может показаться, что проблем быть не должно, можно же просто ипользовать BroadcastReceiver с intent-filter BOOT_COMPLETED. Однако после тестирования данного способа можно обнаружить, что данный способ работает не на всех устройствах. После чтения документации и поиска на форумах ничего найдено не было и остался только один вариант – это проверить работоспособность всех остальных фильтров в ручном режиме. Для ускорения процесса было принято решение установить все intent-filter для BroadcastReceiver, убирать по половине из списка после каждой перезагрузки. Таким путём можно большинство фильтров сразу отсеять. В итоге были найдены 4-е интент фильтра, которые необходимо установить, чтобы BroadcastReceiver отработал при старте системы. Это научило тому, что в документации не всегда указано всё и не всегда это правда.

В данный момент я продолжаю изучать Android и набираюсь практики в американской компании Therussianmob, учавствуя во множесте проектов(AngelBrinks, Filmitinc) различных областей.