Разработка приложений для Android на Python

Действительно ли Java - единственный игрок в этой игротеке (программирование приложений для Android)? Подумайте еще раз.

Разработка мобильных приложений для смартфонов - горячая тема. Больше нет сомнений, что в экосистеме Android в этом смысле развилась бешеная активность. Однако, когда мы приступаем к разработке "реального" приложения для Android, начинает казаться, что имеется одна единственная возможность: программить на Java (хотя не исключена возможность использовать C/C++ с Android Native Development Kit). Выбор Google - сделать базой популярную среди разработчиков технологию для своего Android SDK, который запускает специальным образом настроенную виртуальную машину.

В отличие от других популярных смартфонов, это, наверное, хорошая стратегия. Всё что вам нужно, это персональный компьютер или лэптоп с запущенным Linux, Windows или Mac OS X, с копией Java и свободно распространяемым Android SDK. Google предоставляет для скачивания эмулятор, поддерживающий все верси Андроида, имеется даже свободный плагин для Eclipse для облегчения старта и ориентирования в правильном направлении.

Это круто - в том, конечно, случае, если вы фанат Java. Если подобно мне, вы скорее станете жрать стекло, чем сядете кодить что-то на Java в Эклипсе, тогда вам снова не повезло. Это, однако, не конец. Имеется сравнительно удачный проект, который позволяет внести разработку на скриптовых языках в платформу Android. И это Scripting Layer for Android (SL4A), рабочая альтернатива разработке на Java.

В этой статье я пройдусь по шагам, необходимым для подготовки вашего компьютера для Android-разработки с помощью SL4A. Мой сценарий покажет вам, как написать, оттестировать и запустить простой скрипт на Python в вашем Android-устройстве.

Введение в SL4A
Scripting Layer for Android - один из многих проектов, помогающих видеть жизнь через призму результатов политики Google, поскольку внутри корпорации официально принято выделять разработчикам до 20% рабочего времени на так называемые "проекты - домашние любимцы". Damon Kohler работает на Google, и он создал SL4A в качестве побочного эффекта почесывания судящих мест относительно разработки для Android. SL4A предоставляет высокоуровневый интерфейс для нижележащих технологий Android Java, включая API для языков сценариев.

Python был одним из первых языков, поддержка которого появилась в SL4A, но соответствующие интерпретаторы теперь также доступны для Perl, JRuby, Lua, BeanShell, JavaScript и Tcl. В своём состоянии по умолчанию SL4A поступает с работающей версией shell. SL4A API дизайн отличается нацеливанием на возможность переносимости кода между разными языками сценариев. Поэтому, если бы я захотел показать Perl вместо Python в данной статье, вызовы API выглядели бы точно также. Но Python - это в некотором смысле стандарт SL4A и к тому же мой выбор.

Примите низкий старт
Для начала нужно получить копию Android SDK, запущенную на вашем компьютере в виртуальной машине Java. Хотя мы и не собираемся программить на Java, JRE всё равно имеет место быть как требование, поверх среды работает эмулятор самого Android-а. Эмулятор является частью SDK. Эмулятор - это песочница, в которой мы играемся с тестами до переноса приложения в Android-устройство.

Прежде, чем начать, вы должны убедиться, что Java VM установлена в системе. В моей системе, установленной на свеженькой Xubuntu, я ввожу следующие команды и вижу, что Java недоступна:

$ javac -version
$ java -version

Xubuntu предлагает установить соответствующие пакеты с помощью apt-get to install openjdk-6-jdk, так и делаем:

$ sudo apt-get openjdk-6-jdk

Если же вы работаете в дистрибутиве, который не является веткой Дебиана, поройтесь в своём репозитории пакетов в поиске аналогичного.

Установив Java, озаботимся Android SDK. Предлагаемые для скачивания сборки доступны для Mac OS X, Windows и Linux. Найдем последний тарболл для Linux и загрузим его.

Установка Android SDK
Когда SDK загружен, просто распакуйте его в директорию по своему выбору (имя файла может отличаться от данного в примере):

$ tar zxvf android-sdk_r07-linux_x86.tgz

Эта команда создаст новый каталог, называющийся android-sdk-linux_x86, который я переименовал в просто Android. Для вас интерес представляет одна из поддиректорий с названием tools.

Подготовка Android Emulator
Внутри директории tools нас интересуют только две программы. Утилита adb помогает доставлять файлы внутрь эмулятора (и наоборот). Утилита android позволяет запускать эмулятор для любого номера версии Android, и сказать, что вы хотите делать дальше.

$ cd Android/tools
$ ./android

Команда android запускает Android SDK и AVD Manager, это утилита, которая запускает эмулятор нужной версии в виде виртуального устройства. На данный момент у нас ни одного устройства нет, нужно его создать. Перед тем как это произойдёт, вы должны установить целевой пакет Android API. Для этого перейдите на вкладку Installed Packages и нажмите кнопку Update All. В диалоге, который после этого появится нажмите Accept All и далее Install. Время для закачки потребуется много, поэтому идите на кухню и выпейте кофе.

Когда загрузка завершится, давайте создадим Android Virtual Device (AVD). Выберите вкладку Virtual Devices и нажмите кнопку New. В появившемся диалоге установите свойства виртуального устройства. На рисунке 1 показаны: имя, которое я выбрал для устройства (LJapp), выбранная цель (API Level 7, что соответствует Android 2.1), установленная виртуальная карта памяти SD, которую я обозначил как 256 Мб. Когда выберите свои установки, нажмите кнопку Create AVD для инициализации устройства.


Figure 1. Setting the defaults for your emulated Android virtual device.

Если теперь вернуться на вкладку Virtual Devices, там должно появиться новое устройство LJapp. Выберите его и нажмите кнопку Sart в появившемся диалоге. Эмулятор начнёт загрузку и через несколько секунд вы увидите открытый экран вашего Android-устройства (рисунок 2). Имейте в виду, что эмулятор работает медленнее, чем реальный телефон, поэтому появление стартового экрана займет время, это время зависит от шустрости процессора ПК.


Figure 2. Your Android emulator is ready.

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

Установка SL4A
Получение SL4A для эмулятора абсолютно прозрачно. Запустите браузер Android и перейдите на веб-сайт: code.google.com/p/android-scripting. Когда страница появится, тапните на квадратной картинке (QR Code) для доступа к ссылке на скачивание SL4A. Загрузка должна начаться немедленно. После ее завершения тапните на имени закачанного файла пакета, которое на время написания статьи sl4a_r3.apk, для установки. Для продолжения нажмём на кнопку Install, далее тапнем Open для старта приложения. Вы будете спрошены об участии в отслеживании использования, ваш выбор, можете участвовать или отказаться и затем SL4A информирует вас о том, что “No matches found” в вашем листинге скриптов. Это правильно, вы еще не установили ни одного скрипта. SL4A готов для Python.

Установка Python на Android
Вернитесь в браузер Android и дважды тапните на экране для увеличения веб-страницы. Найдите Featured Downloads на правой стороне страницы и тапните на стрелке загрузки пакета python_for_android_r1.apk. Как и раньше, дайте загрузке завершиться и тапните на загруженном пакете для установки. Для подтверждения установки - кнопка Install. После установки нужно будет нажать Open и большую кнопку install для завершения установки. Python for Android загрузит, раскроет и установит поддержку Python для SL4A с сайта SL4A и добавит к установленному пакету SL4A. Займет это всё пару минут. Если затянется, выдохните и вспомните, что эмулятор намного медленнее реального устройства.

После завершения инсталляции станет доступна кнопка Uninstall. Не нажимайте её! Вместо этого тапните на кнопке эмулятора в виде маленького домика для возвращения в главный экран Android. Тапните панель внизу экрана для просмотра списка установленных приложений, и убедитесь, что SL4A добавлен в ваш эмулятор, как на рисунке 3.


Figure 3. Your Android emulator has SL4A installed and is ready for action.

Далее жмём на иконку SL4A, которая теперь отобразит все установленные скрипты Python. Тапните на hello_world.py, это вызовет появление меню SL4A (рисунок 4).

При проходе слева направо иконки имеют следующий смысл: 1) запустить скрипт в командной строке Python; 2) запустить скрипт в "нативном" режиме; 3) редактировать скрипт во встроенном редакторе SL4A, он пригоден только для самой примитивной правки; 4) переименовать скрипт; 5) удалить скрипт. Для быстрой проверки своего приложения тапните вторую иконку в виде шестеренки. Через пару секунд появится сообщение “Hello, Android!”. Оно исчезнет также через две секунды.


Figure 4. SL4A Menu Icons

Если это всё работает, тапните скрипт test.py, затем шестеренку. Это запустит скрипт, который предоставляет вам ряд возможностей как разработчику для Android на Python. Опять-таки, держите в голове, что интерпретатор будет работать медленнее, чем в реальном устройстве. Будьте терпеливы и спокойно дожидайтесь появления различных элементов интерфейса Android.

Создание скриптов для Android
Теперь эмулятор полностью готов для запуска вашего собственного скрипта Python, так давайте создадим его. Перед тем, как мы этим займемся, имейте в виду, что SL4A API есть подмножество полного стека Android API. Но то, что есть - это более чем достаточно для создания полезных приложений Android.

Пример скрипта
Для того, чтобы прочувствовать, что такое запуск программы Python в SL4A, портируем существующее приложение в телефон. Скрипт примера взят из второй части O'Reilly Media's Head First Programming, где я выступал соавтором для David Griffiths в 2009. Этот простой скрипт заходит на сайт фиктивной компании, называющейся Beans'R'Us, захватывает содержимое главной страницы, разбирает его, находя строку с текущей ценой кофе в зёрнах и выводит эту цену в сообщении. Код прозрачен:

from urllib import urlencode
from urllib2 import urlopen

pg = urlopen("http://www.beans-r-us.biz/prices.html")

text = pg.read().decode("utf8")
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = float(text[start_of_price:end_of_price])

print "The current price of coffee is:", price

Это Python 2, что есть следствие недемократичного подхода к компонентам: с SL4A поставляется версия 2.6.2. Для выполнения программы поместите её в эмулятор или проверьте вначале в командной строке:

$ python LJapp-cmd.py
The current price of coffee is: 5.52

Портирование простого скрипта в Android
Превращение скрипта в приложение есть по сути добавление визуальных элементов, которые вы хотите привлечь для вывода сообщения. Смысловое ядро кода изменений не требует. Python внутри SL4A полнофункционален, поэтому возможно использование свойств стандартного Python.

Для приведения кода в более Android-like вид, отобразим дружественное приветствие при запуске и бай-бай при выходе. Этот функционал предоставляет makeToast() API.

Вызов dialogCreateSpinnerProgress() API позволит вам отобразить Android-диалог ожидания или прогресса. Для того, чтобы сделать его видимым, вызовем dialogShow(). Сначала вызовем диалог прогресса для ожидания результата запроса с сайта, затем подавим диалог с помощью вызова dialogDismiss() API, когда получим данные. В этой точке вызовем вибрацию телефона (для фана).

Для стадии завершения употребим dialogCreateAlert(), dialogSetItems() and dialogSetPositiveButtonText() API для отображения цены кофе-бобов. Для выхода потребуется тапнуть кнопку ОК.

Код с добавлением вызовов SL4A API будет следующий:

import android

from urllib import urlencode
from urllib2 import urlopen

app = android.Android()

app.makeToast("Hello from LJapp")

appTitle = "LJapp"
appMsg = "Checking the price of coffee..."

app.dialogCreateSpinnerProgress(appTitle, appMsg)
app.dialogShow()

pg = urlopen("http://www.beans-r-us.biz/prices.html")
text = pg.read().decode("utf8")
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = float(text[start_of_price:end_of_price])

app.dialogDismiss()
app.vibrate()

appMsg = "The current price of coffee beans:"

app.dialogCreateAlert(appMsg)
app.dialogSetItems([price])
app.dialogSetPositiveButtonText('OK')
app.dialogShow()
resp = app.dialogGetResponse().result

app.makeToast("Bye!")

Кроме добавления визуальных элементов, других изменений не предусмотрено.

Помещение скрипта в эмулятор
Для помещения скрипта в эмулятор, скопируем файл с кодом в каталог Android, затем зальём его, используя утилиту adb:

$ tools/adb push LJapp.py /sdcard/sl4a/scripts
6 KB/s (748 bytes in 0.116s)

После трансфера файла, проверим список доступных скриптов из меню SL4A и убедимся, что LJapp.py где-то вверху списка.

Тестирование скрипта
Продолжим. Тапните по имени приложения, затем шестерёнку. Спустя мгновение вы должны увидеть диалог прогресса, который будет висеть до получения данных с заглавной страницы Beans'R'Us, рисунок 5. Через пару секунд в другом диалоге мы увидим текущую цену на кофе, как показано на рисунке 6. Поздравляем, скрипт портирован в виртуальное устройство Android.


Figure 5. Your Python script is working.


Figure 6. And, there's the price of coffee beans. Is it time to place an order?

Теперь запустим на смартфоне
Для запуска скрипта на Android-устройстве, установим в него SL4A вместе с Python, затем залейте скрипт. Для установки SL4A задействуйте опцию Unknown Sources в Application settings вашего устройства. Эта опция необходима для установки non-Market приложений на телефон. Когда это сделано, проделайте обычные шаги, как при установке в эмуляторе. Для некоторого ускорения процесса скачайте сканер штрих-кодов Barcode Scanner с Android Market и используйте его для "чтения" QR Codes с экрана десктопа.

Трансфер скрипта на девайс
Есть несколько способов для заливки скрипта на смартфон. Я полагаю, что что-нибудь вроде соединения Bluetooth или соединения USB-кабелем может сильно зависеть от конкретного оборудования. Что работает на одном телефоне, на другом может не работать, и наоборот. Я обычно делаю следующее: на ПК поднимаю ssh-сервер, затем использую приложение на смартфоне для закачки файлов - AndFTP и с помощью scp закачиваю на телефон файл. Однажды получив доступ к ПК через AndFTP, я уже могу осуществлять навигацию по файловой системе компьютера. Держите под контролем то обстоятельство, что файлы нам нужно закачивать в каталог
/sdcard/sl4a/scripts на телефоне. Тогда имена скриптов будут появляться в списке SL4A.

Залив скрипт на девайс, запускаем его также, как указано выше. Ожидаем, что всё сработает так, как в эмуляторе, только существенно быстрее!

Создание пакета APK
Это может быть интересно для вас. Проект, содержащий черновые инструкции по созданию загружабельного пакета Android APK (см. ресурсы). Однажды созданный, пакет предоставляет ваш кастомизированный скрипт со средствами автоматической установки его на другие устройства с последующим запуском из главного меню приложений. Процесс создания пакета потребовал бы для описания отдельной статьи, это я оставляю для смелых из нас, кто способен освоить SL4A Wiki. Для "кое-чего почитать" по поводу успешного создания APK загляните на Split Hitter on the Web.

Несколько слов в заключение
Программирование приложений на Java есть не единственная опция для Android. Доступность SL4A также повышает нашу "хакеродоступность" относительно Android. Больше людей в разработке означает больше голов, а больше голов - это больше помощи и больше кода. Мы получим официальную поддержку Google, если сможем набрать критическую массу, которая сможет поднять профиль проекта во внутреннем рейтинге Google HQ. SL4A уже хорош, но официальный статус... пусть это наступит чем раньше тем лучше.

Resources

Google's Android SDK: developer.android.com/sdk

SL4A Project: code.google.com/p/android-scripting

SL4A API: code.google.com/p/android-scripting/wiki/ApiReference

AndFTP Home Page: www.lysesoft.com/products/andftp/index.html

Sharing SL4A Scripts as APKs: code.google.com/p/android-scripting/wiki/SharingScripts

Split Hitter: www.splithitter.com

Paul Barry (paul.barry@itcarlow.ie) lectures at The Institute of Technology, Carlow, in Ireland. His latest book is Head First Python, which was published by O'Reilly Media in November 2010. Find out more about Paul at his Web site: paulbarry.itcarlow.ie.

http://lexpr.ru/python_for_android

Категории: 

Метки: