Занимаясь долгое время разработкой под Android, я постепенно пришел к выводу, что мне как разработчику во многих вещах серьезно не хватает. Затем, в начале 2010 года, не хватало только исключений C++ и RTTI. Без них любой нетривиальный код на C++ просто не мог быть перенесен на Android и требовал практически полного переписывания.
Это было очень существенное ограничение, которое не давало мне покоя.
К счастью, Android имеет открытый исходный код, поэтому, вооружившись принципом «если тебе что-то нужно, сделай это сам», я приступил к работе.
К моему удивлению, оказалось довольно легко поддерживать полный C++ с исключениями и RTTI. Работа заняла всего около недели.
Далее было сделано Веб-сайт , на котором были выложены получившиеся пакеты для Windows, Linux и Mac OS X, а также патч и инструкция по сборке.
Проблема была актуальной, поэтому проект оказался очень популярным и в течение первого месяца я получил огромное количество писем с вопросами, просьбами о дополнительном функционале и просто благодарностями.
Одним из наиболее часто задаваемых вопросов был: «Включит ли Google ваши изменения в основную веткуЭ» Я честно ответил, что не знаю, но надежда есть, потому что.
Дэвид Тернер (системный архитектор Android) очень заинтересовался моими патчами и пообещал обратить на них внимание.
Скоро сказка рассказана, но не скоро дело сделано.
У доброй корпорации было много более неотложных задач, поэтому мои патчи в основную ветку вытащили только где-то через год. За это время вышло два релиза от Google (r3 и r4) и я адаптировал их так же, как и r2. Я продолжал размещать модифицированные пакеты вместе с патчами и инструкциями по сборке на своем сайте.
Таким образом, за это время накопилась достаточно большая аудитория пользователей, которым были необходимы данные возможности.
Используя мой NDK, многие проекты с открытым исходным кодом и коммерческие проекты смогли перенести свой код на Android. Среди Open Source, пожалуй, наиболее известными являются OpenCV И Огре3D .
Наконец, с выпуском NDK r5 Google интегрировал мои патчи (почти без изменений) в основную ветку.
Казалось бы, на этом проект закончился, но к тому моменту накопилось довольно много других претензий к НДК.
Многого не хватало, и поэтому я решил продолжить проект, переориентировав его с «Android NDK + Full C++» на «Улучшенный Android NDK», потому что.
на своем опыте я понял, что это лучший способ достичь этих целей.
изменения в основной линии.
Конкретный список улучшений постоянно обновляется; его можно увидеть на моем сайте на странице конкретного релиза.
Итак, здесь я поочередно опишу основные улучшения CrystaX NDK, отличающие его от Google NDK.
Широкая поддержка символов
Не знаю почему, но в Google NDK была совершена диверсия — wchar_t сделали размером в 1 байт. Объяснения Дэвида Тернера меня не удовлетворили.Он отметил, что код, использующий wchar_t, обычно непереносим, поэтому вам нужно использовать UTF-8, хранящуюся в обычных символьных строках.
Нисколько не протестуя против использования UTF-8, я, однако, указал ему, что код с wchar_t становится непереносимым из-за таких решений, как те, что есть в Google NDK. Обсуждений особо не было; у каждого было свое мнение, но я понимал, что необходима поддержка широких символов/строк/потоков.
На основе кода из FreeBSD я начал разработку поддержки wchar_t в стандартной библиотеке C, а заодно и локалей Std C. Задача была непростой и потребовалось несколько месяцев, прежде чем я получил стабильную реализацию.
К сожалению, он еще не полный (полноценной поддержки локали еще нет, поддерживается только UTF-8), но на практике его уже более чем достаточно для многих проектов.
Я сам участвовал в проектах, где активно использовались широкие символы/строки/потоки, а также знаю из писем, что люди использовали мою реализацию.
С++11
С выпуском нового международного стандарта C++ мне захотелось использовать новые возможности языка и стандартной библиотеки.К сожалению, NDK от Google основан на GCC 4.4.3, который, хотя и включает в себя некоторые функции C++0x, несколько устарел.
Поэтому было решено добавить в CrystaX NDK новый инструментарий на базе GCC 4.6.3. Сказано - сделано.
На данный момент CrystaX NDK содержит две версии компилятора — 4.4.3 (как в Google) и 4.6.3 (новая).
Переключаться между ними очень просто — в Application.mk вашего проекта достаточно написать: APP_TOOLCHAIN_VERSION := 4.6.3
Обратите внимание, что этого недостаточно, чтобы воспользоваться возможностями C++0x. Вам необходимо явно включить C++0x (также в Application.mk): APP_USE_CPP0X := true
Фреймворк оптимизации графита
В CrystaX NDK GCC 4.6.3 встроена поддержка платформы оптимизации Graphite. Здесь долго говорить не о чем, поэтому просто дам ссылку на страницу викиЦель-C
Google NDK поддерживает только C и C++ для собственной разработки.Это, конечно, неплохо, но в какой-то момент выяснилось, что изначально для iOS было написано довольно много кода на Objective-C, который теперь нужно было портировать на Android. Вы, конечно, можете пойти традиционным путем и переписать его с нуля или добавить поддержку Objective-C в Android. Немного подумав, я пришел к выводу, что наличие возможности лучше, чем ее отсутствие, и начал реализовывать эту идею.
На данный момент портированы компилятор Objective-C и базовая библиотека GNU Objective-C. В планах порт GNUStep на Android (тогда можно будет портировать код Cocoa с минимальными изменениями), но задача эта не маленькая и явно займет какое-то время.
Как бы то ни было, вы можете начать использовать Objective-C на Android прямо сейчас — просто добавьте исходники с расширениями .
m (Objective-C) или .
mm (Objective-C++) в LOCAL_SRC_FILES.
Статический анализ кода
Я, как и многие разработчики, немного параноик.Я никогда не уверен на сто процентов в своем коде — слишком часто сталкивался с глупыми ошибками, как своими, так и чужими.
Поэтому я следую главному правилу — «Код-ревью слишком много не бывает».
Существует довольно много различных анализаторов кода, но для Android я решил начать со статического анализатора кода Clang. Этот проект активно развивается и уже достаточно хорошо анализирует код C и Objective-C (C++, к сожалению, пока нет).
Чтобы воспользоваться этой функцией, необходимо сначала установить Кланг , убедитесь, что скрипт scan-build из пакета Clang доступен из командной строки, и начните сборку проекта Android: ndk-build ANALYZE=1
Эта команда как обычно соберет проект Android, но также проанализирует его параллельно с помощью анализатора Clang и, если будут обнаружены ошибки, сообщит о них в конце.
Планирую добавить поддержку других анализаторов, но конкретики по этому поводу пока нет.
Драйвер файловой системы на уровне приложения
Эта функция еще не готова к полноценному использованию и находится в активной разработке, но я все же решил о ней упомянуть — кто знает, может быть, она сэкономит кому-то недели или месяцы работы.В приложении, созданном с помощью CrystaX NDK, все вызовы API ввода-вывода (такие как открытие, чтение, запись и т. д.) перехватываются и анализируются.
Это сделано для внедрения так называемых «драйверов» — фильтров, которые могут изменять записываемые/читаемые данные прозрачным для приложения способом.
Например, для сжатия или шифрования данных.
Обратите внимание, никаких изменений в коде приложения не требуется! Вам просто нужно вставить что-то вроде этого в код в начале: mount("/path/to/storage", "/target", "compressed", 0, "GZIP")
и вуаля — все данные, записанные в /target, будут автоматически сжаты с помощью gzip, а данные, прочитанные из /target, будут автоматически распакованы.
Еще раз напомню, что эта функция еще не готова, но находится на завершающей стадии разработки.
Вполне возможно, что в течение ближайшего месяца она стабилизируется.
Впрочем, возможно, что кто-то сочтет это полезным прямо сейчас — ну, я не против.
Заключение
Чем больше я увлекаюсь платформой Android, тем больше у меня остается неудовлетворенных потребностей.Пока у меня достаточно сил и времени, чтобы реализовать все самому, но очевидно, что вечно это продолжаться не может. Поэтому я призываю энтузиастов принять участие в проекте — давайте сделаем Android той платформой, которую мы хотим! В конце концов, это главное преимущество Android перед iOS и Blackberry — мы можем сделать ту ОС и инструменты для нее, которые нужны нам, а не вендору.
Вперед! На этой радостной ноте позвольте мне уйти.
Теги: #Android #crystax #NDK #objective-c #objective-c #разработка для Android
-
Angry Birds В Кино: Первый Трейлер
19 Oct, 24 -
Никон Кулпикс Aw100. Год Спустя
19 Oct, 24 -
Сафари 5 Выпущен
19 Oct, 24 -
Социальная Сеть На Благо Общества.
19 Oct, 24 -
Rds-Подобный Сервис Для Postgresql
19 Oct, 24 -
Очередной Пиар Для Шахиджаняна
19 Oct, 24 -
Исследование Факторов Ранжирования В Яндексе
19 Oct, 24