Приложение из титана. Создаем программы с помощью новой платформы Titanium. Статья для журнала Хакер
Статья написана специально для журнала Хакер и опубликована на сайте журнала (в несколько сокращенной и отредактированной версии). Ниже я публикую свой оригинальный вариант, без правок или ограничения на объем материала.
Развелось сегодня разных платформ, немеряно просто. У каждого уважающего себя пацана стоит Linux, у странных личностей все еще пыхтит винда, а вероотступники пересели на MacOS и смотрят на всех свысока. Черт, а загляни в карман – там этих гаджетов тоже немало. Кульный iPad, вместе с собратьями, Google лезет во все щели на рынок со своим Android OS, а еще есть никому не понятные но популярные у буржуев Balckberry и, тьфу тьфу, Windows Mobile. Зоопрак прям, верно? А ты просто бедный программист, потому что очень ведь хочется написать один раз программу, воплотить свой шедевр, и потом легким движением руки запускать ее везде. Да, есть java, на которой думалось, что все будет везде работать, но фиг там, не особо получилось. Если на десктопах еще более менее (а сколько ты знаешь массовых программ на Java, которые везде одинаково работают – Eclipse да и все), то с мобильной стороной у Java все очень плохо, и даже JavaFX не помогает. Хотя внутри Андроида и лежит Java, но и там она сильно урезанная и подогнанная под возможности мобилок. Так что, если захочешь писать под все это разнообразие, готовься учить под каждую платформу свой язык, компилятор, ограничения платформы и API, в отдельных запущенных случаях еще и среду разработки и саму платформу, ведь для iPad/iPod/iPhone особо не попишешь без реального устройства и железного мака (на виртуалку не надейся, много заморачиваться надо).
Но лень, как говориться, двигатель всей ИТ-мысли, поэтому появились предприимчивые парни из стартапа Appcelerator, которые выложили в открытом виде специальный фреймворк и систему разработки Titanium. С ним жизнь сразу становиться лучше и светлее – ты пишешь программу один раз, используя только одно API, а потом компилируешь одним кликом, а в результате все работает на любой платформе. Интересно узнать как?
Титановый скелет.
Не буду мучать тебя больше, сразу к делу. Ты ведь хочешь узнать, как это все работает? Appcelerator Titanium это целая комплексная открытая система для быстрой кросс-платформенной разработки приложений, тестирования, сборки и распространения на всех доступных платформах, включая мобильные. В основе всего лежать обычные и стандартные веб-технологии – HTML 5, CSS и JavaScript. Да-да, ты можешь писать приложения для десктопа как обычный веб-сайт, а потом просто скомпилировать и получить бинарный исполняемый файл. Кроме этого, есть возможность писать части приложения и модули среды на Python, Ruby и даже на PHP. Создавать приложение можешь в любой удобной среде разработки (например, выбери из тех, о которых мы писали в Хакер №) или даже в блокноте. В проект включаются все необходимые файлы, например графические, стили, HTML-странички и любые другие ресурсы. Разрабатывая исходный код, если придётся что-то делать вне приложения, для этого надо использовать API, который предоставляет Titanium. Это необходимо, чтобы абстрагироваться от конкретных платформ – тебе не надо думать, а как, черт возьми, открыть файл на устройстве Blackberry или создать диалоговое окно. Большая часть API доступна всем устройствам, а если какой-то функции нет, то она эмулируется. Все это работает как ран-тайм прослойка, для каждой платформы своя, но тебя это уже не беспокоит, ведь приложение работает только поверх своей среды. Внутри лежит лучший из современных веб-движков, Webkit, который используется как рендер HTML/CSS, а также как среда исполнения javascript-ового кода. Эта часть платформы всегда доступа, если же ты хочешь писать на других языках, например, PHP или Ruby, их интерпретаторы и необходимые библиотеки будут включены в приложение. Внутри системы есть API для связки всех языков вместе, поэтому просто можешь писать на том, что лучше знает, а потом связать все вместе. Приятно, что разработчики не стали изменять базовые дистрибутивы языков, например, РНР можно обновить просто скопировав в SDK файлы из официального дистрибутива.
Вторым компонентом Titatium-а является специальное приложение для сборки проекта, созданное, конечно же, на своей платформе. Там ты можешь создать профиль приложения, задать его базовые параметры, а потом одной кнопкой запустить и проверить, что вышло. Прямо на твоем компьютере код будет запакован в двоичный исполняемый файл, слинкован с ран-тайм платформой и выполнен. Если все хорошо и правильно работает, переходи смело к последней фазе разработки. Appcelerator использует собственную облачную платформу для компиляции и создания приложений для разных платформ, поэтому ты у себя на компьютере сможешь только собрать тестовый вариант для проверки работы, сами же исполняемые файлы для разных платформ будут собраны на мощностях компании, а тебе только выдадут красивую страничку с ссылками на все доступные варианты (выдадут только если не глючит система сборки, а то я регулярно пока обламываюсь с их сборкой). На последнем этапе ты просто выбираешь, какие платформы тебя интересуют и вариант установки. Если не переживать по поводу размера приложения, то стоит слинковать рантайм и библиотеки с приложением (такой пакет называется bundled). Если хочешь получить минимальный инсталлятор, то выбери Network, тогда при установке приложение само загрузит все необходимые ему компоненты из сети. Если разрабатываешь что-то коммерчески интересное, то не обязательно выкладывать свое творение сразу для всех, приложения могут быть приватными – тогда его смогут поставить только те, кому ты сообщишь ссылку на страницу загрузки. Если же ты сделал обновление к существующему уже приложению, то всем пользователям будет разослано уведомление что вышла новая версия и они будут обновлены.
И самая интересная тебе, как разработчику, часть системы – это ее API, ведь именно через него будет строиться все приложение и использоваться функционал железок, на которых работает программа. Я не стану перепечатывать тебе содержание документации, это есть на сайте, а просто расскажу о ключевых модулях, которые могут помочь создать приложение с уникальным функционалом.
Analytics – встроенная система для получения подробной статистики использования приложения. Это что-то типа Google Analytics но для приложения. И, кстати, это очень круто, видно, что разработчики не только увлеклись крутостью своей платформы, но и поняли, что без таких вещей в суровый мир коммерческих решений не пробиться.
Database – это уже веянье HTML5, встроенная база SQLite, которая уже давно доступна в движке Webkit, здесь доступна «бесплатно». Network – самый богатый компонент, и самый важный для крутых программ, ведь вспомни, сколько костылей надо, чтобы добавить функции общения в реальном времени для веб-приложений. Разные там Comet, WebSokets – забудь, здесь есть все, что необходимо для прямой работы с сокетами, HTTP клиент и сервер, даже сразу встроенный компонент для IRC-чатов.
Любое приложение развивается и дополняется, и чтобы не заставлять пользователей повторно что-то скачивать и ставить, в базовый API входит компонент UpdateManager, который берет всю эту рутину на себя. Можешь спать спокойно, как только появиться новая версия приложения, оно будет сразу доступно всем пользователям.
Worker – это вариант построения многопоточности, взятый, как ты уже догадался, из спецификации HTML 5. Если тебе надо что-то делать в фоновом режиме, чтобы не грузить приложение, просто создай воркера и дай ему задачу, она будет выполняться параллельно в соседнем потоке, обмениваясь сообщениями с основным приложением, никак не тормозя его.
В модуле UI доступа работа с буфером обмена, панелью задач и треем – так что приложение на базе Titanium-а будет вести себя идентично родным системным программам, даже не подозревая, что внутри веб-страницы на JavaScript и дополненные возможностями HTML 5.
Немного разочаровали только модули кодеков и работы с мультимедиа. Ты можешь работать с Zip-архивами, воспроизводить звуковые файлы и все. Вот было бы круто, если бы встроили сразу видеокодеки, например, нашумевший гугловский VP8/WebM. Это бы сделало возможность делать серьезные мультимедийные приложения, порвав просто ближайшего конкурента, Adobe AIR просто в клочья на его же поле.
API для мобильных устройств немного отличается, в основном наличием специфических модулей, вроде списка контактов или акселерометра. Остальные модули практически идентичные, поэтому если тебе не надо использовать что-то мобильное, то твое приложение будет сразу работать и на десктопах, и на мобилках. Если же хочешь крутости, то в мобильной версии платформы тебе доступна интеграция с Facebook, доступ к геолокационным функциям устройства, слежение за жестами пользователя (вроде переворота или встряхивания телефона). Медиа-модуль здесь вообще крутой, есть не только работа со звуком и видео, запись и воспроизведение, работа с встроенной камерой (если она, конечно, поддерживается устройством). Из дополнительных фич есть встроенная работа с картами и сервисами Yahoo, но нет воркеров, потому о многопоточности можно забыть. Работа с элементами интерфейса, кроме общих функций, имеет специфическое API для устройств на базе Android и iPad/iPhone, поэтому здесь код немного усложниться, чтобы адекватно поддерживать все возможности устройств.
Кстати, API является независимым от языка, поэтому даже если ты на одной странице подключишь код на PHP, Ruby и JavaScript, все они смогут работать с одинаковыми объектами и методами платформы, конечно различаясь синтаксисом вызова функций. Также любой код имеет доступ к DOM-дереву текущей страницы приложения. Жаль, правда, что для мобильных платформ доступен только код на JavaScript, ведь правда, как туда запихнуть интерпретатор РНР, который сам на пару десятков мегабайт потянет.
Тебе осталось только разобраться в структуре проекта, прежде чем начать и сделать свое первое приложение. У тебя должна быть регистрация, бесплатная, на сайте Appcelerator, чтобы получить возможность создавать приложения. А дальше просто – приложение состоит из директории Resources, где хранятся все твои файлы, это корневая директория проекта. Выше нее лежат только служебные файлы для сборки – манифест, описывающий настройки среды (он создается автоматически), лицензия и файл конфигурации tiapp.xml. В нем несколько опций, которые могут быть полезными. Например, начальный, минимальный и максимальный размер окна приложения, либо и вовсе флаг полноэкранного режима. Здесь же можно задать, какие из системных кнопок будут доступны (вроде свернуть, развернуть и закрыть), а также ссылка на главную страницу, которая загружается при старте приложения. Обычно это ссылка на html-файл в директории ресурсов, но что если задать там произвольный URL сайта? Правильно, получится приложение, в точности как обычное, с инсталлятором и прочими фишками, но показывающие только один сайт. Так можно за два клика сделать клиент для онлайн браузерной игры или любого другого веб-сайта, главное чтобы он корректно работал в браузере на базе WebKit-а, не требовал специфический для браузера модулей. А вот с флешем ситуация прикольная. Он, конечно же, не входит в платформу, в отличие от Abode AIR, где наоборот, все крутиться вокруг связки Flash+Webkit, но если установлен в системе, то будет прекрасно работать!
Есть один глюк в среде тестирования – при запуске приложения оно создает в директории проекта папку dist, где и будет инсталляция проекта, но при попытке тестовой компиляции, во-первых, все исходные файлы проекта помечаются как read-only, во-вторых, второй раз запустить программу уже не удается – предыдущий дистрибутив надо удалить вручную прежде чем запустить сборку во второй раз.
Врезка 1. Сайт Хакер.ru как приложение
Для того, чтобы превратить сайт журнала в полноценное приложение, достаточно создать новый проект в среде Titanium Developer, а потом, открыв в блокноте файл tiapp.xml, отредактировать его следующим образом:
<?xml version='1.0' encoding='UTF-8'?>
<ti:app xmlns:ti='http://ti.appcelerator.org'>
<id>ru.xaker.www</id>
<name>Xaker WebApp</name>
<version>1.0</version>
<publisher>Vasja Pupkin</publisher>
<url>http://xakep.ru</url>
<icon>default_app_logo.png</icon>
<copyright>2010 by Vasja Pupkin</copyright>
<window>
<id>initial</id>
<title>Xaker WebApp</title>
<url>http://xakep.ru</url>
<width>700</width>
<max-width>3000</max-width>
<min-width>0</min-width>
<height>500</height>
<max-height>3000</max-height>
<min-height>0</min-height>
<fullscreen>true</fullscreen>
<resizable>true</resizable>
<chrome scrollbars="true">true</chrome>
<maximizable>true</maximizable>
<minimizable>true</minimizable>
<closeable>true</closeable>
</window>
</ti:app>
Приложение будет запускаться в полноэкранном режиме, в котором есть небольшой баг – при нажатии на Esc оно не выходит из него, это надо реализовать самостоятельно.
Кстати, для того, чтобы попробовать какой-то код или библиотеку, совсем не обязательно создавать целое приложение. В среде Titanium Developer есть специальный режим – Community, в котором доступна лента твитов, где упоминается что-либо о разработках компании, а также доступна специальная песочница, в которой можно использовать некоторые стандартные библиотеки типа Dojo или jQuery, тестируя отдельные участки кода просто в окне программы. Конечно, доступны все вызовы Titanium API, а код будет скомпилирован в приложение, которое сразу же запуститься.
Все зашибись…
В общем, чувак, все отлично – открытый проект, дают развитый API, позволяют писать на любом языке, а значит переучиваться не надо, поддерживают не только все правильные ОС на десктопе, но и почти все мобильные платформы. Даже есть собственная среда разработки, со странностями и местами убогая, но все же лучше, чем ничего. JavaScript API очень простой и даже приятный в работе, поэтому написать простое приложение или же расширить функционал сайта, перенеся в клиент сложные фичи – это занятие на пару вечеров. Если потрудиться, то можно также просто сделать и программу для iPhone, правда, если найдешь Mac и оплатишь членство в программе разработчиков. Поэтому лучше всего писать для Android-а – это и быстро и бесплатно, а конкуренция в этой среде пока еще гораздо ниже, чем в Apple.
Titanium определенно крутая и интересная штуковина, стоит того, чтобы изучить и поэкспериментировать с ней. Веб-разработчику это простейший путь перенести на десктоп свой сайт, обычному программисту быстрый способ выйти на новый рынок мобильных приложений. Если ты вообще крутой и не интересуешься всеми этими финтиклюшками, изучи их ядро, Kroll, очень интересная штука в плане создания систем с плагинами.
Кстати: на платформе Win32 ты можешь разрабатывать только для Android устройств. Для этого необходимо иметь установленную JDK и Android SDK. Разработка под устройства Apple доступна только на MacOS, несмотря на то, что пункт iPad доступен в меню типа приложений для всех платформ.
А как же Adobe AIR?
Да это ж то же самое, что и AIR от Adobe, воскликнешь ты, да еще и с муторной системой сборки приложения! И будешь неправ, потому что, в отличие, не к ночи будет помянутый, AIR, Titanium пакует все приложение вместе со средой исполнения. Это означает, что каждому приложению предоставляется своя отдельная среда, никак не связанная с другими приложениями. В AIR-е же среда является разделяемой, одной на все приложения в системе, что не лучшим образом сказывается на быстродействии. К тому же, если разные приложения требуют разных версий фреймворка или библиотек, для Titatium-а это совершенно не проблема, а вот в AIR-е все придётся использовать либо самую последнюю версию или ничего. И наконец, чтобы добить сомневающихся, где AIR для 64-битного Linux-а?
А вместо сердца пламенный мотор…
Если тебе интересно, что еще глубже внутри этой системы, так слушай. Для построения эффективной кроссплатформенной системы модулей на разных языках, Appcelerator написали нечто подобное до ядра ОС, только направленную на взаимодействие библиотек. Kroll – это микроядро на С++, которое выступает связывающим звеном между всеми модулями и языками, преобразует вызовы методов из разных языковых сред, обеспечивает передачу параметров в понятном для языка стиле и формате. Для этого модуль, написанный на одном из поддерживаемых языков (JavaScript, C/C++, Python, Ruby, PHP), должен использовать Module API, с другой стороны, необходимо использовать специальный Binding API, специфический для каждого языка, который и отвечает за работу с данными. После регистрации (связывания) модуля с ядром Kroll, можно прозрачно вызывать методы любых языков и модулей. В будущем планируется добавить поддержку Java, C#/Mono и Lua. Вот это уже будет очень интересно, ведь тогда Kroll можно попробовать использовать в сторонних продуктах, создавая модульные системы на любых языках. Исходники доступны на Github: http://github.com/appcelerator/kroll
Кстати: несмотря на известные скандалы с Apple и приемом в AppStore программ, разработанных не на фирменном инструментарии, за приложения на базе Titanium можно не беспокоиться – они вполне нормально проходят все проверки.
Интересные ссылки:
- Сайт: http://www.appcelerator.com
- API: http://developer.appcelerator.com/documentation
- Github: http://github.com/appcelerator
- Приложения: http://www.appcelerator.com/showcase/applications-showcase/
- Обучающее видео: http://developer.appcelerator.com/training
- Сравнение мобильных платформ и средств разработки: http://www.devx.com/wireless/Article/45208/1954?pf=true
- Twitter компании: @appcelerator
Жаль, что воркеры можно использовать только джаваскриптовые…
Ну в принципе да, хотя мне кажется, что остальные языки как то странно выглядят для разработчик десктопного ПО, и слабо понимаю надобность их включения в титаниум. Но если надо, думаю легче всего сделать воркеры на JS, которые будут, в свою очередь, запускать скрипты на другом языке, и обмениваться результатами с основной программой через сокеты или пайпы. То есть, использовать JS как управляющую прослойку для воркеров
Отличная статья, думал о таком инструменте давно и таки ваша статья помогла его найти, но, как и везде и тут я уверен не обошлось без минусов о которых в статье практически ни слова, где то можно про них почитать?
Спасибо, хорошая статья.
Ошибка в слове Balckberry, в начале. Видимо Blackberry
да, опечатка, спасибо.
И наконец, чтобы добить сомневающихся, где AIR для 64-битного Linux-а?
Ну насколько известно это решаемая проблема http://quizz.bhome.ru/507-ustanovka-adobe-air-v-ubuntu-64-bit-na-primere-site-auditor/
Удивительно… Но кодить на php все равно не брошу:)