Улучшенный Android Ndk (Собственный Комплект Разработки)

Занимаясь долгое время разработкой под 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

Вместе с данным постом часто просматривают: