Главным недостатком Mono для Android является то, что для работы приложений требуется отдельная среда выполнения, отличная от Dalvik. И хотя полный доступ к CLR выглядит весьма привлекательно, проксирование и маршаллинг вызовов от одной среды выполнения к другой могут сильно повлиять на производительность. Так почему бы не убрать промежуточную компиляцию в IL-код и получать сразу рабочий Dex-код? Этим и занимается проект dot42.
В январе, после 1 года разработки, авторы проекта dot42 наконец-то перешли от обещаний к пряникам. И, хотя проект еще не дотягивает до состояния боевого продукта-конкурента Mono, стоит, как минимум, его рассмотреть и попробовать.
Признаюсь, я немного слукавил, сказав, что компилятор dot42 «убирает» IL-код. Это не совсем так. Вместо этого он читает IL-код и конвертирует его в новый язык Register Language или, если короче, RL. Главная разница между IL и RL в том, что IL-код работает на стековой модели выполнения (как и байт-код у Java), а RL-код на регистровой, так же как Dalvik. После получения RL-кода, dot42 производит ряд оптимизаций и наступает этап финальной компиляции. Именно после последнего этапа и получается dex-код, язык среды Dalvik. В чем отличие RL от Dex написано в самом первом посте в блоге разработчиков.
На каждом этапе работы компилятора оригинальная дебаг-информация сохраняется, разумеется, компилятору приходится конвертировать ее из формата PDB в дебаг-формат для dex-кода. dot42 использует adb (Android Debug Bridge) для подключения отладчика в Visual Studio.
После компиляции библиотеки Android'а используются напрямую. Компилятор понимает большинство типов, например, java.lang.Boolean сопоставляется с System.Nullable<bool>. Правда, кое-какие телодвижения с типами данных все-таки придется сделать. Поскольку dot42 оперирует непосредственно с dex-кодом, есть несколько ограничений на функции и возможности C# и .NET. Пожалуй самое главное из них — это отсутствие пользовательских value-типов (структур). В виртуальной машине Dalvik просто нет поддержки таких типов, поэтому и сопоставить структуры никак не получится.
Частый вопрос при использовании dot42: какие структуры данных использовать, .NET или Android? Например, что использовать, System.Collections.Generic.List<T> или java.util.ArrayList<E>? Один из разработчиков dot42, Ewout Prangsma, советует отдавать предпочтение Java-классам. Даже несмотря на то, что List<T> — тонкая надстройка над ArrayList<E>, это по-прежнему дополнительный код, который необходимо будет включить в сборку и выполнять в дальнейшем.
dot42 — коммерческий продукт (профессиональная версия стоит 399 $), однако, существует Community License, позволяющая не только протестировать продукт, но и опубликовать готовые приложения в Google.Play и аналогичных магазинах. Правда, публикуемые таким образом приложения должны быть бесплатны.
Попробуем?
Для начала работы необходимо зарегистрироваться. У проекта есть документация, которой вполне хватит для знакомства.
После установки, можно поиграться с примерами из Samples.zip в корневой директории dot42. Так же есть Hello World Tutorial.
У меня не получилось подключить свой HTC One X (с прошивкой Jelly Bean) в Device Center, поэтому я создал новый эмулятор, с теми же программными характеристиками:
Создал проект, все как в Hello World Tutorial. Запустил в виртуальной машине и все действительно заработало:
К сожалению, заявленная поддержка отладки пока хромает. Visual Studio 2012 после любых махинаций с дебагом просто падает и предлагает перезапустить себя. Попробовать на 2010 у меня нет возможности. В любом случае, я думаю, что это временное явление.
Кстати, на реальном устройстве все выглядит примерно так же:
В общем, лично я с интересом буду следить за проектом. :o)
Если вы видите какие-то ошибки, пожалуйста, сообщите о них в пм.
Автор: gouranga