BC/NW 2012; №2 (21):3.1
ОСОБЕННОСТИ
РАЗРАБОТКИ ПО ДЛЯ ОС ANDROID
Казов Р.П.
В силу развития мобильных устройств часть нагрузки с персональных компьютеров перекладывается на них. Соответственно совершенствуются специализированные ОС и средства разработки приложений для них. В данной работе рассматривается специфика разработки программного обеспечения для ОС Android. Показаны некоторые "подводные камни" и методы их обхода.
На сегодняшний день можно выделить три стремительно развивающиеся операционные системы(OC) для мобильных устройств. Первая это Windows Phone 7 - ОС корпорации Microsoft, которая пока еще не получила широкого распространения. Вторая- это ОС iOS, созданная корпорацией Apple только для своих устройств. Третья система это ОС Android , разработанная корпорацией Google. Она охватывает всевозможные ценовые категории мобильных устройств, начиная от бюджетных телефонов и заканчивая дорогими планшетами. Поэтому речь пойдет именно об Android, как об операционной системе, получившей наибольшее распространение.
Android — портативная ОС, платформа для коммуникаторов, планшетных компьютеров, цифровых проигрывателей, наручных часов, нетбуков и смартбуков, основанная на ядре Linux. Изначально она разрабатывалась компанией Android Inc., которую затем купила Google. Впоследствии Google инициировала создание альянса Open Handset Alliance (OHA), в который входят такие компании как Intel, Texas Instruments, Qualcomm, MIPS, Acer, Asus, Samsung, HTC ,который сейчас и занимается поддержкой и дальнейшим развитием платформы. Android позволяет создавать Java-приложения, управляющие устройством через разработанные Google библиотеки.
Приложения для Android представляют собой программы для виртуальной машины Dalvik. В отличие от большинства виртуальных машин (например, Java Virtual Machine), которые являются стек-ориентированными, Dalvik является регистр-ориентированной, что нельзя назвать стандартным решением. Оно хорошо подходит для работы на процессорах RISC-архитектуры, к которым относятся и процессоры ARM, применяемые в мобильных устройствах. Dalvik проектировалась специально под платформу Android. Виртуальная машина оптимизирована для экономного потребления памяти и работы на мобильном аппаратном обеспечении. Начиная с версии Android 2.2., Dalvik использует JIT (just-in-time) компиляцию. В силу этих особенностей, получилась производительная виртуальная машина, что не может не сказываться на работе приложений в целом. Dalvik использует собственный байт-код. При разработке программ под Android исходный код программы переводится компилятором в специальный машинно-независимый низкоуровневый код. На выходе получается исполняемый файл Android Package (APK).
Программистам, которые разрабатывали программное обеспечение
для настольных компьютеров, сначала
непривычно разрабатывать их под ОС Android. Android API требует, чтобы пользователи являлись
хорошими программистами. Абстракции Android намного более наворочены
(раздуты, переусложнены). Следует учесть
ограничения, вносимые самим принципом работы и вычислительными ресурсами
мобильных устройств: ограниченная производительность процессора, ограниченный
объем оперативной памяти, нет файла подкачки, устройства работают от
аккумулятора, имеющего ограниченный заряд.
Одним из самых важных понятий в Android является то, что приложения могут вызывать части других приложений, если имеют на это право. Для реализации такого подхода пришлось отказаться от классической схемы приложения с одной точкой входа. Говоря другими словами - Android приложение строится таким образом, чтобы каждый отдельный его компонент мог вызываться при необходимости отдельно.
Приложения в Android используют четыре основные типы компонентов: Деятельности, Сервисы, Слушатели сообщений, Поставщики содержимого.
1. Деятельность - это визуальный компонент приложения, который отвечает за интерфейс. Например, список контактов на смартфоне. Этот список является Деятельностью, а если выбрать контакт и вывести дополнительную информацию о нем, откроется другая Деятельность. Т.е. по сути Деятельность - это то, с чем можно взаимодействовать. Приложение может содержать как несколько Деятельностей, так и вовсе не содержать их.
2. Сервисы - это то что выполняется, пока приложение не находится в фокусе. Самый простой пример - проигрыватель музыки. Идет открытие страницы в веб браузере, а в фоне играет музыка. Именно так и работает Сервис. Сервис может запускаться вместе с системой и "висеть" в фоне, выполняя некоторые действия. Взаимодействовать с Сервисом можно посредством интерфейсов.
3. Слушатель сообщений - один из важнейших компонентов приложения. Слушатель сообщений, также как и сервис, не имеет видимого интерфейса. Его задача отслеживать определенные действия или системные сообщения и реагировать на это. Но так как сам по себе Слушатель сообщений сделать ничего не может - он передает сигнал дальше, то ли это будет Деятельность, вызванная по событию, то ли уведомление пользователю, или еще что-то.
4. Поставщик содержимого предоставляет определенные данные другим приложением. Эти данные могут храниться в файловой системе, SQLite базе данных, или еще где-то.
Каждый экран пользовательского интерфейса представляет собой деятельность. Каждая деятельность имеет свой собственный жизненный цикл. Приложение имеет одну или больше деятельностей, плюс процесс Linux, привязанный к нему. Тут кроется одна из особенностей Android. В этой ОС приложение может быть «живым», даже если его процесс был завершен, то есть, жизненный цикл деятельности не привязан к жизненному циклу процесса. В этом одно из отличий Android от других ОС.
В отличии от домашних компьютеров в Android нет понятия "завершить работу приложения". Система держит программу в памяти, пока эта память ей не потребуется для других целей. Метод finish() класса деятельности или stopService() класса сервиса завершает работу компонента (деятельности или сервиса), но не завершает программу. Так, например, если в этих компонентах были запущены фоновые нити, то они продолжают работу.
Для взаимодействия компоненты обмениваются намерениями, и каждая компонента имеет процедуру обработки таких намерений. Обработка всех намерений происходит в одном потоке. Для выполнения долгих задач компонента должна запустить специальный поток, чтобы не блокировать пользовательский интерфейс. Эта или другая компонента должна позаботиться о корректной остановке этого потока при выгрузке компоненты или приложения.
Каждый компонент имеет свой жизненный цикл. Наиболее сложный цикл имеется у деятельности. Нужно корректно обрабатывать все изменения статуса компонента и освобождать или запрашивать вновь нужные ресурсы, а также управлять запущенными нитями.
Компонент, получающий управление при запуске Android - программы, определяется в файле конфигурации заданием специального фильтра для события запуска. Запуск программы рассматривается, как обычная обработка события, сгенерированного системой.
Одно из уникально и мощных качеств Android (чего нет в других ОС) то, что все программы имеют общий уровень. Android не проводит различия между основными системными программами и программами сторонних разработчиков. Все они пользуются равными правами доступа к возможностям мобильного устройства, предоставляя пользователям широкий спектр приложений и услуг. С устройствами, построенными на платформе Android, пользователи будут иметь возможность в полной мере адаптировать например телефон под свои интересы. Они могут поменять домашний экран телефона, стиль звонка, любую из программ и т.п.
До недавнего времени существовало ограничение на размер программы- 50 Мб, но теперь система расширяет данное ограничение до 4 Гб. Несмотря на данное расширение, с целью обеспечения безопасности системы хранения данных на устройстве, размер основного исполняемого APK все равно ограничен 50 Мб. Однако теперь к основному файлу разработчики могут приложить еще два файла, каждый – до 2 Гб. Заметим, что программы для домашних компьютеров в этом смысле ничем не ограничены. Файлы программ могут занимать гигабайты на жестком диске.
Одним из неприятных особенностей ОС Android является то, что для установки приложения размером N мегабайт, нужно от 2N до 4N мегабайт свободного места. Это происходит из-за того, что сначала файл программы загружается на устройство и займет там N мегабайт места, потом он будет распакован для проверки — еще от N до 2N мегабайт в среднем, потом он будет перемещен на свое место в файловой системе-это еще N мегабайт.
Особенности реализации файловой системы ОС Android — чем меньше свободного места на флэш диске, тем больше времени занимают операции с файлами. Время доступа вырастает, например с 5 мс до 300мс, в пределе время доступа может вырасти до 200 раз. Это происходит из-за того что файловая система пытается сохранить "жизнь" флэш диску, поэтому отслеживает интенсивные операции с файлами и наиболее востребованные файлы пытается перемещать с места на место. Это сделано для того, что бы равномерно распределить нагрузку (чтение и запись) по всему флэш диску. Чем больше файлов и чем меньше свободного места, тем больше ей на это нужно времени. Проблема решается путем замены множества небольших файлов одним большим.
Еще одной неприятной особенностью, но уже не самой ОС, фрагментация устройств (существуют тысячи разнообразных устройств, с разной производительностью и разным разрешением экрана). Разработчикам приходится создавать множество одинаковых интерфейсов пользователя для различных устройств.
Так же существуют различия в приемах программирования для обычных ОС и Android. Как пример можно привести специализированные классы - синглтоны.
Синглтон - это шаблон проектирования, гарантирующий, что
класс имеет только один экземпляр, и обеспечивающий глобальный доступ к этому
экземпляру. Другими словами, синглтон — это усовершенствованный вариант
глобальной переменной. Удобная
штука для хранения объектов, существующих в течении всего времени жизни
программы: всякого рода настроек, кешей и т.д. Сильно злоупотреблять
синглтонами не стоит, т.к. у них есть четко определенные недостатки. Однако в
некоторых случаях без синглтонов (как и без глобальных переменных) просто не
обойтись. Синглтон можно реализовать разными способами. Обычно его реализуют
так, чтобы он был доступен в любой точке приложения. Например, в виде класса, в
котором все функции статические. Или в виде обычного класса со статичной
функцией GetInstance() и приватным конструктором. При простой
реализации синглтона он может проработать довольно долго. Но однажды может
оказаться что вместо нужного объекта получаем null со всеми вытекающими
последствиями. Причина проста. В общепринятом описании синглтона
инициализируется статический класс синглтона в контексте деятельности. Если в
программе несколько деятельностей, то синглтон доступен в каждой из них. Но
если первоначальная деятельность, в которой создавался синглтон, будет уничтожена,
то и синглтон тоже будет уничтожен. После этого, в других деятельностях будет
возвращаться null вместо объекта. А ведь под ОС Android
подобное уничтожение деятельности дело обычное.
На текущий момент разработка мобильных программ является быстроразвивающимся и перспективным направлением. Однако, приступать к программированию для Android следует, имея опыт в разработки объектно-ориентированных программ. Хотя и существует большое количество документация для разработчиков, многие особенности и не документированные свойства постоянно появляются. Учитывая все особенности, и, обходя "подводные камни",в настоящее время с участием автора разрабатывается клиент-серверная система по расчету минеральных удобрений под заданную пользователем урожайность с/х культуры.
Литература
1. Документация разработчика Android - http://developer.android.com
2. Хашими С., Коматинени С., Маклин Д. - Разработка приложений для Android. Издательство Питер, Москва, 2011
3. Голощапов А.Л., Google Android программирование для мобильных устройств, BHV, Санкт-Петербург, 2011
4.
Майер Р., Программирование
приложений для планшетных компьютеров и смартфонов, Эксмо, Москва 2011