Ответ 1
Изучение жизнеспособных вариантов
[ ПРИМЕЧАНИЕ Этот ответ содержит результаты, которые были в исходном вопросе]
Я несколько раз изучил различные варианты и вот некоторые предварительные выводы.
0. Компиляция NodeJS
В каждом из вариантов используется некоторая форма NodeJS, скомпилированная для Android. Но для использования любой опции вы, вероятно, захотите скомпилировать разные версии Node, Android и архитектуры (x86, ARM, ARM64 и т.д.).
Это проблематично. NodeJS имеет android-configure
script, но это приводит к ошибкам в большинстве сочетаний, которые я пробовал. Я создал ряд проблем github для рабочей сборки script. В этом выпуске собраны результаты:
Подводя итог:
- общая библиотека строит все сбой (кроме случаев, когда вы физически создаете свой андроид, см. ниже).
- J2V8 с NodeJS (
libnode.a
), статически связанный вlibj2v8.so
, работает для 7.x до7.9.0
- build-as- node -executable работает для 7.x(используя dna2oslab build script)
Один интересный метод обхода использовался @mafintosh: передать Node на устройство с использованием Termux и сделать компиляцию там (требуется много места и времени, но работает).
1. Запуск javascript-движка V8, который включает NodeJS (J2V8)
J2V8 - это набор привязок Java для V8. J2V8 фокусируется на производительности и тесной интеграции с V8. [...] [который] создает более статическую систему типов между JS и Java-кодом, но также улучшает производительность, поскольку промежуточные объекты не создаются. [...]
Для построения J2V8 необходимо создать как собственные части, так и библиотеку Java (файл .jar/.aar). Чтобы построить собственные части, мы сначала создаем node.js в качестве библиотеки, а затем статически связываем J2V8 с этим. [...]
Для кросс-компиляции J2V8 использует Docker (android, linux, windows) и Vagrant (macos).
Смотрите слайд-шоу: Запуск NodeJS в Java-мире (или см. InfoQ видео, 32 мин.)
Функции
- замените механизм JavaScriptCore более мощным v8 (с помощью NodeJS)
- поддержка многопоточности (потоки/рабочие) через добавленный J2V8 JNI/Java-уровень
- каждый поток может иметь свой собственный изолированный экземпляр V8
- 2-way js-to-java bridge (вызов java из script и наоборот)
- 2-сторонняя интегрированная обработка ошибок/исключений
- красивая кросс-компиляция интерактивной системы сборки (в работах)
- поддержка отладки хрома
- другие, типизированные массивы, поддержка ES6,...
Характеристики
- Укажите версии для компиляции в
build_system/build_settings.py
-
Запустите сборку просто с помощью
python build.py --interactive
, выберите сборку:[0] Docker >> android-x86 >> NODE_ENABLED [1] Docker >> android-arm >> NODE_ENABLED [2] Docker >> alpine-linux-x64 >> NODE_ENABLED [3] Docker >> linux-x64 >> NODE_ENABLED [4] Docker >> linux-x86 >> NODE_ENABLED [5] Vagrant >> macosx-x64 >> NODE_ENABLED [6] Vagrant >> macosx-x86 >> NODE_ENABLED [7] Native >> windows-x64 >> NODE_ENABLED [8] Docker >> windows-x64 >> NODE_ENABLED [9] Vagrant >> windows-x64 >> NODE_ENABLED
-
Выберите шаги сборки (или
all
):NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit
-
Компилирует V8 в качестве общей библиотеки
libj2v8_{platform}_{abi}.{ext}
- Примечание:
nodejs
шаг сборки не может построить Node общую библиотеку (ошибки), создает статическийlibnode.a
для связи вlibj2v8.so
- Примечание:
- Имеет уровень JNI, чтобы сделать большие части v8 доступными Java
- Дополнительные функции (например, JS ↔ Java bridge), реализованные в Java
- Конечный вывод сборки - это Gradle
.aar
для включения в качестве зависимости проекта
Pros
- Относительно активный проект
- Код хорошего качества, включая тесты модуляции Java
- Добавляет всю мощь Java к вашему инструменту разработки приложений
- Отличная интуитивная система сборки (после ее завершения)
против
- Небольшая, в основном устаревшая документация по использованию
- Особенно недокументированным является использование в больших (r) -масштабных проектах JS.
- Много кода клея JNI, который должен поддерживаться
- Проект не поддержан (многие старые открытые проблемы, не связанные с PR)
- Некоторое PR держится в течение 2 лет, даже не получая ответа. Не хорошо
- Сложнее понять настройку проекта J2V8 (много файлов), чем другие параметры.
- Проблема лицензирования ( "Все права защищены" в лицензии EPL 1.0)
2. Используйте NodeJS напрямую, встроенный в качестве собственной библиотеки (node-on-android)
Node на андроиде работает, запустив node.js внутри приложения Android с помощью общей библиотеки. Затем он связывает
WebView
, на котором размещается ваш код пользовательского интерфейса. Весь пользовательский интерфейс - это просто классический html/css/js.В приложении Node вам может потребоваться
node-on-android
, чтобы получить доступ к WebView. Вы можете использовать это для загрузки html-страницы вWebView
.
Согласно node-on-android
creator (@mafintosh), это проще и лучше, чем J2V8, поскольку он непосредственно компилирует V8 как реальную вещь.
Функции
- Создание полноценных приложений NodeJS, включая пользовательский интерфейс (через собственный WebView)
Характеристики
- Соответствующие каталоги/файлы в проекте Gradle
app
:-
app/src/main/include/node
с заголовками Node.h
-
app/src/main/jniLibs/arm64-v8a
сlibc++_shared.so
иlibnode.so
-
app/src/main/cpp
сnative-lib.cpp
(включаетnode.h
) - Java-код просто включает
Service
с Node, работающим в отдельном потоке
-
- Не имеет JNI для
libnode.so
, поэтомуprivate native void startNode(String... app);
показывает как ошибку в IDE (но компилирует) - Проект NodeJS находится в
android/app/src/main/assets/node
- Код NodeJS передается во временное хранилище и выполняется оттуда
- Приложение NodeJS определяет представления для загрузки в WebView через открытую функцию
loadUrl
- Node услуга, доступная через пакет NPM
node-on-android
- Node услуга, доступная через пакет NPM
Pros
- Простой проект, не так много сантехники
- Поставляется с последней версией v8.x Node из готовой
- Простое программирование пользовательского интерфейса приложения на основе HTML (например, с помощью choo)
- Работает из коробки:)
против
- Очень новый проект, только экспериментальный код
- Приходит только для архитектуры
arm64
(полная мобильная поддержка запланирована или построена DIY)- Примечание: 64-битная комбинация не может быть объединена с React Native (без 64-разрядной поддержки)!
- Не существует собственного пользовательского интерфейса (если только кодирование в Gradle/Java/XML)
- Нет поддержки отладки в приложении Node (AFAIK, но, возможно, вы можете как-то подключиться к WebView)
3. Объединение React Native с NodeJS-приложением (react-native-node)
Запустите процесс real node.js в фоновом режиме, за приложением React Native.
Используя этот пакет, вы можете: запускать HTTP-серверы в Android, использовать потоки Node, интерфейс с файловой системой, выгрузить некоторую тяжелую обработку из потока JS в React Native и многое другое! Запуск реального node.js в Android, вы можете делать все, что может node.js на рабочем столе.
Функции
- Используйте React Native для пользовательского интерфейса, NodeJS в качестве фоновой службы
Характеристики
- Выведено из NodeBase
- Очень похоже на node -on-android (запустите
Service
с Node в отдельной теме)- Но
node
скомпилирован/используется как приложение, а не встроенный общий lib - Код приложения NodeJS находится в
{projectRoot}/background
- Исполняемый файл NodeJS находится в
/android/src/main/res/raw/bin_node_v710
- В момент сборки Node приложение архивируется, распаковывается в `/android/src/main/res/raw/{appName}
- Служба NodeJS вызывается, как будто выполняется из командной строки, передавая args
- Но
- Node сервис
RNNode
доступен в RN, импортируяreact-native-node
-
react-native-node
также содержит CLI, который передает код Node во время сборки
-
- Пример проекта связывается с React Native службой NodeJS через REST
- Запуск сервера
express
наhttp://localhost:5000
на стороне Node
- Запуск сервера
Pros
- Простой проект, не так много сантехники
- Очевидное: Реагировать на поддержку NodeJS на Android!
- Node -as-executable, вероятно, будет работать с 64-разрядными устройствами + адаптивными
против
- Очень новый проект, только экспериментальный код
- Поставляется со старой версией NodeJS
7.1.0
(но DIY build более новые) - Отсутствует простой способ связи между RN и Node приложениями (REST-based)
- Необходимо расширить REST API или свернуть собственный механизм.
- Нет поддержки отладки в Node приложении. На самом деле трудно понять, что происходит.
Статус (2017-08-17)
Моя цель - React Native + NodeJS. Это статус моей деятельности:
- Компиляция версий NodeJS v7.x в качестве исполняемых файлов
- Компиляция NodeJS v7.4.0 до версии v7.9.0 работает с новой системой сборки J2V8.
- Компиляция NodeJS v8.1.2 скоро будет работать с J2v8 (скомпилирована против
libc++
) -
react-native-node
выполняет компиляцию, но не работает, несмотря на многие попытки. -
node-on-android
работает, но node - только разработка приложения и 64-битная несовместимая с RN
Я решил объединить react-native-node
с J2V8
из-за:
- Великая кросс-компиляция PR: https://github.com/eclipsesource/J2V8/pull/327
- Встраивается в красивый J2V8
.aar
, который легко включается в Gradle
React Native 0.46.4
+ NodeJS 7.9.0
теперь работает! См:
Мой прецедент: жирный клиент с децентрализованной сетью P2P
Я имею в виду дизайн CQRS (команда-запрос-ответственность-сегрегация):
- Пользовательский интерфейс с реакцией создается из представления, запрошенного из службы Node
- реагировать на собственные команды запуска пользовательского интерфейса в фоновом режиме Node
- фоновая служба обрабатывает сетевые сообщения, входящие команды, события триггеров
- события хранятся в Realm DB, который формирует мост между передней и задней частью
Подробности: Realm.io для подключения собственного NodeJS + React Native в Android-клиентном приложении для Android (стиль CQRS)
Заключение
Даже после многих лет, когда люди пытаются подключить NodeJS к Android, до сих пор нет реальных хороших решений, это новаторство.
Ожидайте много препятствий и ошибок при настройке среды вашего проекта и сборки, но после установки вы можете наслаждаться полной мощностью Node на вашем телефоне.