tutorial studio node ejemplos app actualizar javascript java android node.js react-native

javascript - studio - Opciones viables para ejecutar NodeJS en Android(agosto de 2017)



node js tutorial pdf (2)

Hay un montón de viejos hilos SO relacionados con la ejecución de NodeJS en Android. La mayoría de estos ya no son viables (JXCore) y / o proporcionan información confusa, desactualizada, incompleta o errónea.

Por lo tanto, he investigado lo que parece ser actualmente (a partir de agosto de 2017) enfoques viables y encontré tres posibles candidatos.

Para decidir entre ellos me gustaría saber:

  • las principales diferencias entre estos enfoques
  • pro y contra específicos en cada enfoque
  • probables obstáculos, desafíos y deficiencias
  • ¿Conoces otras alternativas viables?

Los enfoques viables son :

  1. Ejecutando el motor de javascript V8 que incluye NodeJS ( J2V8 )
  2. Use NodeJS directamente, incrustado como biblioteca nativa ( node-on-android )
  3. Combinación de React Native con NodeJS app-as-a-service ( reaccionar-native-node )

Además de eso, he encontrado varios recursos interesantes relacionados:

  • NPM instala NodeJS directamente usando Termux sin rooting (no para usuarios finales)
  • LiquidCore - devenv micro-aplicación móvil nativa (conceptos no investigados, interesantes)
  • dna2oslab - tiene un script de compilación NodeJS en funcionamiento para ejecutables de nodos
  • Construyendo NodeJS para Android - blog con consejos de compilación útiles y proyectos de ejemplo

Recibí una respuesta de @ dna2github , el creador de NodeBase (¡muchas gracias!) Que incluiré aquí (con permiso):

Hola,

Thx por tu pregunta. Voy a hacer una breve respuesta en mi opinión.

1. Ejecutando el motor de javascript V8 en Android que incluye NodeJS

pros:

  • integrado con el mundo de Java; puede obtener el control total del código.

contras:

  • un poco difícil de integrar con 3er paquete (necesita tiempo para aprender cómo).
  • Necesito aprender cosas sobre NodeJS y V8 y también documentos J2V8 (consume mucho tiempo).

2. Compila NodeJS como una biblioteca nativa (usando node-on-android)

pros:

  • centrarse en js dev y no hay necesidad de considerar el lado de Android.
  • menos tiempo de aprendizaje; similar al teléfono de Cordova ....

contras:

  • js app => apk es una caja negra.

3. Ejecutando NodeJS en Android usando Termux

pros:

  • flexible

contras:

  • sin gui

4. Otros enfoques interesantes

No estoy familiarizado con LiquidCore; Creo que el micro servicio especialmente desde url, es resolver ningún almacenamiento disponible directo en iOS. react-native-node la parte de Android se basa en el método NodeBase y utiliza el binario precompilado.

Para NodeBase:

pros:

  • similar a 3; La diferencia es que tiene su propia interfaz gráfica de usuario para iniciar / detener la aplicación.
  • puede ser una plantilla para todo; por ejemplo, si desea ejecutar django, solo necesita reemplazar nodo a python; rails, ruby ​​...

contras:

  • problema de acceso al proceso nativo; el proceso no puede heredar el acceso desde la aplicación de Android.
  • Happy Toy Happy Open Source no es como una aplicación comercial; necesita más diseño si quiere distribuir a los clientes

Al principio, ejecuto un nodo en la terminal; Encuentro que solo Dev puede usarlo fácilmente para iniciar la aplicación js. Mis amigos y familiares también quieren algunas herramientas, por ejemplo, marcar el agua en la imagen en lote. NodeBase está creado para que sea fácil de iniciar / detener la aplicación. Entonces solo necesitan abrir el navegador para usarlo. Mi otra idea para crear NodeBase es que podemos crear aplicaciones compartibles que se puedan compartir en el mismo Wi-Fi. Cuando el host inicia una aplicación, puede ser visitada por personas cercanas. Entonces pueden trabajar y jugar juntos. Por ejemplo, jugamos al hombre lobo y cuando no hay juez, iniciaremos la aplicación del hombre lobo para tener un juez para la primera ronda. También podemos compartir archivos entre dispositivos mediante descarga / carga.

Para mí, puedo construir lo que quiero de forma flexible, por ejemplo, me gustaría convertir mi Android en un corredor de aprendizaje automático; me puede ayudar a ejecutar programas de aprendizaje automático en cualquier momento (con nodo y python, por lo tanto, en mi otro repositorio: dna2oslab se centra en la creación de binarios) para hacer uso del tiempo de funcionamiento del teléfono.

Para ti, si quieres portar tu aplicación en poco tiempo, te recomiendo 2; si tiene tiempo y otros recursos, 1 es mejor. 3 si solo haces un juguete / demo. 4 otros siempre es posible y solo haga su imaginación para crear obras.

Mis mejores deseos, siete


Investigar opciones viables

[ NOTA Esta respuesta contiene hallazgos que estaban en la pregunta original]

Investigué varias opciones un poco más y aquí hay algunos hallazgos preliminares.

0. Compilando NodeJS

Cada una de las opciones usa alguna forma de NodeJS compilada para Android. Pero para usar cualquier opción, es probable que desee compilar a diferentes versiones de Node, Android y arquitectura (x86, ARM, ARM64, etc.).

Esto es problemático NodeJS tiene un script de android-configure , pero esto da como resultado errores en la mayoría de las combinaciones que he probado. Creé varios problemas de github para un script de compilación en funcionamiento. En este tema, se recopilan los resultados:

Para resumir:

  • todas las compilaciones de bibliotecas compartidas fallan (excepto cuando se construye físicamente en su android, ver a continuación)
  • J2V8 con NodeJS ( libnode.a ) enlazado estáticamente en libj2v8.so funciona para 7.x hasta 7.9.0
  • build-as-node-executable funciona para 7.x (utilizando script de compilación dna2oslab )

Una solución interesante fue utilizada por @mafintosh : transferir Nodo al dispositivo usando Termux y hacer la compilación allí (necesita mucho espacio y tiempo, pero funciona).

1. Ejecutando el motor de javascript V8 que incluye NodeJS ( J2V8 )

J2V8 es un conjunto de enlaces de Java para V8. J2V8 se centra en el rendimiento y la estrecha integración con V8. [...] [que] obliga a un sistema de tipo más estático entre el código JS y Java, pero también mejora el rendimiento ya que los Objetos intermedios no se crean. [...]

Construir J2V8 requiere construir tanto las partes nativas como la biblioteca Java (archivo .jar / .aar). Para construir las partes nativas primero construimos node.js como una biblioteca y luego vinculamos estáticamente J2V8 a eso. [...]

Para compilación cruzada, J2V8 usa Docker (android, linux, windows) y Vagrant (macos).

Ver slideshare: ejecutar NodeJS en Java World (o ver video de InfoQ , 32min.)

Caracteristicas :

  • reemplace el motor JavaScriptCore con v8 más potente (con NodeJS)
  • soporte multi-threading (hilos / trabajadores) a través de la capa adicional J2V8 JNI / Java
    • cada hilo puede tener su propia instancia de V8 aislado
  • Puente js-to-java bidireccional (llamada java desde script y viceversa)
  • Manejo integrado de errores / excepciones de 2 vías
  • hermoso sistema interactivo de compilación cruzada ( en proceso )
  • soporte de depuración de Chrome
  • otros, matrices tipadas, soporte ES6, ...

Caracteristicas :

  • Especifique las versiones para compilar en build_system/build_settings.py
  • Comience una compilación simplemente con python build.py --interactive , select build:

    [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

  • Seleccione los pasos de compilación (o all ):

    NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit

  • Compila V8 como biblioteca compartida libj2v8_{platform}_{abi}.{ext}

    • Nota : nodejs build step no puede compilar Node shared library (errors), crea estática libnode.a para vincularse en libj2v8.so
  • Tiene una capa JNI para hacer que grandes partes de v8 sean accesibles por Java
  • Características adicionales (por ejemplo, JS <-> puente de Java) implementadas en Java
  • El resultado final de compilación es un .aar de .aar para incluir como dependencia del proyecto

Pros :

  • Proyecto relativamente activo
  • Código de buena calidad que incluye pruebas de unidad Java
  • Agrega toda la potencia de Java a su kit de herramientas de diseño de aplicaciones
  • Excelente sistema de construcción intuitivo (una vez terminado)

Contras :

  • Documentación de uso pequeña, en su mayoría obsoleta
    • Especialmente indocumentado es el uso en proyectos de JS de gran escala (r)
  • Gran cantidad de código de pegamento JNI que debe mantenerse
  • El proyecto no está bien mantenido (muchos problemas abiertos antiguos, relaciones públicas no fusionadas)
    • Algunas relaciones públicas se quedan por 2 años sin siquiera obtener una respuesta. No está bien
  • Más difícil de entender la configuración del proyecto J2V8 (muchos archivos) que otras opciones
  • Problema de licencia ("Todos los derechos reservados" en la licencia de EPL 1.0)

2. Utilice NodeJS directamente, incrustado como biblioteca nativa ( node-on-android )

Nodo en Android funciona ejecutando su Node.js dentro de la aplicación de Android utilizando una biblioteca compartida. A continuación, agrupa un WebView que alberga su código de UI. Toda la interfaz de usuario es simplemente html / css / js clásico.

En la aplicación de nodo, puede requerir node-on-android para obtener acceso a WebView. Puede usar esto para cargar una página html en WebView .

Según node-on-android creador node-on-android ( @mafintosh ), esto es más fácil y mejor que J2V8, ya que compila V8 directamente como algo real .

Caracteristicas :

  • Cree aplicaciones NodeJS completas, incluida la interfaz de usuario (a través de WebView nativo)

Caracteristicas :

  • Directorios / archivos relevantes en el proyecto de la app gradle:
    • app/src/main/include/node con el nodo .h headers
    • app/src/main/jniLibs/arm64-v8a con libc++_shared.so y libnode.so
    • app/src/main/cpp con native-lib.cpp (incluye node.h )
    • Código Java, simplemente activa un Service con un nodo ejecutándose en un hilo separado
  • No tiene JNI para libnode.so , por lo que es private native void startNode(String... app); muestra como error en IDE (pero compila)
  • El proyecto NodeJS reside en android/app/src/main/assets/node
  • El código de NodeJS se transfiere al almacenamiento temporal y se ejecuta desde allí
  • La aplicación NodeJS especifica vistas para cargar en WebView a través de la función loadUrl expuesta
    • Servicio de nodo accesible a través del paquete NPM node-on-android

Pros :

  • Proyecto simple, no mucho código de plomería
  • Viene con una versión de nodo V8.x reciente lista para usar
  • Programación sencilla de la IU de la aplicación basada en HTML (por ejemplo, usando choo )
  • Funciona fuera de la caja :)

Contras :

  • Proyecto muy nuevo, solo código experimental aún
  • Viene solo para la arquitectura arm64 (soporte móvil completo planificado o construcción DIY)
    • Nota : ¡64 bits no se puede combinar con React Native ( no admite 64 bits )!
  • No es posible la UI nativa (a menos que se codifique en Gradle / Java / XML)
  • Sin soporte de depuración en la aplicación Node (AFAIK, pero tal vez se puede conectar a la WebView de alguna manera)

3. Combinación de React Native con NodeJS app-as-a-service ( reaccionar-native-node )

Ejecute un proceso real Node.js en segundo plano, detrás de una aplicación React Native.

Usando este paquete puedes: ejecutar servidores http en Android, usar streams de Node, interfaz con el sistema de archivos, descargar algunos procesos pesados ​​del hilo JS en React Native, ¡y más! Al ejecutar el Node.js real en Android, puede hacer todo lo que Node.js puede hacer en el escritorio.

Caracteristicas :

  • Utilice React Native para la interfaz de usuario, NodeJS como servicio en segundo plano

Caracteristicas :

  • Derivado de NodeBase
  • Muy similar a node-on-android (ejecuta Service with Node en un hilo separado)
    • Pero el node se compila / usa como aplicación, no como una biblioteca compartida incrustada
    • El código de la aplicación NodeJS se encuentra en {projectRoot}/background
    • El ejecutable de NodeJS está en /android/src/main/res/raw/bin_node_v710
    • En la aplicación de compilación, la aplicación de nodo se aplica y se desempaqueta en `/ android / src / main / res / raw / {appName}
    • El servicio NodeJS se invoca como si se ejecutara desde la línea de comando, pasando args
  • El nodo RNNode está disponible en RN al importar react-native-node
    • react-native-node también contiene CLI que transfiere el código del nodo al momento de la compilación
  • El proyecto de ejemplo se comunica desde React Native al servicio NodeJS a través de REST
    • Ejecución de un servidor express en http://localhost:5000 en el lado del nodo

Pros :

  • Proyecto simple, no mucho código de plomería
  • Obvio: ¡Reactiva el soporte nativo con NodeJS en Android!
  • El nodo como ejecutable probablemente funcionará con dispositivos de 64 bits + react-native

Contras :

  • Proyecto muy nuevo, solo código experimental aún
  • Viene con la versión anterior de NodeJS 7.1.0 (pero DIY crea nuevas versiones)
  • No es una forma fácil de comunicarse entre aplicaciones RN y Node (basado en REST)
    • Necesidad de extender la API REST o hacer rodar su propio mecanismo
  • Sin soporte de depuración en la aplicación Node. Realmente es difícil saber qué está pasando

Estado (2017-08-17)

Mi objetivo es React Native + NodeJS. Este es el estado de mis actividades:

  • Compilar las versiones de NodeJS v7.x como ejecutable funciona
  • La compilación de NodeJS v7.4.0 hasta v7.9.0 funciona con el nuevo sistema de compilación J2V8
  • Compilando NodeJS v8.1.2 pronto funcionará con J2v8 (compilado contra libc++ )
  • react-native-node se compila, pero no funciona a pesar de muchos intentos
  • node-on-android funciona, pero el desarrollo de aplicaciones solo-nodo e incompatible de 64 bits con RN

Decidí combinar react-native-node con J2V8 debido a:

React Native 0.46.4 + ¡NodeJS 7.9.0 ya está funcionando! Ver:

Mi caso de uso: cliente gordo con redes descentralizadas P2P

Estoy pensando en un diseño CQRS (comando-consulta-responsabilidad-segregación):

  • La interfaz de usuario de react-native se construye desde la vista consultada desde el servicio de nodo
  • Las acciones de IU nativas a la reacción activan los comandos en el servicio de fondo del nodo
  • el servicio en segundo plano procesa los mensajes de red, los comandos entrantes, los eventos desencadenantes
  • los eventos se almacenan en Realm DB que forma el puente entre el frente y la parte posterior

Detalles: Realm.io para unir el nativo NodeJS + React Native en la aplicación cliente de Android (estilo CQRS)

Conclusión

Incluso después de años de personas tratando de portar NodeJS a Android, todavía no hay soluciones realmente buenas, es pionera.

Espere muchos obstáculos y errores a medida que configura su proyecto y entorno de construcción, pero una vez configurada podrá disfrutar de toda la potencia de Node en su teléfono.