Mono и Windows Forms на Nokia N900? Да не вопрос!

    Я был несколько удивлён, не увидев mono в репозиториях для этого замечательного устройства. Но, поскольку оно было позарез нужно, решил всё-таки собрать. И тут же напоролся на весьма забавную особенность маэмовского SDK, которая этого сделать мне не позволила. Но обо всём по-порядку. А пока что небольшой скрин того, что получилось:
    image

    Вместо нормального эмулятора устройства и тулчейна для сборки, ребята из нокии приспособили под это дело scratchbox, который, эксплуатируя qemu-user, запускает arm-ные бинарники прямо на ядре текущей ОС. И всё бы замечательно, если бы оно работало как надо. На деле же во время сборки qemu выдаёт «unsupported syscall 242», после чего сборка стопорится. Обычным кросскомпилером тут что-либо сделать сложно, ибо mono в лучших традициях процедуры bootstrap (поднятие самого себя за шнурки ботинок) компилит сначала свой компилер и уже с его участием дособирает всё остальное. Как с этим бороться, не особо понятно, если только компилить на девайсе, но там это займёт годы. Для N800 mono какой-то герой таки смог собрать, но работать на n900 оно отказалось, вываливаясь с SIGSEGV. Если кому-то интересно, как сия проблема была решена, или же самостоятельно пощупать моно на устройстве (можно прямо в Visual Studio писать, если что) прошу под кат.


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

    Блин первый. Компилим на девайсе.


    1. Приводим /etc/apt/sources.list в следующий вид:
      deb http_s_://downloads.maemo.nokia.com/fremantle/ssu/apps/ ./
      deb http_s_://downloads.maemo.nokia.com/fremantle/ssu/002 ./
      deb http_s_://downloads.maemo.nokia.com/fremantle1.2/ovi/ ./

      deb http_://repository.maemo.org/extras/ fremantle-1.3 free non-free
      deb http_://repository.maemo.org/extras-testing/ fremantle-1.3 free non-free
      deb http_://repository.maemo.org/extras-devel/ fremantle-1.3 free non-free

      deb http_://repository.maemo.org/ fremantle/sdk free non-free
      deb http_://repository.maemo.org/ fremantle/tools free non-free
      _ из ссылок убираем, он там по той простой причине, что парсер — лох, и не понимает даже тега code.
    2. Ставим build-essential, bison, gettext, m4
    3. ./configure && make && make install
    4. Осознаём, что процесс займёт десятилетия и ищем иные пути


    Блин второй. Компилим на эмуляторе.


    Для начала нам потребуется вытащить саму необрезанную rootfs. Тут есть 2 пути. Во-первых вы можете распаковать прошивку флешером (flasher-3.5 -u -F ОБРАЗ) и смонтировать rootfs.jffs. На самом деле там не jffs, а ubifs, кстати. У меня получилось вот по этому мануалу.

    Ещё можно подгрузить систему восстановления, как описано здесь. Там сей образ используют дабы подвинуть разделы, но нам это не надо. После чего во внутренней консольке делаем mount -t ubifs ubi:rootfs /mnt и сливаем всё на флешку. Хороший метод бекапа, кстати, настоятельно рекомендую.

    Далее по мануалу делаем себе образ убунты для qemu.

    Дабы облегчить себе жизнь и получить возможность chroot'иться в arm-ое окружение нужен будет пакет qemu-kvm-extras-static. Копируем после установки /usr/bin/qemu-arm-static в /bin своей системы и chroot магическим образом начинает работать. Если кому интересно, как это происходит, могут почитать про binfmt_misc и прочие вкусности, которые нам позволяет linux. Теоретически так можно на самом девайсе ubuntu x86 в chroot-окружении запустить, а в ней завести wine. Хотя, скорее всего не получится, ибо наткнёмся на всё те же неподдерживаемые системные вызовы.

    Монтируемся, создаём директорию maemo, разворачиваем образ, который сдампили, далее всё по первому блину.

    В итоге во время компиляции mcs начал вылетать с internal error и ничего я с этим поделать не мог. Тем не менее была получена среда сборки независимая от бажного scratchbox-а (который ко всему прочему ещё и только под i386).

    Наконец-то успех!


    На третий день Зоркий Глаз заметил, что у сарая нет стены. А именно: практически весь mono — это управляемые dll-ки, которым решительно всё-равно под какой платформой их запускают. В результате созрел следующий план:

    1. Через apt-src install вытаскиваем сырцы моно. При этом они уже разложены по пакетам так, чтобы их потом удобно было ставить.
    2. Издеваемся над содержимым директории с дебиановскими сборочными скриптами так, чтобы все файлы оказались в /opt (на нокии совсем маленькая rootfs, если кто не в курсе)
    3. Собираем под amd64
    4. Собираем платформозависимые бинарники в chroot-окружении из п. 2 (в scratchbox опять полезли ошибки, не стал разбираться)
    5. Капитально издеваемся над пакетами, меняя в них эти самые бинарники, правя зависимости, вставляя костыли


    Собственно, 4-ый шаг был облегчён наличием опции --disable-mcs-build, которую дяди из Novell специально придумали для таких случаев. Описывать процесс сборки не буду, он на этот раз (после 5-то неудачных попыток!) оказался весьма тривиален.

    Наборы пакетов и версии библиотек в Maemo и на убунте несколько отличаются, так что пришлось покорпеть. Но оно того стоит: удалось перенести на устройство нормальную систему раскиданных по пакетам библиотек (пока не полностью, но я над этим работаю) вместо 260-иметрового тарболла, который генерится при ./configure && make. Собственно, сейчас mono у меня сожрал около 27 метров /opt при весе пакетов в 12. При этом уже сейчас доступен практически весь .NET 2.0:
    System.dll, System.ServiceProcess.dll, System.Drawing.Design.dll, System.Transactions.dll, mscorlib.dll, System.Drawing.dll, System.EnterpriseServices.dll, System.Web.dll, System.ComponentModel.DataAnnotations.dll, System.IdentityModel.dll, System.Web.DynamicData.dll, Mono.Data.SqliteClient.dll, System.Configuration.dll, System.IdentityModel.Selectors.dll, System.Web.Extensions.Design.dll, Mono.Data.Sqlite.dll, System.Configuration.Install.dll, System.Management.dll, System.Web.Extensions.dll, System.Core.dll, System.Messaging.dll, System.Web.Routing.dll, System.Data.DataSetExtensions.dll, System.Runtime.Serialization.dll, System.Web.Services.dll, Mono.Messaging.dll, System.Data.dll, System.Security.dll, System.Windows.Forms.dll, System.Data.Linq.dll, System.ServiceModel.dll, System.Xml.dll, Mono.Security.dll, System.Design.dll, System.ServiceModel.Web.dll, System.Xml.Linq.dll


    Установить себе на устройство это чудо можно, добавив в sources.list следующую строку:
    deb http_://archive.kebrum.com/n900/ all main

    и установив пакет libmono-winforms2.0-cil, который потянет за собой всё остальное. К сожалению, пока больше никакие пакеты не переносил, ибо уже 4 утра, но обязательно этим займусь позже (мне же gtkшный софт переносить).

    Если кто-то захочет перенести свой софт на C# на N900 с использованием этой сборки, обязательно свяжитесь со мной, чтобы я держал вас в курсе событий.

    И не судите строго за орфографию с пунктуацией, ночь на дворе, глаза красны, очень спать хочется, да и по клавишам еле попадаю.

    UPD: С помощью лома и какой-то матери перенесено GTK# (пока не всё). Ну и нехилый такой кусок mono, необходимый для пакета mono-devel.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 25
    • +10
      Впечатляет, вы молодец.
      Интересно, ведь получается, что Nokia закопала невероятно перспективную платформу. Глядя на ваш труд, видишь, что в запасе у платформы такой мощный пласт, что при должном бережном и внимательном обращении, разработчик мог добиться таких успехов, что заткнуть по функционалу и iOS, и Android, и Windows Phone было бы раз плюнуть. Была ведь у компании мощная ОСь, так нет, они её закопали, отказались от MeeGo, готовят эйтаназию для Symbian и отдают весь высокий ценовой сегмент Microsoft. Разве будут гаджеты под Windows Phone стоить сильно меньше n900? Сильно сомневаюсь. Да, Microsoft обещает дифференциацию устройств и выход в средний ценовой диапазон.
      И, всё же, я по-прежнему не уверен, что существующие на рынке ОСи настолько сильно лучше и функциональнее Maemo, чтобы стоило её бросать. Я не учитываю извечный аргумент, что во всяких маркетах 100500 приложений.
      • 0
        Черт побери, это круто! Респект.

        Есть ли уже какие то ощущения от работы? Сильно тормозит при загрузке/исполнении?
        • 0
          Пока что есть ощущение, что зря сидел до 4 утра. Стартует оно, как водится, не быстро, хэлловорд со скриншота запускается секунды три. В принципе, это даже меньше какого-нибудь вполне нативного filebox-а. Да и решается ahead-of-time-компиляцией. Во время выполнения же ведёт себя достаточно отзывчиво. Опять же отнюдь не хэлло-ворд у меня стартовал примерно столько же. А вот раму кушает немилосердно (14 метров, где это видано), но, думаю, там львиную долю занимает сам рантайм, большая часть которого потом уйдёт в swap.
          • 0
            Попробовал завести тестовый билд прожки с разрабатываемыми сейчас собственными контролами (мы устали от ключноватого GTK# и решили делать гуй полностью на Win Forms). Всё перенеслось на ура и без каких либо правок. Единственное, уж очень забавно обрабатывается BorderStyle=None у формы.
            • 0
              Оппа, а можно оффтопик? А что GTK# сильно глючный? Как раз чалится большая задача по написанию линух клиента, думал не делать на винформе а использовать GTK# (на сайте монопроекта ратуют за него типа и нативней выглядит (неважно) и шустрее работает (важно) www.mono-project.com/Gui_Toolkits). Я смотрел демку граф редактора на нем — вроде неплохо бегала.
              Если есть пара минут — не опишете основные траблы с GTK#? Заранее спасибо.
              • +1
                Скажем так, он несколько неочевиден, да и возможности не особо широкие. Например, размеры рабочей области экрана средствами GTK не получить никак. При попытке использовать совместно с Winforms рискуете поймать SIGSEGV в самый неожиданный момент. Далее. Сказать, что местная рисовака неудобна, значит, ничего не сказать. По сравнению с System.Drawing просто земля и небо. В нашем проекте в итоге на неё плюнули, я соорудил враппер, перегоняющий данные из Bitmap и Pixbuf (вообще, у них там есть свой, но его нет на макоси со всеми вытекающими).

                К тому же его обработчик XError благополучно тормозит всю программу без возможности адекватно (читай: игнорирую) на это отреагировать. Помимо этого я периодически ловил SIGSEGV при отладке. Ах да, со стектрейсами творится нечто невообразимое.

                Отлаживать гткшный код в Monodevelop тоже несколько сложновато. В итоге, намучившись с GTK# мы приняли решение вернуться на виндоформы.

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

                А по поводу скорости — не верьте, одинаково получается.
                • 0
                  Ох, бида бида, спасибо за консультацию. Странно выходит — Мигель пишет в своем блоге — однозначно пишите на GTK# типа лучший вариант для линуха… И вроде banshee на нем написан и f-spot, выглядят досаточно презентативно…
                  Писать свой слой контролов, блин это дополнительно и время и расходы. :(
                  • 0
                    Если вы пишете только для линукса, то тогда идеальное решение, но, возможно, придётся ещё разобраться с libX11 и прочими вещами. Мы же пытаемся максимально использовать единый код на все платформы.
                    • 0
                      нет, решение как минимум для винды и линуха. ЦА нашего ПО на маках сидит крайне редко. Насчет 100% кроссплатформенности и переносимости я как то скептически отношусь. Так что была идея изначально вынести всю бизнеслогику подальше от гуев и пилить два решения UI конкретно под каждую платформу.
                      • 0
                        Насчет 100% кроссплатформенности и переносимости я как то скептически отношусь
                        В Java же её как-то достигли, что мешает то же самое сделать на дотнете? Среда выполнения есть, чего нам ещё надо?

                        Например, openvpn-клиент со встроенным интерфейсом биллинга и плюшками удалось таким сделать практически без платформозависимых хаков. Единственное, на маке пришлось рисовать достаточно объёмную скриптовую обвязку для запуска демона.
                        • 0
                          В Java же её как-то достигли, что мешает то же самое сделать на дотнете? Среда выполнения есть, чего нам ещё надо?

                          В том то и дело что «как-то». Приложения смотрятся ненативно, еще жава по собственным ощущениям тормозит на UI.

                          Плюс еще рассматриваем вариант WPF на винде, а этого добра на Моно еще не будет долго. Перспектива рисовать свои контролы как то пугает… этож какой объем работы. Вобщем надо думать над решением куда податься.

                          Кстати, видели www.creativedocs.net? там вообще полностью без Winforms сделано и выглядит просто шикарно но сурсов нет кроме самых базовых.
                          • 0
                            смотрятся ненативно
                            Ну, знаете ли. Либо отличия внешнего вида, либо переносимость.
                            • 0
                              Ну да, вы правы.
                              Большое спасибо за консультацию :) была бы карма, плюсанул бы, очень интересный пост.
                            • 0
                              Плюс еще рассматриваем вариант WPF на винде, а этого добра на Моно еще не будет долго.

                              Перспектива рисовать свои контролы как то пугает… этож какой объем работы

                              А я вот сейчас занимаюсь портированием одного интерфейса c WPF на HTML :)
                              На форме останется только webBrowser и проксик котрый будет гонять данные и вызовы между HTML/JS и логикой.

                              Но у меня спцифика софтины такая, что масса использовалась собственных контролов. Изначально было написано на WPF, когда он был еще бетой, в нем довольно удобно рисовать нестандартно выглядящие контролы, но сейчас бороться с WPF сил уже не осталось.
                              В этом плане показалось самым простым отрисовать GUI на html/css/jquery, и попробовать потом собрать под mono. Правда для этого придется заменить webBrowser(IE8) на что-нибудь хромиумное и переписать вызовы JS/c.sharp/JS

                    • 0
                      Опять же — monodevelop тоже на нем запилен…
                      • 0
                        Запилить можно хоть на чистой libX11, вопрос в удобстве и переносимости. Например, для запуска gtkшного софта на windows нужно выкачать 20 метров библиотек. Опять же соорудить бандл для мака с целью избежать установки 60 метров моно тоже проблематично. Так что мы сейчас будем писать на винформах.
                • 0
                  Вы про производительность спрашивали. Как-то вот так. Достаточно шустро бегает, гуй отзывчив.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • +1
                    КДЕ, Квака теперь и С# что нас ожидает далее на N900?
                    • –2
                      Что люди только не делают, лишь бы не читать книжки по питону.
                      • +1
                        Это как-то поможет перенести тонны работающего кода на шарпе на N900? И вообще, не особо понятно, какой смысл менять платформу, если и так всё устраивает.
                      • –2
                        а зачем нужен имено c#
                        • 0
                          Завидую автору :)

                          Антон: Хочешь стих? — Я помню чудное мгновенье:
                          Передо мной явилась ты,
                          Как мимолетное виденье,
                          Как гений чистой красоты.
                          Лера: как красиво… ты такой милый, ради меня еще никто стихов не сочинял…
                          Антон: %) ну, я шокирован… знаешь, меня сегодня прет, я тебе сейчас столько стихов насочиняю )

                          © bash.org.ru
                          • 0
                            Возможно вопрос не по теме, но все же меня очень волнует. Можно ли что-то похожее провернуть на Nokia с Symbian на борту?
                            • 0
                              На S60 есть портированный Compact Framework, но он платный, вроде.

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