Меню Документы
Вход в систему
Облако тэгов
| Небольшое приложение для облачных вычислений в Android |
|
|
|
|
Структура каталогов в процессе разработки
Исходный код ядра Android следует установить в каталог mydroid. Перейдите в ваш домашний каталог и выполните команду mkdir mydroid. Затем выполните команды cd mydroid и repo sync.
Команда repo sync должна
загрузить весь исходный код Android в каталог mydroid и создать в нем
несколько важных дочерних каталогов, в том числе следующие:
- Каталог mydroid/external. В нем вам необходимо создать директорию cloud, в которой будет размещаться исходный код нашего проекта (cloud.c).
- Каталог out/target/product/generic/system/bin. После того, как утилита
makeзакончит сборку системы Android, в нем вы найдете скомпилированную программу cloud.
Проект cloud-приложения для Android
Сразу после запуска приложение проверяет, были ли переданы параметры командной строки. В качестве необязательных параметров она принимает номер порта для прослушивания и домашний каталог. В случае отсутствия параметров сервер будет использовать стандартный порт 80, а в качестве домашнего каталога — ту директорию, из которой он был запущен.
После проверки параметров приложение инициализирует сокет TCP/IP для прослушивания запросов через нужный порт, а затем переключается в режим демона, ожидая запросы от браузера и обрабатывая их по мере поступления. Когда браузер запрашивает страницу по умолчанию нашего облачного сервера, сервер возвращает страницу с содержимым упомянутого выше домашнего каталога. Имена файлов известных типов и имена каталогов выводятся в виде ссылок. В WWW под известными типами файлов понимаются те, для которых указан тип MIME. К таковым, например, относятся мелодии звонков, хранящиеся в телефонах под управлением Android в виде файлов с расширением .ogg. Они имеют MIME-тип audio/ogg, который говорит браузеру о том, что данные файлы должны проигрываться через динамики (разумеется, браузер должен быть правильно настроен, чтобы поддерживать эту возможность).
В верхней части страницы присутствует ссылка "Parent Directory" (родительский каталог). С ее помощью можно перемещаться вверх по дереву каталогов файловой системы вплоть до корневой директории. При этом имена других каталогов также выводятся в виде ссылок; при нажатии на них вы спуститесь в соответствующую директорию и увидите находящиеся в ней файлы.
Таким образом, приложение cloud позволяет удобным образом просматривать файловую систему мобильных телефонов. При этом ее исходный код (см. Загрузка) может служить в качестве функционального шаблона, который вы можете изменять по своему усмотрению (в конце статьи приведено несколько советов по модификации исходного кода приложения). Кроме того, вы можете скомпилировать и запустить это приложение на своем рабочем компьютере и просматривать содержимое его файловой системы (инструкции можно найти по ссылке в разделе Ресурсы).
Исходный код на С
Исходный код любой программы обязан как минимум содержать ее название и имя ее автора. Эти атрибуты, а также заголовочные файлы и некоторые полезные константы показаны в листинге 2.
Листинг 2. Информация об авторе, заголовочные файлы и константы
|
В листинге 3 показаны глобальные переменные, доступные всем функциям приложения. Большинство из них представляют собой указатели на буферы памяти, которая выделяется при обработке запросов от браузера. После возвращения страницы браузеру память освобождается и передается обратно операционной системе телефона. На вычислительных устройствах, имеющих ограниченные ресурсы, своевременное освобождение памяти имеет приоритет перед многими другими соображениями.
Листинг 3. Глобальные буферы памяти
|
В программе используется
простая таблица, устанавливающая соответствие между расширениями файлов
и типами MIME, которые должны быть известны браузеру для корректного
показа содержимого. Структура данных, показанная в листинге 4,
используется функцией mimeokay с единственной целью: для того, чтобы глобальная переменная fstr указывала на тип MIME, соответствующий расширению файла, хранящемуся в переменной fext.
Получив эту информацию, облачный сервер может отобразить имя файла в
виде ссылки (либо без ссылки, если тип неизвестен). Кроме того, это
позволяет передать MIME-тип браузере одновременно с передачей
содержимого файла.
Листинг 4. Определение MIME-типов
|
В листинге 5 приведен
необязательный фрагмент кода, который используется на этапах разработки
и тестирования и отвечает за журналирование действий приложения в файле
cloud.log. Наше приложение выполняется на относительно медленном
устройстве, поэтому эту функциональность лучше отключать, за
исключением тех случаев, когда вам действительно необходимо знать, как
ведет себя код при его модификации. Если журналирование необходимо, то
константа LOGGING в листинге 1
должна иметь значение TRUE. Если же приложение выполняется на мобильном
телефоне, следует установить ее в значение FALSE, чтобы избежать
серьезных потерь производительности.
Листинг 5. Журналирование
|
В листинге 6 показано
несколько функций, служащих для создания HTML-страниц, возвращаемых
приложением. Следует учитывать, что все страницы качественно сделанного
Web-сайта должны следовать общему стилю. В данном случае такой стиль
определяется в функции buildbuf.
Листинг 6. Вывод результатов в формате HTML
|
В листинге 7 показано,
как cloud-сервер возвращает содержимое файла известного MIME-типа.
Обратите внимание, что браузер ожидает, что MIME-тип будет передан
сервером в строковом поле Content-Type:. Функция,
приведенная в листинге 7, вызывается после нажатия на ссылку с именем
файла и возвращает его содержимое. Если чересчур изобретательный или
злонамеренный пользователь вручную введет неправильное имя файла в
адресной строке браузера, вызовется функция error404, которая вернет соответствующее сообщение.
Листинг 7. Возвращение содержимого файла
|
Процесс формирования
основного списка файлов с гиперссылками показан в листинге 8. Как
видите, создание ссылок выполняется многократно, поэтому
соответствующий фрагмент кода разумно вынести в отдельную функцию hyper. Благодаря переменной isDir префикс /CD_ прибавляется к полному пути к файлу, чтобы сервер знал, что необходимо вывести содержимое каталога. Далее следует функция fileList, которая занимает центральное место в приложении.
Листинг 8. Функции для вывода содержимого каталогов
|
В листинге 9 показана функция child, которая вызывается при обработке каждого запроса от браузера. У нее всего одна простая задача: выделить память под буферы, которые необходимы для обработки запроса, затем обработать их содержимое, после чего освободить память, чтобы не расходовать ее без необходимости. Память в мобильных телефонах представляет собой дефицитный и дорогой ресурс, и ее необходимо освобождать немедленно после того, как программа закончила обработку запроса.
Листинг 9. Функция child приложения-демона
|
Функция main, играющая
роль точки входа в приложение, показана в листинге 10. Она
инициализирует сокет TCP/IP, через который будет ожидаться поступление
запросов от браузера. Затем функция также инициализирует некоторые
глобальные переменные, в частности, theDir, сохраняя в ней каталог запуска. Наконец, эта функция переключает приложение в режим демона
(т. е. программы, постоянно присутствующей в памяти), в котором оно
может обрабатывать запросы в фоновом режиме, не прерывая выполнение
других процессов.
Листинг 10. Точка входа в приложение
|
Компиляция, развертывание и тестирование приложения
Нам осталось создать еще один файл, чтобы собрать наше облачное приложение при помощи файла сборки, поставляемого вместе с исходными кодами ядра Android. Создайте файл с именем Android.mk и скопируйте в него содержимое листинга 11 (этот файл также можно найти в архиве, ссылка на который приведена в разделе Загрузка).
Листинг 11. Файл Android.mk
|
Далее перейдите в подкаталог external в каталоге, в котором находятся исходные коды ядра Android, и создайте в нем дочернюю директорию cloud. Теперь можно собрать новую версию ядра Android, включающую приложение cloud.
Переместитесь в корневой каталог с исходными кодами ядра Android и запустите команду make. Ее выполнение может занять определенное время, так что вы можете позволить себе расслабиться и выпить чашечку кофе.
Если все прошло хорошо и система была собрана удачно, то исполняемый файл сервера cloud должен находиться в каталоге out/target/product/generic/system/bin. При этом вам необязательно переустанавливать всю систему на вашем телефоне. Достаточно скопировать полученный файл на SD-карту памяти. В листинге 12 приведен пример того, как это можно сделать с вашего рабочего компьютера (в этом примере считается, что исходные тексты ядра Android находятся в каталоге mydroid).
Листинг 12. Сборка ядра Android и приложения cloud
|
Учтите, что в этом примере подразумевается, что ваш телефон подключен к компьютеру, а его файловая система подмонтирована в точке /media/ANDROIDSDCARD. Кроме того, на вашем телефоне SD-карта может иметь другое имя. Его можно найти внутри директории /media (если вы используете ОС Ubuntu семейства Linux).
Доступ к командному интерпретатору (shell)
телефона Android можно получить при помощи любой из бесплатных
терминальных утилит, распространяемых через сервис Android Market.
Приложение cloud обычно (но необязательно) находится в каталоге
system/bin. В целях тестирования имеет смысл поэкспериментировать с его
запуском из разных каталогов, поэтому создайте директорию cloud. в каталоге /data и скопируйте в нее исполняемый файл из /sdcard. Далее выполните команду chmod, чтобы сделать программу исполняемой, а затем запустите ее командой cloud. Примеры выполнения этих действий приведены в листинге 13.
Листинг 13. Тестирование cloud- приложения на телефоне под управлением Android
|
Нажмите кнопку Home для запуска браузера и обратитесь по адресу http://localhost. Вы должны увидеть результаты работы нашего облачного сервера в браузере Android. Щелкая по ссылками, вы можете перемещаться по файловой системе вашего телефона.
Теперь, если ваш телефон подключен к сети через
Wi-Fi, вы сможете просматривать его файловую систему со своего
компьютера. Для этого необходимо узнать IP-адрес телефона в Wi-Fi-сети,
что можно сделать несколькими способами, например, проанализировав логи
маршрутизатора Wi-Fi. Кроме того, можно вновь обратиться к программе
Terminal и выполнить команду netstat -r. Результат должен быть аналогичен показанному в листинге 14.
Листинг 14. Использование команды netstat для получения IP-адреса телефона
|
Наберите http://192.168.0.3/ (IP-адрес
вашего телефона) в адресной строке браузера, и через мгновение вы
получите доступ к файловой системе телефона, предоставленный нашим
маленьким облачным сервером.
Этот сервер можно использовать для просмотра параллельно редактируемой Web-страницы. Для этого просто нажмите и удерживайте кнопку Home для запуска браузера или редактора. Запустив браузер, обновите страницу, чтобы увидеть сделанные изменения. Чередуя операции редактирования и просмотра, вы можете заниматься Web-дизайном, сидя, например, в приемной у стоматолога.
Варианты дальнейшего расширения проекта
Созданное нами приложение можно расширять в различных направлениях. Ниже приведены некоторые из вариантов.
- Добавьте в меню отдельный пункт под названием Java, который позволит сразу переместиться в каталог с классами Java и просматривать их содержимое. Файлы классов представляют собой сжатые директории, поэтому их можно отображать в виде ссылок. Аналогичные расширения можно добавить для любых каталогов, содержащих интересующий вас программный код.
- Добавьте страницу, которая будет выполнять те же функции, что и команда top. Она будет автоматически обновлять каждую минуту и выводить информацию о процессах, которая может быть получена из каталога /proc.
- Напишите код, позволяющий осуществлять запросы к базам данных SQLite через Web-страницу.
- Учитывая портативность телефона и то, что SD-карты могут вмещать целые HTML-презентации, вы можете использовать ваш телефон для показа слайдовых демонстраций, используя Web-браузер, встроенный в большинство современных презентационных устройств.
Определившись с вариантом расширения возможностей облачного сервера, вы сможете реализовать его, следуя общим советам, приведенным ниже.
- Измените функцию
buildbuf, показанную в листинге 6, добавив новый пункт в меню, отвечающий за доступ к новой функции. - Модифицируйте функцию
child, приведенную в листинге 9, которая должна обслуживать запросы нового типа. Например, разберитесь, как реализован пункт менюAbout_в обеих функциях (buildbufиchild), и вы убедитесь, что в добавлении новых возможностей нет ничего сложного. - Наконец, напишите функцию, реализующую новую функциональность и добавьте ее вызов в функцию child.
Заключение
Всегда полезно знать как можно больше об используемых вами устройствах. При этом написание программ, которые помогут вам узнать эти устройства детальнее, может доставить немалое удовольствие. Создание приложение для облачных вычислений на телефоне под управлением Android – это, во-первых, интересно, а, во-вторых, помогает разобраться в том, что происходит внутри этих замечательных устройств.
Загрузка
| Описание | Имя | Размер |
|---|---|---|
| Исходный код демонстрационного приложения | os-tinycloud-source.zip | 9 KБ |
Ресурсы
Научиться
- Оригинал статьи: "A tiny cloud in Android" (Билл Циммерли, developerWorks, ноябрь 2009 г.). (EN)
- Ознакомьтесь с медиа-типами MIME. (EN)
- Посетите Web-сайт альянса Open Handset. (EN)
- Прочитайте статью в Википедии, посвященную Android. (EN)
- Прочитайте статью "Получение административных прав на телефонах Android" и узнайте, как можно получить привилегии для запуска собственных приложений на вашем телефоне. (EN)
- Ознакомьтесь со статьей "nweb: компактный и безопасный Web-сервер для статических страниц" и узнайте, как обслуживать запросы к статическим страницам при помощи nweb. (EN)
- Прочитайте "Справочное руководство по архитектуре ARM" – Библию программирования для ARM. (EN)
- В разделе трансляций на сайте developerWorks можно слушать интервью и обсуждения вопросов, представляющих интерес для разработчиков. (EN)
- Чтобы быть в курсе последних новостей, посещайте раздел технических мероприятий и Web-трансляций на сайте IBM developerWorks. (EN)
- Следите за новостями developerWorks при помощи сервиса Twitter. (EN)
- Узнавайте о предстоящих конференциях, демонстрациях, Web-трансляциях и других мероприятиях по всему миру, представляющими интерес для разработчиков открытого программного обеспечения IBM. (EN)
- В разделе Open Source сайта developerWorks
приведено множество практических инструкций, инструментов и новостей,
которые помогут вам применять технологии с открытым исходным кодом в
своих проектах и использовать их совместно с продуктами IBM, а также наиболее популярные статьи и руководства.
- Сообщество "Мой developerWorks" является примером успешного социума, в котором обсуждается широкий круг вопросов. (EN)
- Следите за развитием и узнавайте об открытых технологиях и возможностях продуктов IBM, просматривая бесплатные демонстрации On demand на сайте developerWorks. (EN)
Получить продукты и технологии
- Посетите официальный сайт Android, на котором находятся ресурсы для загрузки и полезная информация. (EN)
- Обратитесь к репозиторию GIT, содержащему исходный код ядра Android. (EN)
- Загрузите пакет G++
Lite с сайта CodeSourcery. (EN)
-
Реализуйте инновационные идеи в вашем следующем проекте с открытым исходным кодом, используя ознакомительные версии продуктов IBM, которые можно скачать с сайта developerWorks или заказать на DVD. (EN)
- Загрузите ознакомительные версии продуктов IBM
и опробуйте инструменты разработки приложений, а также связующее
программного обеспечение IBM семейств DB2®, Lotus®, Rational®, Tivoli®
и WebSphere®. (EN)
Обсудить
- Примите участие в обсуждении материала на форуме developerWorks.
- Участвуйте в обсуждениях в блогах developerWorks и становитесь членом сообщества developerWorks.(EN)
Об авторе
Билл Циммерли (Bill Zimmerly) является специалистом в области инженерии знаний, а также программистом языков низкого уровня. Он имеет большой опыт работы с различными версиями программного обеспечения UNIX® и Microsoft® Windows®. Билл с огромным энтузиазмом и удовольствием занимается созданием новых технологий и рассказывает о них в своих статьях. Живет он в деревушке Хиллсборо, Миссури, где может наслаждаться чистым воздухом и прекрасной природой. Кроме того, неподалеку находятся несколько винных заводов. Связаться с ним можно по адресу электронной почты: bill@zimmerly.com.

