Подтвердить что ты не робот

Жизнеспособные возможности для запуска NodeJS на Android (август 2017 г.)

Есть куча старых SO-потоков, связанных с запуском NodeJS на Android. Большинство из них больше не являются жизнеспособными (JXCore) и/или предоставляют запутанную, устаревшую, неполную или ошибочную информацию.

Поэтому я исследовал то, что, по-видимому, было в настоящее время (по состоянию на август 2017 года) жизнеспособным подходом и нашел трех вероятных кандидатов.

Чтобы решить между ними, я хотел бы знать:

  • основные различия между этими подходами
  • конкретные профи и согласования для каждого подхода
  • вероятные препятствия, проблемы и недостатки
  • Знаете ли вы о других жизнеспособных альтернативах?

Жизнеспособные подходы:

  • Запуск javascript-движка V8, который включает NodeJS (J2V8)
  • Использовать NodeJS напрямую, встроенную в качестве исходной библиотеки (node-on-android)
  • Объединение React Native с NodeJS-приложением (react-native-node)

Кроме того, я нашел ряд интересных интересных ресурсов:

  • NPM устанавливает NodeJS напрямую с помощью Termux без использования rooting (не для конечных пользователей)
  • LiquidCore - собственное мобильное приложение micro-app devenv (не исследовано, интересные понятия)
  • dna2oslab - работает рабочая сборка NodeJS script для node исполняемых файлов
  • Building NodeJS для Android - блог с полезными подсказками компиляции и пример проекта
4b9b3361

Ответ 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

Pros

  • Простой проект, не так много сантехники
  • Поставляется с последней версией v8.x Node из готовой
  • Простое программирование пользовательского интерфейса приложения на основе HTML (например, с помощью choo)
  • Работает из коробки:)

против

  • Очень новый проект, только экспериментальный код
  • Приходит только для архитектуры arm64 (полная мобильная поддержка запланирована или построена DIY)
  • Не существует собственного пользовательского интерфейса (если только кодирование в 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 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 из-за:

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 на вашем телефоне.

Ответ 2

Я получил ответ из @dna2github, создатель NodeBase (спасибо большое!), что я буду включать здесь (с разрешения):


Привет,

спасибо для вашего вопроса. Я сделаю короткий ответ на мой взгляд.

1. Запуск javascript-движка V8 на Android, который включает NodeJS

плюсы:

  • интегрирован с Java-миром; может получить полный контроль над кодом.

минусы:

  • немного сложно интегрировать с 3-мя пакетами (нужно время, чтобы узнать, как это сделать).
  • нужно узнать о вещах NodeJS и V8, а также о документах J2V8 (они долгое время потребляют).

2. Компилируйте NodeJS как родную библиотеку (используя node -on-android)

плюсы:

  • сосредоточиться на js dev и не нужно рассматривать сторону android.
  • меньше времени обучения; похоже на телефонную связь Кордовы....

минусы:

  • js app = > apk - черный ящик.

3. Запуск NodeJS на Android с использованием Termux

плюсы:

  • гибкий

минусы:

  • no gui

4. Другие интересные подходы

Не знакомы с LiquidCore; я считаю, что создание микросервиса, особенно из-за url, заключается в том, чтобы не разрешать прямое доступное хранилище на iOS. response-native- node часть Android основана на методе NodeBase и использует предварительно построенный двоичный файл.

Для NodeBase:

плюсы:

  • аналогично 3; разница в том, что у него есть собственный gui для запуска/остановки приложения.
  • это может быть шаблон для всего; например, если вы хотите запустить django, вам просто нужно заменить node на python; рельсы, рубины...

минусы:

  • проблема с доступом к исходному процессу; процесс не может наследовать доступ из приложения Android.
  • счастливая игрушка с открытым исходным кодом не похожа на коммерческое приложение; нужно больше дизайна, если хотите распространять среди клиентов

Сначала я запускаю node в терминале; Я нахожу, что только dev может легко использовать его для запуска js-приложения. Мои друзья и семьи также хотят, чтобы некоторые инструменты, например, делали водяную марку на фотографии в партии. NodeBase создан для удобного запуска/остановки приложения. Затем им просто нужно открыть браузер, чтобы использовать его. Еще одна идея создания NodeBase заключается в том, что мы можем создавать совлокальные приложения, которые можно использовать в одном и том же Wi-Fi. Когда хост запускает приложение, его можно посетить рядом с людьми. Тогда они могут работать и играть вместе. Например, мы играем оборотня, и когда нет судьи, мы начнем приложение оборотня, чтобы иметь судьи в первом раунде. Мы также можем обмениваться файлами между устройствами через загрузку/загрузку.

Для меня я могу построить то, что хочу гибко, например, я хотел бы сделать свой Android в качестве машинного обучения бегуном; он может помочь мне запустить программы машинного обучения в любое время (с node и python, таким образом, в моем другом репо: dna2oslab фокусируется на для создания бинарных файлов), чтобы использовать время работы телефона.

Для вас, если вы захотите портировать свое приложение за короткое время, я рекомендую 2; если у вас есть время и другие ресурсы, 1 лучше. 3, если вы просто сделаете игрушку/демо. 4 другие всегда возможны и просто делают свое воображение для создания работ.

С наилучшими пожеланиями, Семь