Меня зовут Дмитрий Москальчук и я автор CrystaX NDK - Native Development Kit для Android.
Я начал этот проект в 2009 году, добавив поддержку C++ в Android NDK от Google (первые версии Android NDK от Google не поддерживали C++) - как языковое ядро, так и стандартную библиотеку C++. Первая версия CrystaX NDK очень быстро стала популярной, т.к. очень многим людям требовалась поддержка C++ чтобы иметь возможность запускать их приложения/библиотеки на Android без переписывания их на Java. Google добавил поддержку C++ такого уровня в свой NDK почти два года спустя. К этому моменту мне стало ясно, что не хватает еще очень многого для нормальной разработки под Android, поэтому я переформулировал цель проекта с "Android NDK с поддержкой C++" на "Улучшенный Android NDK" и продолжил работать над ним.
Я работаю над этим проектом уже пять лет, постоянно добавляя новые возможности и делая нативную разработку под Android более удобной. Два года назад ко мне присоединился Александр Жуков и с тех пор мы работаем над проектом совместно. Все это время мы вели проект на собственные средства, зарабатывая деньги другими способами (выполняя заказную разработку для других коммерческих проектов) и тратили их на CrystaX NDK. В силу вышесказанного, работа над CrystaX NDK велась в свободное время, и поэтому проект не достиг тех высот, каких мог бы. Восемь месяцев назад мы отказались от всех сторонних контрактов и начали работу над CrystaX NDK в режиме full time. За это время мы достигли значительных результатов. Вы можете ознакомиться с ними на страничке NDK.
Мы планируем превратить CrystaX NDK в полноценный всеобъемлющий набор инструментов для разработки под Android, позволяющий разработчикам использовать их любимые языки программирования, фреймворки и библиотеки - иными словами, сделать Android дружелюбным к разработчикам без разделения их на первосортных (Java) и остальных.
Нативная разработка под Android поддерживается очень плохо:
- Android libc далека от того, чтоб быть названной "стандартной". Она просто не поддерживает много вещей, требуемых по стандарту - таких как широкие символы (wide characters), локали и т.д. Это делает портирование существующего кода с других платформ весьма сложным.
- Также Android libc нестабильна - многие функции, предоставляемые libc, реализованы лишь частично или с ошибками. Нет нужды объяснять как важно работать на стабильном базисе и почему очень плохо, когда это не так - недели или даже месяцы отладки вам гарантированы.
- Даже если некоторые проблемы чинятся в новых версиях Android, предыдущие версии не получают этих исправлений для системных библиотек. Google предоставляет обратную совместимость и исправления только для Java API.
- Нет хороших инструментов для нативной отладки. Хоть gdb/lldb и поддерживают удаленную отладку, практически нормальная пошаговая отладка нативного кода на Android почти что невозможна.
- Почти вся важная для приложений функциональность доступна только через Java API. Это означает весь UI, web, services, network management API, In-App Purchasing и т.д.
- Нет поддержки других языков программирования, кроме C и C++. Это становится особенно важным сегодня, когда Android распространяется все больше и больше, работая на многих довольно мощных устройствах (не только телефонах; сегодня это также планшеты, умные телевизоры, автомобильные навигаторы и т.д.)
Мы уже исправили множество подобных проблем в нашем CrystaX NDK и мы намерены продолжать и чинить остающиеся. Мы предоставляем дополнительный слой, который прозрачным образом замещает libc для приложений и дает более соответствующее стандартам поведение, превращая Android в нечто, значительно более следующее стандартам, чем он на самом деле является. Мы также уделяем внимание обратной совместимости и исправлениям, и такие исправления становятся доступными для всех версий Android. Это сильно облегчает портирование существующего кода (уже работающего на других POSIX платформах). Это первый шаг, необходимый для того, чтобы двигаться дальше - т.е. для реализации полного нативного API для всей системы, включая UI и другие вещи.
Мы также запустили регулярное регрессионное тестирование библиотек Boost под Android - и таким образом Boost становится полноценным "гражданином" на Android. Нет нужды объяснять, что такое Boost; современная разработка на C++ практически невозможна без Boost - будь то прямое использование его библиотек или использование техник, продемострированных в Boost. Даже ISO C++ стандарт в значительной степени основывается на Boost.
Тем не менее, вплоть до последнего времени Boost не поддерживался на Android. Во-первых, многие библиотеки просто не работали из-за многочисленных проблем с Android, таких как ошибки или даже отсутствие некоторой функциональности в libc. Во-вторых, не проводилось регулярного регрессионного тестирования и не имело смысла его запускать до тех пор, пока основные проблемы не будут починены. Теперь с помощью CrystaX NDK мы сделали Android значительно более соответствующим стандартам (ISO C, ISO C++, POSIX и т.д.) так что Boost (как и многие другие проекты) теперь работает на Android без переписывания. Мы будем продолжать поддерживать Boost на Android, исправляя NDK в случае необходимости, или исправляя Boost - так что Boost становится полноценно поддерживаемым и на Android.
Мы хотим двигаться дальше и добавлять новые возможности в CrystaX NDK, т.к. у нас теперь есть хороший стабильный базис для дальнейшей разработки и добавление новых фич будет более легким. В идеале мы хотим сделать полноценный набор инструментов для нативной разработки под Android, позволяя разработчикам создавать любые приложения под Android (UI, services, broadcast receivers и т.д.), не требуя при этом использования Java.
Мы также хотим предоставить людям возможность легкого портирования приложений с iOS на Android, предоставляя Objective-C компилятор и Cocoa-совместимые фреймворки. В идеале разработчики смогут просто собирать существующие iOS приложения под Android с помощью CrystaX NDK без изменения исходников самого приложения.
Это длинный путь, но мы знаем как это сделать и четко видим как этого достичь. Для этого мы просим помощи у сообщества разработчиков, заинтересованных в дальнейшем развитии средств нативной разработки под Android.
Ниже приведен список некоторых новых возможностей, которые мы хотим добавить в CrystaX NDK.
- Репозиторий собранных библиотек и заголовочных файлов для разработки. Что-то типа 'apt-get' в Debian или 'brew' в OS X. У нас уже есть клиентское приложение для этого, которое мы назвали "crew". Для любой более-менее серьезной разработки под Android разработчики нуждаются в использовании хорошо оттестированных и зарекомендовавших себя сторонних библиотек - openssl, libraw, freetype, ffmpeg/libav, expat/libxml2, libjpeg, libpng и т.д. На данный момент каждый разработчик вынужден собирать такие библиотеки в каждом проекте, самостоятельно сражаясь со всеми их особенностями и ошибками. Мы хотим максимально упростить это - т.е. разработчики смогут просто набрать "crew install libpng" или "crew install ffmpeg" и получить готовые к использованию бинарники и заголовочные файлы прямо в файловом дереве NDK через несколько секунд.
- Предоставить поддержку Objective-C v2. На данный момент CrystaX NDK поддерживает язык Objective-C. Однако существует ряд ограничений, препятствующих его реальному использованию. Во-первых, мы поддерживаем только Objective-C v1 runtime. Поддержки Objective-C v2 runtime пока нет. Во-вторых, у нас нет готовых к использованию Cocoa-совместимых фреймворков. Как только мы реализуем эти возможности, разработчики смогут портировать Objective-C код с iOS на Android со значительно меньшими усилиями.
- Поддержать больше языков программирования. Сейчас мы поддерживаем C, C++ и ограниченно Objective-C. Однако существует огромное количество других языков программирования и мы хотим добавить поддержку многих из них в CrystaX NDK. Подумайте о D, Go, Fortran, Lisp, Erlang - разве это не классно? И хорошая новость заключается в том, что это уже намного легче сделать чем раньше в силу основной фичи CrystaX NDK - гораздо более полного соответствия стандартам.
- Нативный API. На данный момент единственный полный API для Android - это Java API. Разработчики вынуждены писать обертки JNI для использования Android API в других языках программирования, или же использовать библиотеки типа Qt, предоставляющей унифицированный API для всех платформ, но, к сожалению, все еще не предоставляющей полного набора Android API. Мы хотим исправить эту ситуацию, предоставив нативный (C и C++) API для всей функциональности Android, позволяя использовать Android API из любого языка программирования максимально удобным образом.
У нас есть и другие мысли о том, что можно было бы добавить в CrystaX NDK для дальнейшего улучшения ситуации, но перечисленные выше - самые интересные, на наш взгляд. Мы также открыты для обсуждений и готовы выслушать новые идеи (и даже реализовать их, если большое количество народа выскажется "за"). Используйте наш трекер или связывайтесь с нами напрямую.
Как я говорил выше, у нас есть планы по дальнейшему развитию CrystaX NDK. Мы хотим превратить его в полноценный набор инструментов для разработки под Android, не ограничивая разработчиков и предоставляя хороший базис для любого POSIX-совместимого программного обеспечения, давая тем самым возможность портировать его под Android без переписывания. Для этого мы просим помощи у сообщества разработчиков.
Мы запустили кампанию по сбору средств на сайте BountySource для продолжения разработки CrystaX NDK как открытого, доступного всем разработчикам проекта. Мы просим всех, заинтересованных в дальнейшем развитии средств нативной разработки под Android, помочь нам. Мы будем очень признательны за любую помощь - будь это финансирование нашего проекта, помощь в разработке или дальнейшее распространение информации о проекте.