Полноценное Python приложение на Android



    В этой статье я хотел бы рассказать о том, как создать полноценное приложение на Python для Android. Нет, это не очередной мануал для создания скрипта для sl4a, это мануал по созданию полноценного приложения с UI, возможностью собрать apk и выложить на Android Market. Заодно я хотел бы похвалиться своим первым приложением на google.play, это не hello world, а полезное приложение для фотографов, хотя и узко специализированное.

    Начну рассказ пожалуй с самого приложения и завершу рассказам о том как оно делалось.

    isortViewer


    Мне как фотографу приходится тратить много времени на сортировку и отбор фотографий. Не всегда хочется сидеть за рабочим компьютером, когда под рукой есть ноутбук, смартфон или планшет, но копировать туда десятки гигабайт raw или jpeg файлов, а потом синхронизировать с рабочим компьютером — сомнительное удовольствие. Именно поэтому я создал программы isortManager и isortViewer, которые значительно облегчили мне работу по сортировке и отбору фотографий. Теперь заниматься отбором и сортировкой фотографий я могу лежа на пляже диване или скучая в пробке :)

    Копипаст описания и пара скриншотов:
    isortViewer — программа для фотографов, которая позволяет легко и быстрой отбирать и сортировать тысячи фотографий (raw или jpg) с фотосессий на ваших android смартфонах и планшетах. При этом, нет необходимости копировать десятки гигабайт jpg или raw файлов на устройство. Просто воспользуйтесь бесплатной программой isortManager для компьютера, которая сохранит все в один небольшой файл проекта:
    1. Скачайте и запустите isortManager с официального сайта;
    2. Создайте проект и добавьте папки с фотографиями. Поддерживаются форматы: jpg и raw (cr2, nef, orf и т.д.). В итоге у вас получится небольшой файл проекта (примерно 150 мб на несколько тысяч фотографий, будь то jpg или raw формат);
    3. Скопируйте на ваше android устройство файл проекта, откройте в isortViewer. Вы можете помечать фотографии «на удаление», а так же, ставить рейтинги от 1 до 5 звезд;
    4. После этого, скопируйте файл проекта обратно и примените изменения в isortManager. Кроме удаления выбранных фотографий, вы можете копировать или перемещать отмеченные фотографии. Например, фотографии с «5 звезд» можно скопировать в папку «шедевры», а «1 звезда» переместить в папку «хлам».








    Приложение абсолютно бесплатно и доступно на google.play, однако донейты приветствуются.

    Исходники доступны на официальном сайте!

    Как это делалось



    Так как python лучший язык программирования в мире кроме python я ничего не знаю, решено было написать приложение на python.

    isortManager


    С isortManager для PC проблем не возникло, создание GUI сборки под windows уже давно обкатано и работает он очень просто: с помощью dcraw выдирает jpg превьюшки из raw файлов, ресайзит из с помощью PIL и складывает в один файл с достаточно простой структурой. Был изобретен свой весолипед с контейнером для хранения фотографий и метаданных (полный путь к фотографии, отметка «на удаление» и отметка рейтинга), так как, например, zip или tar формат, не могут изменять один файл в архиве (метаданные), требую перепаковки всех файлов. Файлы просто пишутся один за другим подряд и в блоке метаданных (обычный repr питоновского словаря) в конце сохраняется смещения начала файлов, плюс в конце файла пишется размер блока метаданных. GUI написано на Tkinter (люблю я его за быстроту написания и за малый размер итоговой сборки), вот собственно скриншот:



    И да, все это работает и на linux, и даже быстрее чем на windows )

    isortViewer для android


    Всего я нашел два способа заставить python приложение работать как полноценное приложение на android, это pygame for android и проект kivy.
    Pygame — более низкоуровневый, все UI пришлось бы рисовать вручную, что отняло бы много времени, поэтому был выбран фреймворк kivy. Итак:

    Kivy


    Это замечательный фрейморк для написания приложение для windows, linux, MacOS, android и iOS. Поддерживается мультитач, UI рисутется через OpenGL, значит должно работать аппаратное ускорение. Увидеть работу виджетов можно установив демонстрационное приложение Kivy Showcase. Есть возможность использования некоторых платформо специфичных функций, например, вибро или акселерометр, с помощью модуля android.

    Для разработки я бы рекомендовал использовать linux, тем более, apk собираются именно в этой OS.

    Hello World выглядит так:

    import kivy
    kivy.require('1.0.6') # replace with your current kivy version !
    
    from kivy.app import App
    from kivy.uix.button import Button
    
    class MyApp(App):
        def build(self):
            return Button(text='Hello World')
    
    if __name__ == '__main__':
        MyApp().run()


    Причем этот код будет работать на всех заявленных платформах. Пропадает необходимость в тестировании приложения в эмуляторе. Достаточно запустить скрипт на исполнение в своей любимой IDE и увидеть результат на экране компьютера, без задержек на компиляцию, запуск эмулятора и пр. Если вы все же хотите увидеть как это будет выглядеть непосредственно на устройстве, просто установите Kivy Launcher, скопируйте файлы проекта на карту памяти и запустите. Дебажить при этом можно при помощи adb logcat.
    Если вы используете библиотеку android, которой нет на PC, но хочется запускать приложение не только на android, воспользуйте такой конструкцией:
    try:
        import android
    except ImportError:
        android=None
    ...
    if android:
        android.vibrate(0.05)
    
    


    Сборка apk достаточно проста и описана на этой странице. После сборки релиза, достаточно подписать свое приложение (я использовал этот мануал) и выложить в google play.

    Плюсы kivy:
    • Быстрая разработка под различные платформы, практически без доработки кода.
    • Доступен широкий выбор виджетов
    • Высокая скорость работы. Весь ресурсоемкий вынесен в С модули. Сам интерпретатор python на android работает нативно.
    • Фремворк включает в себя множество инструментов, например анимация, кеширование и пр.
    • upd: Доступ к камере, буферу обмена, микрофону. Написать свой видеоплеер можно буквально за 20 строк.


    Минусы kivy:
    • Большой размер apk файла. Проект с 300 кб ресурсов (скрипты, графика) собирается в 7 мб apk. Хотя, думаю, есть возможность это как то оптимизировать.
    • Невозможность (пока), восстанавливать работу после сворачивания — приложение закрывается


    В следующей своей статье, я расскажу более подробно о процессе написания приложения «с нуля», расжевывая каждую строчку кода.

    Хотелось бы сразу пресечь холивары на тему «для android только java, python не нужен». Я считаю, не важно, какие технологии «под капотом», главное чтоб приложение было качественным.
    Сфера применения kivy может быть огромной. Сейчас на моем счету несколько приложений, написанных под заказ, где python с фремворком kivy показал себя с хорошей стороны. Например, ровно за один час, было написано приложение, для сети сервисных центров. Приложение работает в режиме киоска и установлено на дешевые китайские планшеты, которые висят в холле. Клиент набирает номер заказа, далее по WiFi планшет соединяется с сервером и сообщает статус заказа.
    Поделиться публикацией

    Комментарии 45

      +2
      Полезная вещь:)
      Не думали прикрутить поддержку Lightroom?
        0
        Думал, но как то лень было разбираться с форматом их каталога ) Тем более, пришлось бы сначала импортировать фотографии в лайтрум, потом импортировать этот каталог в isortManager, потом обратно. Напрямую — не очень хорошая идея, так как придется копировать на устройство тысячи файлов каталога.
          +1
          Прикрутил поддержку экспорта в xmp, теперь лайтрум при импорте подхватывает рейтинги.
          0
          Получилось неплохо. Но есть вопрос — все необходимые библиотеки в apk помещены или что-то необходимо залить на устройство до установки apk?
            0
            похоже все в apk, иначе в Google Play бы не пропустили.
              0
              Если так, то вообще отлично. Жду следующей статьи с описанием процесса сборки
                0
                Сборка очень проста
                Можно почитать об этом здесь или здесь
                0
                Да да, все в apk, включая python runtime.
                При необходимости можно использовать еще кое какие библиотека, хотя с sqlite3 у меня, например, ничего не вышло.
                Полный список здесь github.com/kivy/python-for-android/tree/master/recipes
              –2
              Боюсь, прямая ссылка на веб-сайт с кучей веб-кошельков + просьбы доната чреваты «Автор переместил свой пост в черновики»…

              А вообще, очень бы не помешали хотя бы скрины, как рисуется GUI, внешний вид IDE (кстати, какой?), простейший пример точки входа (аналога onCreate в Android Java).
                +2
                А что плохого что на официальном сайте программы, распространяющейся с открытыми исходниками есть возможность отправить донейт проекту?
                Простейший пример «точки входа», я привел в топике ( пример Hello World).
                IDE любая, вплоть до блокнота, так как мы пишем обычный питон скрипт, и запускаем обычным для питона способом.
                  +2
                  Простейший пример «точки входа», я привел в топике ( пример Hello World).
                  IDE любая, вплоть до блокнота, так как мы пишем обычный питон скрипт, и запускаем обычным для питона способом.


                  визуально код Hello World совсем не похож на то, что делается под Android, значит ничего платформо-зависимого в этом фреймворке нет? Т.е. мы не знаем об Activity, Intent и пр?
                  В блокноте как-то не удобно рисовать GUI, а в статье сказано, что kivy был выбран из-за удобства создания GUI. В чем же все рисовалось? Покажите процесс разработки хотябы…
                    0
                    Да, платформозависимого в этом фреймворке нет. Кое что по мелочи есть в модуле android
                    В этом есть своя прелесть, так как один и тот же код можно запустить на разных платформах, без доработок.
                    GUI билдеров нет, то есть нет возможности рисовать UI приложения, все делается «ручками». Прямо в коде, либо используя специальный kivy language. Все достаточно просто.
                      0
                      А вот то, что GUI делается ручками, печально.
                +1
                Давно присматриваюсь к этой библиотеке, но все-таки 7 мегабайт за простенькое приложение это много. Но это и понятно, оно по-идее полностью весь Python с библиотеками копирует в приложение. Если выпилить лишние библиотеки из самого Python то оно их и не запакует в приложение.
                  0
                  Да, размер это минус, но для специфичных приложений в отличии от сто первого калькулятора для android, думаю пользователям не так критичен размер.
                    +2
                    Когда на телефоне мало внутренней памяти для приложений это очень критично. Как вспомню, как боролся за каждый мегабайт на своем HTC Legend… Но с Вами согласен, если приложение полезное, то занимаемые мегабайты не совсем мешают.
                      0
                      7МБ — цветочки. Мне Titanium Appcelerator когда-то выдал Hello World на 12 Мб без возможности вынести на SD. Возможно, конечно, сейчас что-то и изменилось, но тогда такой объем меня сильно опечалил.
                      Идеальной, с моей точки зрения, видится возможность устанавливать рантайм отдельно, как это сделано для AIR приложений. Экономия дискового пространства, при наличии нескольких приложений на одной платформе, в таком случае значительная.
                        0
                        Так можно было делать на symbian, причем при попытке установить приложение на python без установленного runtime, предлагалось скачать его из нокиевского «репозитария».
                          +2
                          Для важного корпоративного софта отдельный рантайм для платформы еще понятно, но попробуй простому юзеру объяснить что ему надо ставить одно приложение чтобы работало другое :) Все-таки правильнее паковать нужные ресурсы внутрь приложения, пока окружение не популярно. Когда на телефоне хотя бы каждое 10е приложение будет написано на Python — вот тогда одна общая среда будет оправдана.
                            0
                            можно ведь сделать два apk — один полный (7МБ), второй маленький со ссылкой на рантайм (или для тех кто уже установил RTM). Кстати если приложению все равно нужен интернет, то рантайм можно зделать загружаемым при первом запуске проверять наличие и если нет — что-то типа: для корректной работы нужен питон… загружаю… взлет!).
                      0
                      Подскажите дураку где можно узнать побольше о выпиливании лишних модулей из python?
                        0
                        Когда сделаете ./distribute.sh, загляните в папку dist, там есть файл blacklist.txt, там будет список модулей, который не нужно включать в проект, а дальше уже методом научного тыка )
                          0
                          а хотя бы примерное дерево зависимостей для модулей питона есть в природе?
                            0
                            Вопрос интересный, но я не думаю что это даст большой выигрыш, так как основной размер, это не pure python модули, сишные расширения и сам интерпретатор, которые жизненно необходимы, и даже unicodedata.pyd, который я обычно выкидываю из виндовых сборок, используется в kivy.
                            Я смотрел бы немного в другую сторону:
                            В windows я в два раза уменьшаю размер дистрибутива, прогоняя pyd и dll файлы через upx (python27.dll из 2.5 мб превращается в 800 кб), но для платформы arm я не нашел подобного (
                              0
                              *а сишные модули
                            0
                            dirануть рабочий проект и поудалять что не надо религия не позволяет?
                              0
                              Эммм… А вот что именно не нужно как выяснять?
                        0
                        Увидеть работу виджетов можно установив демонстрационное приложение Kivy Showcase.


                        Размер Kivy Showcase 4.6M, что как бы < 7M.
                        Видимо они предприняли ряд мер по сокращению размера. Анализ?
                          0
                          Да, кстати, плюс еще пару демонстрашек имеют размер такой же, надо будет посмотреть в чем различия.
                        0
                        Забыл упомянуть о доступе к камере, микрофону, акселерометру.
                        Свой видеоплеер можно написать буквально за 20 строк github.com/kivy/kivy/blob/master/examples/widgets/videoplayer.py
                        Добавить еще пару строк для диалога выбора файла…
                          +1
                          Если Kivy такой кросс-платформенный, почему вы не сделали заодно десктопный компонент на нём?
                            0
                            Так уж сложилось ) Сначала написал isortManager и isortViewer для PC на Tkinter, который я знаю практически идеально (много проектов писал на нем), а потом можно сказать портировал isortViewer на android, взяв около 70% кода с PC-шной версии.
                              0
                              Вот интересен был бы обзор GUI на Tkinter, wxPython, PyQt (PySide) и PyGTK. Боюсь получится холивар, правда.
                              Tkinter хорош тем, что он почти нативный в Python, а wxPython делает GUI нативными для каждой платформы, что как бы не пугает пользователя. Qt — эмулирует все GUI чтобы они были похожи на нативные и вообще он монстраидален тут.

                              В описание к Tkinter сказано что используя темы можно добиться изображения GUI близкого к платформе, как с этим дело обстоит? Старые tk виджеты как бы могут легко распугать виндовз пользователей (IMHO).
                                0
                                Нет нет, Tkinter это вообще обертка над Tcl/Tk и в сборке приходится таскать интерпретатор этого языка с собой, хотя размер получается меньше чем с другими тулкитами.
                                Насчет внешнего вида — посмотрите на скриншот виндового приложения в топике — выглядит вполне нативно, да и темы виндовые подхватываются. Начиная с python 2.6 в комплекте идет tile, который как раз таки заботится об этом.
                                Вот с linux беда — мне никак не удалось заставить Tkinter выглядеть не убого.
                                Другими GUI тулкитами не пользовался, на 100% хватало ткинтер, делал более сложные GUI на нем.
                            0
                            Кстати, приложение на pygame тоже будет весить около 7MB, ведь также надо с собой интерпретатор python носить и все необходимые либы?
                              0
                              Нет, раза в два меньше. У меня есть одно приложение сделанное с помощью pygame (все руки не доходят закончить), оно занимает 3.6 мб.
                              Дело в том что kivy сам по себе использует pygame, плюс еще кучу разного. За простоту разработки и за мощные «батарейки» приходиться платить размером. Выше уже писал, что, например, реализация видеоплеера займет 20 строк.
                              0
                              Реально ли реализовать UI рекомендации?
                                0
                                Посмотрите как выглядит все это «на деле», установите UI демонстрашку play.google.com/store/apps/details?id=org.kivy.showcase
                                  0
                                  Да я смотрел, значит нельзя. Это еще один минус.
                                0
                                чет на официального сайте я не нашел исходников ((( можете дать линк на них?
                                    0
                                    а я вот сам не догадался ))

                                    Not Found

                                    The requested URL /static/isort_source.zip was not found on this server.
                                      0
                                      Сорри, забыл файлик кинуть. Сейчас все нормально.

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

                                Самое читаемое