Пользователь
0,0
рейтинг
7 декабря 2011 в 21:02

Разработка → Написание программы для простейшей синхронизации файлов по FTP для Android с помощью SL4A + Python из песочницы

Введение


В данной статье рассматривается процесс написания программ при помощи SL4A на примере программы для синхронизации файлов по протоколу FTP на языке Python в операционной системе Ubuntu. Показаны настройка операционной системы для разработки SL4A-приложений, написание самого приложения, распространение приложения с помощью баркодов и упаковка приложения в .apk-файл.

Немного слов о том, что такое SL4A и с чем его едят


Проект SL4A (Scripting Layer for Android), появившийся на свет благодаря Деймону Кохлеру (Damon Kohler) и предоставляемыми Google'ом 20% свободного рабочего времени, дает возможность программировать под платформу Android на различных интерпретируемых языках программирования (на данный момент это Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl и Shell).
На хабре уже писалось про SL4A. Например, здесь рассказывалось о том, как написать приложение на Python для проверки кармы на хабре, а здесь с помощью Lua создавался скрипт, отключающий коммуникации телефона на ночь.

SL4A хорошо подходит для обучения программированию, для написания прототипов программ, для решения задач автоматизации действий на платформе Android. Большие серьёзные программы на SL4A не пишутся, но для создания мини-программ он подходит хорошо. Проверить карму на хабре, отправить смс жене, чтобы попросить начать разогревать ужин за пару километров до дома; разбудить в электричке при приближении к нужной станции или даже управлять настоящей ракетой — все это может быть реализовано при помощи SL4A c минимальным количеством кода и затраченного времени.

Для сравнения ниже показана простейшая программа на языке Java и Python (примеры взяты из из презентации PyCon 2011):
package com.spodon.pycon;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Toast;

public class Demo extends Activity {
    private EditText mEditText = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Hello!");
        builder.setMessage("What is your name?");
        mEditText = new EditText(this);
        builder.setView(mEditText);
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(Demo.this, "Cancelled", Toast.LENGTH_SHORT).show();
            }
        });
...

Та же программа на языке Python займет всего 4 (!) строки:
import android
droid = android.Android()
name = droid.getInput("Hello!", "What is your name?")
droid.makeToast("Hello, %s" % name.result)

Разница, как говорится, налицо. Конечно, не обойтись без недостатков. О них в конце статьи.

Основная часть


Установка SL4A на телефон

Итак, приступим к написанию самого приложения синхронизации.
Для использования SL4A необходимо установить на телефон приложение. Взять его можно отсюда или с баркода:
image

Непосредственно в приложении SL4A имеется только интерпретатор Shell. Для использования других языков программирования необходимо устанавливать дополнительные приложения. Интерпретатор языка Python находится здесь.

Настройка операционной системы для работы с SL4A

Для работы приложения синхронизации файлов на компьютере должен быть установлен ftp-сервер. Для Ubuntu есть приложение vsftpd, представляющее собой бесплатный и простой в настройке ftp-сервер. Для установки достаточно в терминале ввести команду:
sudo apt-get install vsftpd
Файл настроек сервера расположен в /etc/vsftpd.conf, в нем необходимо добавить разрешение на запись файлов, раскомментировав строчку
#write_enable=YES
И перезапустить сервер:
$sudo service vsftpd restart

Приложения SL4A можно создавать непосредственно на телефоне, но занятие набора кода на виртуальной клавиатуре крайне утомительно даже для небольших приложений, намного удобнее писать приложения на компьютере и потом закачивать их в телефон.
Для запуска приложений SL4A, написанных на компьютере, небходимо сначала запустить на телефоне SL4A-сервер (на главной странице SL4A-приложения нажать Menu — Interpreters — Menu — Start Server). Запускать будем приватный сервер. Появится уведомление, что сервер запущен, и там же будет написано, какой порт использует сервер.
image

Комментарий: Существует возможность выбора запуска публичного сервера. При запуске публичного сервера любой, кто будет иметь доступ к вашему IP-адресу, сможет контролировать ваш телефон. При запуске приватного сервера и установке переменных окружения так, как будет показано ниже, скрипты, запускаемые на компьютере, будут работать без изменений и на телефоне. Для работы приватного сервера необходимо, чтобы Android SDK был установлен.

Перенаправим весь локальный трафик, поступающий на порт 9999 в Android-устройство (примем, что сервер слушает порт 46136):
$ adb forward tcp:9999 tcp:46136
Осталось создать переменную окружения и настройка закончена:
$ AP_PORT=9999
Осталось добавить файл android.py в папку с библиотеками Python'а, и все, теперь можно писать приложения на компьютере, запускать их, и результат можно буждет видеть сразу на телефоне. Для запуска helloWorld на Android-устройстве теперь достаточно ввести в интерпретаторе Python:
>>>import android
>>>droid = android.Android()
>>>droid.makeToast("Hello, world!")

В первой строчке импортируется библиотека android, затем создается объект droid, с помощью которого используются API Android'a. Крайняя строка выводит сообщение «Hello, World!» на экран устройства.
Теперь самое время, чтобы познакомиться поближе с API, которое предоставляет SL4A.

Исходный код программы

Программа синхронизирует файлы в выбранных папках на Android-устройстве и компьютере в фоновом режиме. Проверка появления новых файлов происходит каждые 30 секунд. Большая часть программы практически не отличается от приложения для персонального компьютера с аналогичной функциональностью. Для наглядности когда обработка исключений опущена.

# -*- coding: utf-8 -*-
import ftplib
import time
import os

import android
droid = android.Android()

SERVER_IP = '192.168.0.101'
USER = 'user'
PASS = 'pass'
REMOTE_FOLDER = 'sync'
LOCAL_FOLDER = '/mnt/sdcard/sync' 

droid.makeToast("Started")

if not os.path.exists(LOCAL_FOLDER):
    os.makedirs(LOCAL_FOLDER)
    
while True:
    #соединяемся с сервером
    server = ftplib.FTP(SERVER_IP)
    server.login(USER, PASS)
    
    #делаем текущими папки для синхронизации
    server.cwd(REMOTE_FOLDER)
    os.chdir(LOCAL_FOLDER)
    
    #получаем список файлов с синхронизируемых папках
    remote_files = set(server.nlst())
    local_files = set(os.listdir(os.curdir))
    
    #загружаем недостающие файлы на хост
    for remote_file in remote_files - local_files:
        server.retrlines('RETR ' + remote_file, open(remote_file, 'w').write)
    
    #загружаем недостающие файлы на телефон    
    for local_file in local_files - remote_files:
        server.storbinary('STOR ' + local_file, open(local_file, 'r'))
    
    #закрываем соединение с сервером и ждем 30 секунд
    server.close()
    time.sleep(30)

С помощью уже известного droid.makeToast() на экран Android-устройства выводятся сообщения о ходе синхронизации.

Запуск приложения

После того, как редактирование скрипта закончено, его можно поместить в Android-устройство с помощью команды
$ adb push ftp_sync.py /sdcard/sl4a/scripts
Для запуска скрипта с компьютера удобно создать алиас, запускающий приложение на телефоне. Для этого в ~/.bashrc нужно добавить строку:
alias andrun='adb shell am start -a com.googlecode.android_scripting.action.LAUNCH_FOREGROUND_SCRIPT -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher -e com.googlecode.android_scripting.extra.SCRIPT_PATH'
Тогда сам скрипт можно будет запустить командой
andrun /mnt/sdcard/sl4a/scripts/ftp_sync.py

Распространение приложения

Распространение приложения с помощью barcode

Простым и оригинальным способом распространения небольших SL4A-приложений является передача их с помощью баркодов. Создать баркод с приложением можно, например, здесь (выбрать тип — текст, размер — L). Вот так выглядит наше приложение:
image

Для установки скрипта в Android устройство достаточно запустить SL4A-приложение, нажать menu — add — scan barcode.

Упаковка приложения в .apk-файл

Скрипты SL4A можно также упаковывать в обычные .apk-файлы. Для этого нужно скачать файл шаблона SL4A-проекта и импортировать его в eclipse. По непонятным причинам в проекте изначально отсутствует папка gen. Ее нужно создать вручную в корневом каталоге проекта. После этого в Windows — Preferences — Java — Build Path — Class Variables создаем переменную ANDROID_SDK, указывающую на папку, в которую был установлен Android SDK.

Далее в папке res/raw заменяем содержимое script.py содержимым нашей программы. Затем в меню нажимаем Project-Build, и если все прошло нормально, мы готовы к сборке приложения в .apk-файл. Идем в File — Export, выбираем Android — Export Android Application, далее выбираем наш проект.

Каждое Android-приложение должно быть подписано цифровой подписью. Если она не создавалась ранее, ее необходимо создать с помощью диалогового окна. Последнее диалоговое окно спросит, куда сохранить созданный .apk-файл. Устанавливаем приложение на телефон:
$ adb install ftp_sync.apk

image

Переименовать скрипт можно выделив в каталоге src com.dummy.fooforandroid и в меню Refactor нажав Rename. Имя должно содержать по крайней мере две точки. После этого необходимо изменить имя приложения в AndroidManifest.xml. Иконки приложения находятся в res/drawable. При желании их тоже можно изменить.
GUI-интерфейс для SL4A создается с помощью HTML-разметки и webView. Здесь показан пример создания такого интерфейса.

Заключение


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

Недостатки SL4A

  • SL4A находится пока только в стадии альфа-версии, сейчас имеется достаточно много багов
  • возможность создания GUI ограничена средствами webView (html-разметка) и стандартными диалоговыми окнами. Как подсказывает kAIST, начиная с версии r5 (пока неофициальной) появилась еще одна возможность создания GUI-интерфейса — FullScreenUI
  • производительность приложений, использующих SL4A существенно проигрывает приложениям, написанным на Java
  • ограниченное количество возможностей API

Ссылки

Проект Android-scripting code.google.comна code.google.com
Книга, посвященная SL4A и PythonPro Android Scripting with SL4A: Writing Android Native Apps Using Python
python for SL4A
Описание API
@kataloo
карма
7,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (9)

  • +1
    возможность создания GUI ограничена средствами webView (html-разметка) и стандартными диалоговыми окнами

    Неофициально (пока) поддерживается FullScreenUI. Вчера только тестил, layout'ы, виджеты, все работает.
    Хочу один интересный проект сделать.
    А есть ли возможность создания apk без зависимостей?
    • 0
      Нет. Я уже задавался этим вопросом, пробовал проектик. Без установленных апок SL4A не получится. Зависимая песочница вообщем.
  • 0
    За FullScreenUI спасибо, добавил в топик.
    Насколько мне известно, на данный момент такой возможности нет — т.е. если интепретатор Python не установлен, программа при первом запуске покажет диалоговое окно с предложением установить его.
    • 0
      Ну хоть так.
      Собираюсь писать клиент-серверное приложение (сервер на десктопе), распространять конечно таким образом будет не очень удобно, вернее не удобно будет для пользователей.
      Вся надежда на то что кто то сделает клиент нативный, разработка будет открытой, да и клиент будет достаточно «тупым», вся нагрузка и логика на сервере, который кстати тоже написан на питоне.
      Работающий полнофункциональный прототип приложения я написал за пол дня, учитывая время на изучение api python для android и вообще общих принципов работы.
  • 0
    Для запуска helloWorld на Android-устройстве теперь достаточно ввести в интерпретаторе Python:

    >>>import android


    Вы забыли написать, что сначала нужно заиметь этот android.py на локальном компьютере.

    А так — статья интересная, и хорошо, что она «из серии». Я вот когда-то на sl4a посмотрел (на семплы, что шли с ним), читнул, как он работает, сказал «фу, будим портать python native'но» и забыл. Такие статьи заставляет переосмыслить ситуацию прагматически: ну и что, что у него «в кишках» JSON по сокетам гоняется, зато можно реально быстро написать многие полезные утилиты.

    Что хотелось бы узнать — как делать apk без Eclipse, а то несколько большая и трудно автоматизируемая зависимость для такого дела ;-).
    • +1
      Не туда написал сначала.
      Точно. Когда задумывал написать статью, говорил себе, чтобы не забыть про android.py, но в процессе написания все равно вылетело из головы(
      Если не хочется работать с большим IDE, apk-файл можно создать с помощью Ant. Суть создания файла такая же. Как это делается освещается, например, в книге Пола Феррила Pro Android Scripting with SL4A. Полная версия книги легко гуглится.
  • 0
    Точно. Когда задумывал написать статью, говорил себе, чтобы не забыть про android.py, но в процессе написания все равно вылетело из головы.
    Если не хочется работать с большим IDE, apk-файл можно создать с помощью Ant. Суть создания файла такая же. Как это делается освещается, например, в книге Пола Феррила Pro Android Scripting with SL4A. Полная версия книги легко гуглится.
  • 0
    Спасибо.

    Теперь у меня нету отговорок чтобы не написать скрипт включающий wifi каждый час и синхронизующий все google сервисы.
    • 0
      так же android.py считывает переменную AP_HOST, по хорошему и про неё тоже было бы хорошо упомянуть :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.