Дневник одной разработки, или Xamarin как он есть

Хотелось бы поделиться первым опытом разработки на Xamarin. До этого мной не было написано ни одного приложения для мобильных устройств, тем не менее, как оказалось, с Xamarin можно достаточно легко и быстро написать приложение. Разработка велась в основном по вечерам и, периодически, на выходных, поэтому, не смотря на то, что дней в дневнике много, фактически было затрачено небольшое количество часов.

Итак, дневник…


День 1


Выходные прошли приятно, интересно, но, к сожалению, абсолютно бесполезно. Смакуя горечь утраты времени, грущу.

День 2


Решил, что что-то нужно менять. Нет, правда, сколько можно бесцельно проживать жизнь? Думал на тему того, что может мне помочь. Ничего не придумал. Загрустил. Поел печенек. Отпустило.

День 3


Собрав волю в кулак, мыл посуду. В сознании начала вырисовываться идея некоторого приложения, в котором можно как-то учитывать свои действия. Например, помыл посуду — +1 очко к мытью. Потягал гантели – +1 к… спорту. Погуглил. Не нашел ничего нормального. Загрустил.

День 4


Вновь собрав волю в кулак, решил сам написать приложение для Android. Ну а что, там дел-то совсем немного. Вверху шапка с общим прогрессом, под ней список с навыками. По клику увеличиваем навык на +1. Впереди 3 дня праздников, быстренько сделаю на Xamarin-е.

День 7


За день тоже можно успеть. Наверное.

День 8


Ну… Я что-то не подумал, что не знаю Xamarin. Как-то привык, что обычно в программировании встает вопрос «Зачем?», а вопрос «Как?» в последнее время всплывает редко и остается между строк. Нет, не то чтобы вообще ничего не получилось. Начал писать на Xamarin.Forms, позиционировать элементы научился, шапку сделал… Но, кажется, так быстро как планировал написать не получится. Загрустил. Поел печенек. Отпустило.

День 9


Сделал список навыков через ListView. Возможно, все не так уж плохо и к концу недели доделаю.

День 11


Не, как так-то? Ну почему ListView такой тормознутый? Cashing Strategy менял, layout менял, все равно остался раздражающий лаг. Переделал на TableView. Стало лучше. Обрадовался. Поел печенек.

День 12


Решал вопрос с хранением списка навыков. Простят меня боги, но я решил сохранять их все вместе в одном параметре в конфиге. Да, при любом изменении навыка мне приходится перезаписывать все навыки. Да, так не делается. Да, боль от содеянного пронзает мне душу.

День 13


Сделал добавление и удаление навыков в интерфейсе. Сделал анимацию. Анимация выкидывает ошибку. Грущу.

День 14


Осознал, что ошибку выкидывает двойное использование анимации при быстром нажатии кнопок. Т.е., скажем, вот так работает:

await grid.RotateYTo(grid.RotationY + rotation, 125);
longTapGrid.IsVisible = true;

А вот так уже нет:

await grid.RotateYTo(grid.RotationY + rotation, 125);
longTapGrid.IsVisible = true;
await grid.RotateYTo(grid.RotationY + rotation, 125);

Долго совещался с гуглом. Он рекомендовал мне использовать примитивы синхронизации. Что-то не задалось. То ли работают примитивы, то ли нет, я так до конца не уверен. Оставил, на всякий случай, но проблему это не решило.

Обратился к духам. Они велели сделать так и не задавать вопросов:

await grid.RotateYTo(grid.RotationY + rotation, 125);
longTapGrid.IsVisible = true;
await Task.Run(async () => await grid.RotateYTo(grid.RotationY + rotation, 125));

Что тут сказать… 1:0 в пользу духов.

День 15


Исправлял ошибки. Примирился с практически полным отсутствием описания ошибки и стека исключения и привык использовать Device Log.

День 16


Исправлял ошибки, порожденные предыдущим исправлением ошибок.

День 17


Радовался, что почти все готово и ел печеньки.

День 18


Поиграл с приложением и понял, что не хватает статистики. Просто чудовищно не хватает. Расстроился. Начал делать статистику, заодно подключив SQLLite и избавившись от терзавший мою душу боли касательно хранения навыков в конфиге.

День 19


Для Xamarin есть компоненты, которые позволяют рисовать шикарные графики. Колонки с chartjunk, круговые диаграммы такой красоты, что начинают слезиться глаза. Правда, они немного платные, где-то от 300-400$. Смахивая скупую слезу, подключил бесплатный Oxyplot к проекту. Потом отключил. Потом снова подключил. Вариантов особо нет.

День 21


В принципе, практически все готово. Наводил лоск, ел печеньки, и думал, что делать дальше.

День 22


Сегодня был черный день. Дождь ледяными струями бил в землю, ветер рвал деревья, поднимал воду с асфальта и бросал ее в прохожих, а я решил добавить в приложение рекламу и залить в google play.

Все рухнуло. Но, пожалуй, начну по порядку.

Итак, погуглив, как делается реклама, я добавил Xamarin.GooglePlayService.Ads к проекту. После этого у меня что-то случилось с References в проекте. То ли что-то криво добавилось, то ли что-то еще произошло, но некоторые ссылки стали неразрешимы… В общем, посмотрев на это, я сделал ошибку. Решил обновить все компоненты в проекте, в надежде на то, что ссылки исправятся. Не делайте так.

Что было дальше, помню смутно. Помню, сломался Nuget и перестал удалять/изменять компоненты, а на все мои действия выдал неизменно выводящую меня из себя ошибку «This collection is read-only».
Ну кто так делает? Вот о чем он? Какая коллекция read-only? Больше всего раздражало слово «This». Оно словно намекало на то, что всем должно быть понятно, что именно за коллекция. На втором месте по раздражительности был тот факт, что не было указано ни место ошибки, ни какой-либо код ошибки. В привычном месте, где должна быть эта информация, было пусто.

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

После этого было еще много ошибок. Например, «java.lang.outofmemory» (решилось увеличением heapsize), или «java.exe exited with code 2» (решилось удалением Xamarin.GooglePlayService.Ads, при этом Xamarin.GooglePlayService.Ads.Lite остался), или Proguard начинал в качестве ошибки выдавать кракозябры (решилось переносом sdk в корень диска, чтобы путь к нему не содержал пробелов). Так же были совсем странные ошибки, связанные с обновлением компонентов до последней версии.
Так или иначе, к вечеру все исправил и вернулся к тому, с чего начинался день.

День 23


Добавил рекламу и протестировал релизную сборку. Никаких проблем. Вот и что это вчера было?

День 24


Заливал в Google Play. Долго философски размышлял, является ли приложение игрой или нет. Очень хотелось, чтобы было игрой, но, пожалуй, это не так. Скрипя сердцем, поставил категорию «Стиль жизни», обрекая приложение на безызвестность. Впрочем, не в скачиваниях счастье… Хотя, надо признать, они бы потешили мое самолюбие. Главное – полученный опыт разработки на Xamarine… Ну и, разумеется, само приложение, я надеюсь, так же будет небесполезно мне.

День 32, или Заключение


Прошло немного больше недели после публикации приложения. Около 40 человек его скачало. Немного больше половины его даже пока что не удалило. Сам я тоже, как ни странно, пользуюсь приложением.

Первые дней 5 скачиваний не было. Это несколько демотивирует и огорчает, и даже печеньки не спасают.

Да, я делал приложение в основном для себя. Да, это мой первый проект на Xamarin, в котором я познакомился с платформой. Да, не было цели получить огромное количество скачиваний или заработать какие-либо деньги. Но, черт возьми, печально, когда результат твоей работы не находит никакого отклика. И наоборот, мысль о том, что кто-то еще пользуется приложением, или что еще хоть кому-то оно нужно, приятно греет душу.

Даже если это всего лишь двадцать человек. Даже если это будет всего один человек.

P.S. Не гарантирую, что все было точно как описывается. На самом деле, я не люблю печеньки.
P.P.S. Ну да, кроме печенек, все так и было.
Метки:
Поделиться публикацией
Комментарии 11
  • 0
    Хотел тоже недавно написать прилагу на Xamarin, но безуспешные пляски с бубном вокруг эмуляторов и собственно настройки окружения отбили желание. Надеюсь вернуться к реализации идеи в будущем. Не расскажете, как у вас прошла установка и первый запуск приложения?
    • 0
      В VS2017 все более-менее хорошо было. Создал новое приложение, начал запускать эмулятор… Оказалось, нужно поставить HAXM, чтобы эмулятор работал шустро. После того, как установил его и включил в BIOS флаг, все заработало.
      • 0
        Устанавливаете Visual Studio Emulator for Android, включаете Hyper-V и все летает. Использую давно, жалоб нет.
      • 0
        День 15
        Исправлял ошибки. Примирился с практически полным отсутствием описания ошибки и стека исключения и привык использовать Device Log.

        Подскажите, пожалуйста, по поводу LogCat, кто знает. Встроенный в VS какой-то абсолютно бесполезный, как вывести лог только текущего приложения — непонятно. Есть фильтр по pid, но его бы еще узнать. Ну и плюс Xamarin шлет кучу своих служебных логов, в которых фиг что разберешь.

        • 0

          Logcat я использовал, в чем с ним проблемы?

          • 0

            PID — идентификатор процесса, можно узнать и из Output:


            Т.к. для получения логов, для Android, в основе лежит утилита logcat, то UI для удобного отогбражения логов можно использовать любой: Device Log, консольный вызов, Android Device Monitor (вызвав из студии Tools > Android > Android Device Monitor), и даже Android Studio.


            Device Log из студии более универсален, т.к. используется для Android и iOS, а параметры фильтрации и поиска позволяют настроить показ логов как вам нужно.

          • 0
            А ещё можно было бы попробовать написать на React Native. Управились бы быстрее, мне кажется.
            • 0
              А как приложение-то называется?
              • 0
                «Мои навыки: контроль времени»
              • 0
                Черт, ну страшный вид FloatActionButton — мне кажется, что используя дефолтные шаблоны Android Studio — получилось бы быстрей (не за три недели), легче (25Мб для нескольких списков) и аккуратней — Material темы уже идут по умолчанию.
                • 0
                  Вряд ли получилось бы быстрей, поскольку на C# у меня есть несколько лет опыта, а на Java его почти нет. Ну и 3 недели по 2-3 часа (в среднем)… Мне не кажется, что это много, чтобы написать приложение от начала до конца на незнакомом инструменте.
                  А что не так-то с FloatActionButton?) Вроде как везде выглядит…

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