FERRMA: Один за всех и все за одного!
Автор: Алексей Стародымов
Каждое современное мобильное устройство, будь то сотовый телефон, коммуникатор или карманный компьютер, наделено некоторым количеством "вшитого" в операционную систему софта - будильниками, адресными книгами, браузерами, клиентами электронной почты, простенькими играми и так далее и тому подобное.
Конечно, реализация этих программных фишек не может устроить всех и каждого: зачастую их качество оставляет желать лучшего, а некоторая крайне полезная для современного человека функциональность, вроде поддержки ICQ-подобных сервисов, отсутствует практически в любом "устройстве из коробки". Хорошо, если мы имеем дело с КПК или смартфоном, где на выручку приходит масса качественного (и дорогого) специализированного софта, написанного сторонними разработчиками; а вот если нам нужно "облагородить" и превратить в рабочую лошадку простой мобильный телефон, в основе интерфейса которого лежит фирменная операционная система закрытого типа?
Как ни удивительно, сегодня с этим проблем едва ли не меньше, чем в случае с аппаратами на базе открытых ОС: поддержка Java в наши дни присутствует практически в каждом телефоне ценой от ста долларов, а гибкость этой платформы позволяет создавать приложения, которые могут быть полезны обладателям телефонов совершенно разных брэндов. В этом, собственно, вся соль - приложения и игры, написанные на Java, являются кроссплатформными: один и тот же мидлет может работать, допустим, на телефоне Samsung, смартфоне Nokia и каком-нибудь наладоннике с WM внутри. Естественно, с совместимостью есть определенные проблемы - в каких-то продуктах Java-машины поновее, в каких-то - постарее, да и сами мидлеты нередко оптимизируются разработчиками под конкретные модели телефонов. Визуально разница заключается лишь в способе реализации работы с Java-контентом: некоторые аппараты (как правило, корейского производства) позволяют загружать мидлеты только с помощью WAP-браузера - таким образом демонстрируется борьба с пиратством. В остальных случаях достаточно сбросить jar-файлы по Bluetooth или кабелю; порой достаточно этого самого jar-файла, а кое-где требуется еще и jad, хранящий информацию об инсталлируемом приложении. Некоторые современные мобильные телефоны поддерживают многозадачность: так, аппараты от Sony Ericsson позволяют одновременно запускать до десяти Java-приложений, Motorola Z6/V8/U6 - всего одно, но есть возможность его свернуть или передать по "синему зубу", а вот телефоны Nokia, Samsung и LG допускают лишь один мидлет, уже без возможности работы в фоновом режиме.
Такова теория, которая, как обычно и бывает, пытается идеализировать ту или иную технологию. С технической и исторической точек зрения все гораздо интереснее и… сложнее. Начнем с того, что набор спецификаций, предназначенных для разработки Java-приложений и их запуска на карманных электронных устройствах, получил название Java 2 Micro Edition (Java 2ME), тогда как спецификации для серверных решений называются Java 2 Enterprise Edition (Java 2EE), а для домашних компьютеров - Java 2 Standard Edition (Java 2SE).
При этом, что очень удобно, разработчикам ПО не нужно разбираться в особенностях архитектуры конкретных мобильных устройств и изучать новые малознакомые среды программирования,- SDK (Software Development Kit) для написания софта с учетом различных версий спецификаций Java весьма схожи, и ничто не мешает в кратчайшие сроки научиться писать Java 2ME-приложения, имея опыт работы, скажем, с более сложным Java 2SE. Кроме того, платформа Java 2ME бесплатна, что сыграло важную роль в популяризации технологии: если производитель устройства решает реализовать поддержку Java в своем новом портативном устройстве, то он никому ничего не должен - понятие лицензионных отчислений здесь отсутствует. Полагаю, стоит упомянуть, что огромное количество Java-приложений также распространяется на свободной основе - платить приходится в основном за игры да за что-нибудь совсем уж специфическое. В то же время базовым набором полезных мидлетов можно разжиться, не заплатив ни цента, - скажем, "комплект" для работы в Интернете, включающий Opera Mini 4, JIMM, MailMan, ClimateControl, Google Maps и Mail.Ru Agent, не будет стоить ничего: заходишь на официальный сайт разработчика, скачиваешь, устанавливаешь и пользуешься в свое удовольствие.
В общем и целом принцип работы Java на конкретном устройстве таков: в программное обеспечение телефона разработчик встраивает виртуальную Java-машину, с помощью которой выполняются, а затем выводятся на дисплей загруженные мидлеты. Вроде бы все просто? Отнюдь. На практике картина выглядит далеко не так радужно: если некая виртуальная машина абстрактного устройства с большой долей вероятности может обеспечить выполнение кода, то с выводом информации на дисплей и управлением программой могут возникнуть (и зачастую возникают) проблемы - вновь встает вопрос о совместимости: хорошо, если конкретный мидлет разработала крупная компания, которая в состоянии протестировать его на совместимость с большинством актуальных моделей мобильных телефонов или же выпустить его версии для аппаратов различных брэндов (с различными схемами софтклавиш, разными разрешениями и ориентациями дисплеев), учтя при этом особенности реализации их Java-машин. Однако массу интересных Java-приложений пишут программисты-одиночки, которые разрабатывают их "с прицелом" на свой собственный аппарат или же линейку "соплатформников" одного производителя. И дать гарантию, что такой мидлет будет корректно работать на телефоне другой модели, не может никто.
Более того, основная проблема заключается в так называемых наборах API (Appli cation Programming Interface - программный интерфейс приложения), отвечающих за доступ к каким-либо программным или аппаратным функциям устройства непосредственно из Java-приложения, исполняемого виртуальной Java-машиной. Приведем пример из жизни: есть такой мидлет - BT Info, предназначающийся для Blue-Jack’инга. На Sony Ericsson W880i он получает доступ к Bluetooth-модулю, отыскивает устройства и обменивается с ними информацией, а вот MOTOROKR Z6 при попытке запуска мидлета выводит на дисплей сообщение об отсутствии поддержки JSR-82.