Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.
Чогьям Трунгпа РИНПОЧЕ


Версия для мобильного


воскресенье, 29 декабря 2013 г.

Delphi XE5: впечатления от разработки под Android

Отправил свою программу на конкурс. Саму программу показывать пока не хочу. А хочу поделиться своими впечатлениями от использования Delphi XE5 и Firemonkey.

 

Сразу оговорюсь

  • Это мой первый проект на Firemonkey и первый опыт разработки для Android.
  • Я использовал Delphi XE5 + Update 1 + все хотфиксы для Update 1.
  • Тестировал только на телефоне GSmart Aku A1 (480 x 854 pixels, 4.5 inches (~218 ppi). Эмуляторы не использовал.
  • Часто компилировал и запускал на Win32 в режиме Mobile Preview (об этом ниже).
  • В этом проекте решил опробовать подход "как-мне-кажется-это-делают-в-java", когда и для каждого класса создавал отдельный .pas файл. В результате получилась куча юнитов и чтобы в них не запутаться пришлось раскидать их по папкам и пространствам имён. Получилось в принципе удобно. Хотя есть у меня подозрение, что сборка проекта под Android из-за этого работал медленнее, чем в случае, если бы весь код был запихан в один .pas файл.

Грабли

Deployment manager и папки

Deployment manager и папки. С этим тоже пришлось повозиться прежде чем удалось понять какие надо указывать пути в Deployment manager и как потом найти эти файлы в программе. Пришлось провести небольшое исследование. О нём напишу позже, в отдельном посте. Вот только так и не понял, как же из приложения определить путь до корня SdCard. Также не понравился UI в Deployment manager-e. Редактирование пары десятков файлов сделано не очень удобно, хотя к слову сказать просто добавить пачку файлов довольно легко.

Сразу уточню, что я хотел недокументированного. Искал легкий способ добавления/редактирования файлов в Deployment manager из консоли. Не получилось, так файлы добавленные через Deployment manager поначалу сохраняются в .dproj файле, хотя в папке проекта и присутствует отдельный файл .deployproj. И я так и не понял в какой момент файлы переносятся из .dproj в .deployproj файл. Вот кстати наткнулся на пост о похожем исследовании от Павла Алхимова “DeployFolder - Развёртывание мобильного подкаталога”.

TLang

Я писал все тексты на английском, решив позднее воспользоваться TLang для перевода на русский.

Ох уж этот TLang. Поначалу он находил только ресурсы с главной формы. Позже согласился собрать ресурсы из всех открытых в IDE форм. При этом упорно игнорировал ресурсы указанные в ListBoxItem.ItemData.Detail. Потом выяснилось что редактор перево��ов TLang умеет и любит перемешивать переводы некоторых слов. Особенно, если дело касается слов для которых перевод не указан. Я так и отправил на конкурс работу в которой слово Home было переведено как Сова (не уследил). Еще добавление TLang в проект, вызывало стабильные загадочные AV в программе запущенной под Win32 при открытии формы с TabControl (лечится выключением у таб-ов свойства Autotrnslate) – но это кажется было исправлено в Update 2.

Запись звука

По умолчанию (при использовании TAudioCaptureDevice) на Android платформе Delphi записывает звук в качестве ARM 8kbps (и судя по упоминаниям в интернете это кстати единственный работающий кодек для записи звука в эмуляторе).

И при использовании TAudioCaptureDevice нет никакого способа указать другой кодек или битрейт. К счастью, в исходниках присутствует класс JMediaRecorder который это умеет. Тут правда, тоже пришлось немного повозиться прежде чем удалось подобрать работающие (на моём устройстве) значения дающие звук хорошего качества. Об этом позже расскажу отдельно.

Мультитач

Пичалька. Его нет. Точнее, я его не нашёл. Удалось найти только в виде ограниченного числа жестов. Впрочем, судя по исходникам реализации интерактивных жестов (FMX.Android.*), основа для мультитача реализована, и вероятно его как-то можно вытащить наружу.

Жесты

Насколько я понял, обработчик событий для жестов срабатывает только по окончании жеста. Включить свою анимацию в момент выполнения жеста Swipe Left/Right у меня не получилось. Но пока не теряю надежды.

IDE

Очень не хватало в дизайнере поддержки горячих клавиш Ctrl/Shift+стрелки. В Update 2 эта недоработка исправлена.

Редакторы свойств по сравнению с VCL мне показались неудобными. Хотя, возможно я слишком привык пользоваться расширенными редакторами которые устанавливаются вместе с CnWizards.

Жаль что линковка и deploy не умеют работать в фоне. Точнее я не нашёл как это сделать.

19" монитора становится маловато для удобной работы.

CnWizards

Из-за CnWizards, F2 не работает в Project Manager.

Автодополнение текста в Code Input Helper некорректно обрабатывает модули содержащие в названии точку (т.е. все в моём проекте).

Фреймы, формы и стили

Вдохновившись работой Николая Зверева решил заюзать в проекте фреймы. И тут же напоролся на то, что список стилей (свойство StyleLookup) для контролов на фреймах и на FMX mobile формах отличается. Зарегистрировал баг в QC.

А вот использование форм не понравилось, ибо я так и не нашёл способа при открытии сделать анимированный слайд при открытии другой формы.

Работа со стилями

Я постоянно запускал FMX Mobile проект на Win32 и меня ужасно раздражал тот факт, что встроенные иконки для SpeedButton-ов игнорируются при запуске на win32, хотя и видны в дизайнере и при запуске на устройстве. В конце концов я полностью переключился на свои иконки.

Но честно говоря я поленился разбираться о том как правильно работать со стилями. Возможно есть более правильный способ.

Отладка и занятый порт

Поначалу, при отладке на телефоне немало нервов попортила ошибка "Unable to start gdbserver on port '64311'. Port is already in use". Это известная в интернете проблема у меня проявлялась после сброса (Ctrl+F2) отлаживаемого проекта. Лечится либо перезагрузкой телефона и IDE, либо установкой другого порта:

IDE -> Run –> Parameters –> -debugport=54321

С другой стороны, благодаря этой проблеме получилось сделать шаг вперёд и чаще думать, вместо привычного подхода debugger driven developement. Кстати отладчик для Android работает непривычно по-другому (Ctrl+F7 например).

Punto Switcher и Delphi XE5

Punto Switcher и Delphi XE5 отказались дружить на моём компьютере. Когда запущен Punto, то при закрытии моей программы, Delphi всегда вываливался в отладчик с exception-ом. Судя по стеку вызовов, какой-то конфликт с хуками Punto.

Вторая беда с Punto - при закрытии проектов в IDE (Close all) и повторном открытии IDE полностью закрывалась. Даже несмотря на добавление Delphi в список исключений Punto и включенную галочку "Не взаимодействовать с программами исключениями". Но стоило полностью выгрузить Punto из памяти - как эти проблемы пропадали. Грешу на некорректную реализацию хуков в Punto Switcher (64-bit).

 

Понравилось

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

Record helper-ы для простых типов очень радуют.

Delphi наконец перестал удалять IFDEF-ы из .dpr файла при добавлении нового модуля.

Демки и примеры (snippets) очень хорошо показывают как сделать что-то одно. Очень помогли.

Анимации и методы типа FloatAnimation очень-очень-очень упрощают жизнь.

Action-ы + существенно упрощают жизнь, особенно при работе с жестами.

Понравилась работа с камерой. Я опасался, что придётся повозиться с настройками. Совершенно напрасно. Программировать вообще не пришлось. Получить снимок с камеры или из галереи проще простого - для этого есть готовые action-ы.

А есть еще Live Bindings, которые я полностью проигнорировал, потому как толком не понимаю как их использовать.

 

Резюмируя

Общие впечатления очень приятные. Делать программу – очень просто. Даже не верится.

Firemonkey выглядит более чем работоспособным. Какие-то шероховатости еще есть, но их существенно меньше чем в предыдущих версиях (впрочем, я конечно не копал глубоко). Мне даже захотелось себе Mac и устройство на iOs, чтобы попробовать себя в разработке для совершенно новой платформы. Хотя, цены на яблочную продукцию поумерили мой пыл.

8 комментариев:

  1. Отличная статейка, будем ждать следующих публикаций.

    ОтветитьУдалить
  2. Я сейчас тоже думаю как сделать свайп влево/вправо. Думаю стоит привлечь событияOnMouseDown, OnMouseMove и OnMouseUp, что бы можно было двигать элементы управления. если найдете решение-напишите статейку в блоге, думаю не только мне будет интересно

    ОтветитьУдалить
    Ответы
    1. Embarcadero для свайпа страниц предлагает использовать TabControl с добавленными Action-ами. См. стандартную демку (не помню название =)).
      Вообще поддержка свайпа уже реализована на уровне жестов. Поэтому свайп легко сделать на уровне обработчика событий, который правда выстреливает уже после того как жест завершился.
      А если делать свайп вручную, то можно использовать готовую анимацию (slide кажется).

      Удалить
  3. Обнаружил страшную "особенность" http://qc.embarcadero.com/wc/qcmain.aspx?d=121702,
    делающую ,бессмысленной всю дальнейшую работу на Delphi XE5 (update 2) по направлению Android.
    Повторяемость "особенности" -100%, в том числе на разных устройствах.
    Вы не встречались с этим ? Если нет - попробуйте. Проявляется в любой программе,
    написанной на Delphi XE5, в том числе и на демонстрационных примерах.

    К сожалению всё более чем серьезно, поскольку "простые" (небольшие по размеру,
    напрмер, без SQLite+FireDAC) только "мигают". Противно, но не страшно.
    А что-то более серьезное с SQLite... просто тупо виснет. И я не могу объяснить
    пользователям, что это не моё, что это особенность, что если перед запуском
    "очистить память", то запустится точно. Таким образом в настоящий момент Delphi XE5
    не позволяет разрабатывать приложения, которые можно распространять. Тесты
    писать можно, поиграться можно, но что-либо серьезное делать нельзя. По крайней мере пока.

    ОтветитьУдалить
    Ответы
    1. Там в комсентах к отчёту на QC Ярослав Бровин сообщил что сумел воспроизвести баг. Так, что есть вероятность что баг будет исправлен - лучше конечно спросить самого Ярослава.
      Мне на моём телефоне такого воспроизвести не удалось.

      Удалить
    2. А какой телефон у вас ? Мы воспроизводили на SGS2 c 2.3 и 4.1, HTC One S 4.1. Интересно, что так же ведут себя и совсем "легкие" приложения, которые без Forms, типа http://cc.embarcadero.com/Item/29682

      Удалить
    3. У меня GSmart Aku A1. Версия Android 4.2.1. Наверно поэтому и не удалось.
      И еще, у меня под рукой нет отладочного билда. И я пытался воспроизвести на Release версии. И вам кстати тоже посоветовал бы, проверить повторяемость бага при установки release сбокри (без gdbserver), а то мало ли.

      Удалить
    4. SGS4, release сборка - не воспроизводится.

      Удалить

Постоянные читатели