Новая версия CrystaX NDK 10.3.0 доступна для скачивания.

Наиболее важные изменения в этом выпуске:

  • Новые GCC и LLVM/clang.
  • Сильно улучшена поддержка Objective-C v2.
  • Добавлена поддержка Python (2.7 и 3.5) для Android.


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


Новые GCC и LLVM/clang



В этом выпуске мы добавили новые тулчейны, основанные на gcc-5.3 и llvm-3.7. Старые gcc-4.9 и llvm-3.6 также присутствуют для совместимости, но будут удалены в следующем релизе.

Нет нужды говорить, что это значит для разработчиков, особенно в свете активно развивающихся gcc и clang в плане поддержки новых стандартов C, C++ и Objective-C. Теперь вы можете использовать наиболее передовые языковые фичи и для Android.

Также, в этом релизе мы перешли полностью на собственные ветки GCC и LLVM/clang, которые основаны на upstream с минимальными точечными правками (ранее gcc и clang в CrystaX NDK были ответвлены от Google's gcc и clang). Принять такое решение помог тот факт, что у нас накопилась довольно большая «тестовая масса», позволяющая с определенной степенью уверенности утверждать, что компилятор, справляющийся со всеми нашими тестами — это годный, рабочий компилятор.

Это решение, хоть и было трудным, тем не менее оказалось очень верным, т.к. теперь процесс обновления gcc и clang до новых версий очень прост и происходит в полуавтоматическом режиме. Так, обновление до gcc-5.3 заняло всего три дня, из которых 20 минут заняло слияние с upstream-ом, следующие 20 часов — сборка нового билда и еще двое суток — полный прогон автоматических тестов. Из них только первая часть потребовала ручной работы.

$ $NDK/toolchains/arm-linux-androideabi-5/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --version
arm-linux-androideabi-gcc (GCC) 5.3 20151204
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ $NDK/toolchains/llvm-3.7/prebuilt/linux-x86_64/bin/clang -target armv7-none-linux-androideabi --version
clang version 3.7
Target: armv7-none-linux-android
Thread model: posix


Улучшенный Objective-C v2



Мы очень сильно улучшили рантайм Objective-C v2 и это позволило нам включить все языковые возможности современного Objective-C — Automatic Reference Counting, Objective-C Literals syntax и т.д. Также, в этом выпуске мы добавили Objective-C фреймворки CoreData, CoreText, CoreGraphics и CoreVideo, в дополнение к ранее добавленным Foundation и CoreFoundation.

Для удобства был создан пример, показывающий, как можно использовать Objective-C для разработки проекта сразу для iOS и Android.

ВНИМАНИЕ! Все заявленные возможности современного Objective-C v2 доступны только при использовании LLVM/clang. Если вы используете ndk-build, простейшим способом указать это будет добавление следующих строк в Application.mk:

# Application.mk
NDK_TOOLCHAIN_VERSION := clang


Python для Android



Мы предоставляем собранные бинарники python-2.7 и python-3.5 (исполняемые файлы, библиотеки и заголовочные файлы) для всех поддерживаемых Android ABI. Как и все остальные подобные пакеты в CrystaX NDK, Python был собран из официальных исходников, без единого изменения в его коде. Это прямое следствие нашего подхода: когда что-либо не собирается, мы не правим собираемый код. Вместо этого мы чиним CrystaX NDK, делая поведение нижнеуровневых библиотек соответствующим стандартам (POSIX и де-факто стандартам, таким как GNU/Linux).

Python в CrystaX NDK пока находится в экспериментальном состоянии, хотя он и работает довольно хорошо, насколько мы видим. Тем не менее, он пока еще не настолько хорошо оттестирован, как остальные компоненты, поэтому в нем могут быть ошибки или частично отсутствующая функциональность. В случае, если вы найдете подобные огрехи, не стесняйтесь сообщать нам о них!

Мы хотим сказать огромное спасибо Виталию Мурашеву (@vitaly-murashev) — Python появился в CrystaX NDK главным образом благодаря его помощи. Это и есть то, как работает open source: сделать что-либо для удовольствия и поделиться результатами с сообществом. Виталий, еще раз спасибо!

Собранные бинарники Python лежат в каталогах $NDK/sources/python/2.7 и $NDK/sources/python/3.5. Если вы используете ndk-build, вот пример использования Python в вашем проекте:

# Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE           := mymodule
LOCAL_SRC_FILES        := ...
LOCAL_SHARED_LIBRARIES := python_shared
include $(BUILD_SHARED_LIBRARY)

# Replace 3.5 by 2.7 if needed
$(call import-module,python/3.5)


Поддержка POSIX



Мы продолжаем улучшать поддержку POSIX в CrystaX NDK. В этом выпуске мы перенесли в libcrystax.so (сердце CrystaX NDK) еще больше POSIX интерфейсов, поэтому теперь она зависит от Google libc еще меньше. Фактически, единственная большая часть POSIX, еще не реализованная в libcrystax.so — это POSIX threads. Это — то, что мы собираемся исправить в следующем релизе. Тем самым мы сможем избавиться от зависимости от Google libc, полностью заменив ее на libcrystax.so.

В рамках нашей работы по улучшению поддержки POSIX, мы интегрировали Open POSIX Test Suite в процесс автоматического тестирования CrystaX NDK. Благодаря этому, мы можем быть уверены, что libcrystax.so предоставляет реализацию, действительно соответствующую POSIX.

Boost 1.59.0



Мы включили в состав CrystaX NDK собранные библиотеки и заголовочные файлы Boost 1.59.0. Теперь они собираются в двух вариантах — с использованием GNU libstdc++ и LLVM libc++ реализаций стандартной библиотеки C++. Ранее мы предоставляли библиотеки Boost, собранные только с GNU libstdc++, тем самым вынуждая пользователей указывать gnustl в своих проектах. Теперь вы можете указывать любую из двух: ndk-build автоматически определит предпочтительный вариант и подключит правильные версии библиотек Boost.

Также, в связи с тем, что у нас теперь есть Python для Android, мы начали собирать и тестировать Boost.Python. Эта работа еще не доведена до конца, но мы продолжаем работать над этим и со временем ситуация будет улучшаться.

CrystaX — официально одобренный тестер для проекта Boost. Это означает, что мы в непрерывном режиме тестируем библиотеки Boost, публикуя результаты на официальном сайте (master, develop). Это работает на пользу как Boost, так и CrystaX NDK. Пользователи Boost получают возможность использовать оттестированные библиотеки Boost на Android, а пользователи CrystaX NDK выигрывают оттого, что CrystaX NDK в свою очередь тестируется Boost тестами и тем самым практически доказывается хорошая степень соответствия стандартам POSIX и C++.

Итого



Кроме этого, в этом выпуске было сделано большое количество мелких улучшений и исправлений. Полный список закрытых тикетов находится здесь.

Комментарии (5)


  1. monah_tuk
    14.12.2015 12:44

    Ребята, так держать!

    Но можно чуть подробнее про дистрибуцию libcrystax.so? Копию нужно с каждым приложением распространять?


    1. crystax
      14.12.2015 12:54
      +1

      Стараемся :)

      Насчет libcrystax.so — да, копия идет в каждое приложение. Это, конечно, некоторое неудобство, но его сложно избежать — ведь libcrystax.so нет на целевом устройстве.

      Но на самом деле это не так уж страшно — пострипанная libcrystax.so весит всего 600 kB, а будучи запакована в APK, увеличивает его размер не более, чем на 400 kB. Для современных устройств (и даже для устройств трехлетней давности) это совсем не много.

      Кроме того, можно линковаться статически с libcrystax.a — в этом случае линкер выбросит все, реально не используемое в вашем приложении (например, wide characters), и вклад libcrystax в общий размер будет еще меньше.


      1. monah_tuk
        14.12.2015 13:14

        Неплохо. Лицензия, судя по сайту, BSD?


        1. crystax
          14.12.2015 13:23
          +2

          Лицензия самой libcrystax — да, BSD. Она ведь линкуется в безусловном порядке с любым приложением, собираемым CrystaX NDK, а мы не хотим никого ограничивать этим. Поэтому лицензия разрешает использовать libcrystax как угодно и вообще не накладывает никаких ограничений на разработчиков, кроме одного — выдавать libcrystax за собственную работу.

          У остальных же компонентов — свои лицензии. В связи с тем, что компонентов много, просто невозможно свести их всех под одной лицензией. Так, gcc — это GPL, LLVM/clang — это LLVM-BSD, Boost — тоже своя лицензия. Тем не менее, мы очень внимательно следим за этими вопросами и, несмотря на разноообразие используемых лицензий, общий принцип сохраняется тем же — CrystaX NDK без опасений можно использовать как в открытых, так и в полностью закрытых (коммерческих) проектах.

          Здесь это описано довольно подробно.


          1. monah_tuk
            14.12.2015 15:54

            Спасибо за развёрнутый ответ! Хотя вопрос был только про libcrystax :-) Про остальное, в основном, знаю. По ссылке уже ходил, просто уточнил, что всё верно понял.