it-swarm.com.de

Mögliche Optionen zum Ausführen von NodeJS auf Android (Aug 2017)

Es gibt eine Reihe alter SO - Threads, die sich mit der Ausführung von NodeJS unter Android beschäftigen. Die meisten davon sind nicht mehr funktionsfähig (JXCore) und/oder liefern verwirrende, veraltete, unvollständige oder fehlerhafte Informationen.

Daher habe ich untersucht, was derzeit (Stand August 2017) gangbar erscheint, und drei mögliche Kandidaten gefunden.

Um zwischen ihnen zu entscheiden, würde ich gerne wissen:

  • die Hauptunterschiede zwischen diesen Ansätzen
  • spezifische Vor- und Nachteile bei jedem Ansatz
  • mögliche Hürden, Herausforderungen und Unzulänglichkeiten
  • kennen Sie andere mögliche Alternativen?

Mögliche Ansätze sind:

  1. V8-Javascript-Engine mit NodeJS ( J2V8 ) wird ausgeführt
  2. Verwenden Sie NodeJS direkt als eingebettete Bibliothek ( node-on-Android ).
  3. React Native mit NodeJS App-as-a-Service kombinieren ( React-Native-Node )

Daneben habe ich eine Reihe von verwandten interessanten Quellen gefunden:

  • NPM installiert NodeJS direkt mit Termux ohne Rooten (nicht für Endbenutzer)
  • LiquidCore - native mobile Mikro-App-Geräte (nicht untersucht, interessante Konzepte)
  • dna2oslab - verfügt über ein funktionierendes NodeJS-Buildskript für ausführbare Knoten
  • Erstellen von NodeJS für Android - Blog mit nützlichen Tipps zur Erstellung und Beispielprojekt
28

Machbare Optionen untersuchen

[ [~ # ~] note [~ # ~] Diese Antwort enthält Ergebnisse, die in waren die ursprüngliche Frage]

Ich habe die verschiedenen Optionen etwas genauer untersucht und hier einige vorläufige Ergebnisse.

0. Kompilieren von NodeJS

Jede der Optionen verwendet eine für Android kompilierte Form von NodeJS. Wenn Sie jedoch eine beliebige Option verwenden möchten, möchten Sie wahrscheinlich die Kompilierung auf verschiedene Knoten-, Android - und Architekturversionen (x86, ARM, ARM64 usw.) durchführen.

Das ist problematisch. NodeJS hat ein Android-configure - Skript, aber dies führt in den meisten Kombinationen, die ich ausprobiert habe, zu Fehlern. Ich habe eine Reihe von Github-Problemen für ein funktionierendes Build-Skript erstellt. In dieser Ausgabe werden Ergebnisse gesammelt:

Zusammenfassen:

  • builds für gemeinsam genutzte Bibliotheken schlagen alle fehl (außer wenn sie physisch auf Ihrem Android erstellt wurden, siehe unten)
  • J2V8 mit NodeJS (libnode.a), Das statisch in libj2v8.so Verknüpft ist, funktioniert für 7.x bis 7.9.0
  • build-as-node-executable funktioniert für 7.x (mit dna2oslab build script)

Eine interessante Problemumgehung wurde von @ mafintosh : transfer Node to device using Termux und dort kompilieren (benötigt viel Platz und Zeit, funktioniert aber) verwendet.

1. Ausführen der V8-Javascript-Engine mit NodeJS ( J2V8 )

J2V8 ist eine Reihe von Java - Bindungen für V8. J2V8 konzentriert sich auf Leistung und enge Integration mit V8. [...] [wodurch] ein statischeres Typsystem zwischen dem JS- und Java - Code erzwungen wird, aber auch die Leistung verbessert wird, da keine Zwischenobjekte erstellt werden. [...]

Für das Erstellen von J2V8 müssen sowohl die nativen Teile als auch die Bibliothek Java (.jar/.aar-Datei) erstellt werden. Um die nativen Teile zu erstellen, erstellen wir zuerst node.js als Bibliothek und verknüpfen dann J2V8 statisch damit. [...]

Zum Cross-Compilieren verwendet J2V8 Docker (Android, Linux, Windows) und Vagrant (MacOS).

Siehe SlideShare: Ausführen von NodeJS in einer Java - Welt (oder siehe InfoQ-Video , 32 Min.)

Funktionen :

  • ersetzen Sie die JavaScriptCore-Engine durch eine leistungsfähigere Version 8 (mit NodeJS).
  • multithreading (Threads/Worker) -Unterstützung über hinzugefügte J2V8-JNI/Java -Schicht
    • jeder Thread kann eine eigene isolierte V8-Instanz haben
  • 2-Wege-Js-to-Java-Bridge (Aufruf von Java aus dem Skript und umgekehrt)
  • Integrierte 2-Wege-Fehler-/Ausnahmebehandlung
  • schönes interaktives kompilierendes Build-System ( in Arbeit )
  • chrome-Debugging-Unterstützung
  • andere, typisierte Arrays, ES6-Unterstützung, ...

Eigenschaften :

  • Geben Sie die zu kompilierenden Versionen in build_system/build_settings.py An.
  • Starte einen Build einfach mit python build.py --interactive, Wähle 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
    
  • Build-Schritte auswählen (oder all):

    NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit
    
  • Kompiliert V8 als Shared Library libj2v8_{platform}_{abi}.{ext}

    • Hinweis : Der Erstellungsschritt nodejs kann die gemeinsam genutzte Bibliothek Node nicht erstellen (Fehler), erstellt statisch libnode.a Für in libj2v8.so verlinkt sein
  • Verfügt über eine JNI-Ebene, um große Teile von v8 für Java zugänglich zu machen
  • In Java implementierte zusätzliche Funktionen (z. B. JS <-> Java - Bridge)
  • Die endgültige Build-Ausgabe ist ein Gradle .aar, Das als Projektabhängigkeit einbezogen werden soll

Vorteile :

  • Relativ aktives Projekt
  • Guter Qualitätscode, einschließlich Java Unit-Tests
  • Fügt Ihrem App-Design-Toolkit die volle Leistung von Java hinzu
  • Tolles, intuitives Build-System (sobald es fertig ist)

Nachteile :

  • Kleine, meist veraltete Verwendungsdokumentation
    • Besonders undokumentiert ist der Einsatz in großen (R) -großen JS-Projekten
  • Viele JNI-Klebercodes, die beibehalten werden müssen
  • Projekt nicht gut gepflegt (viele alte offene Probleme, nicht zusammengeführte PRs)
    • Einige PRs halten sich 2 Jahre lang auf, ohne überhaupt eine Antwort zu erhalten. Nicht gut
  • Schwieriger zu verstehen, J2V8-Projekt-Setup (viele Dateien) als andere Optionen
  • Lizenzierungsproblem ("Alle Rechte vorbehalten" in der EPL 1.0-Lizenz)

2. Verwenden Sie NodeJS direkt, eingebettet als native Bibliothek ( node-on-Android )

Knoten auf Android wird ausgeführt, indem Sie Node.js in der Android - App mithilfe einer gemeinsam genutzten Bibliothek ausführen. Anschließend wird ein WebView gebündelt, das Ihren UI-Code hostet. Alle UI ist nur klassische HTML/CSS/JS.

In der Node-App können Sie node-on-Android Benötigen, um auf das WebView zugreifen zu können. Sie können dies verwenden, um eine HTML-Seite in das WebView zu laden.

Laut node-on-Android Creator ( @ mafintosh ) ist dies einfacher und besser als J2V8, da es V8 direkt kompiliert wie das Original.

Funktionen :

  • Erstellen Sie vollwertige NodeJS-Anwendungen, einschließlich der Benutzeroberfläche (über natives WebView)

Eigenschaften :

  • Relevante Verzeichnisse/Dateien in gradle app project:
    • app/src/main/include/node Mit den Kopfzeilen des Knotens .h
    • app/src/main/jniLibs/arm64-v8a Mit libc++_shared.so Und libnode.so
    • app/src/main/cpp Mit native-lib.cpp (Enthält node.h)
    • Java-Code startet einfach ein Service, wobei der Knoten in einem separaten Thread ausgeführt wird
  • Hat keine JNI für libnode.so, So dass private native void startNode(String... app); als Fehler in IDE angezeigt wird (aber kompiliert)
  • Das NodeJS-Projekt befindet sich in Android/app/src/main/assets/node
  • NodeJS-Code wird in den Zwischenspeicher übertragen und von dort ausgeführt
  • Die NodeJS-App gibt Ansichten an, die in WebView über die exponierte loadUrl -Funktion Geladen werden sollen.
    • Knotendienst über NPM-Paket erreichbar node-on-Android

Vorteile :

  • Einfaches Projekt, nicht viel Installationscode
  • Kommt mit einer aktuellen Version von v8.x Node, die sofort einsatzbereit ist
  • Einfache HTML-basierte App-UI-Programmierung (z. B. mit choo )
  • Funktioniert sofort :)

Nachteile :

  • Sehr neues Projekt, nur noch experimenteller Code
  • Kommt nur für arm64 Architektur (volle mobile Unterstützung geplant oder DIY Build)
  • Keine native Benutzeroberfläche möglich (außer Codierung in Gradle/Java/XML)
  • Keine Debugging-Unterstützung in der Node App (AFAIK, aber vielleicht kannst du irgendwie eine Verbindung zum WebView herstellen)

3. React Native mit NodeJS App-as-a-Service kombinieren ( Native-Native-Node reagieren )

Führe einen echten Node.js-Prozess im Hintergrund hinter einer React Native-App aus.

Mit diesem Paket können Sie: http-Server in Android ausführen, Node - Streams verwenden, eine Schnittstelle zum Dateisystem herstellen, eine umfangreiche Verarbeitung aus dem JS-Thread in React Native auslagern und vieles mehr! Wenn Sie die echten Node.js in Android ausführen, können Sie alles tun, was Node.js auf dem Desktop kann.

Funktionen :

  • Verwenden Sie React Native für die Benutzeroberfläche NodeJS als Hintergrunddienst

Eigenschaften :

  • Abgeleitet von NodeBase
  • Sehr ähnlich zu Node-on-Android (führen Sie Service mit Node auf einem separaten Thread aus)
    • Aber node wird als Anwendung kompiliert/verwendet, keine eingebettete gemeinsam genutzte Bibliothek
    • Der NodeJS-App-Code befindet sich in {projectRoot}/background
    • Die ausführbare NodeJS-Datei befindet sich in /Android/src/main/res/raw/bin_node_v710
    • Zum Zeitpunkt der Erstellung wird die Node App gespeichert und unter `/ Android/src/main/res/raw/{appName} entpackt.
    • Der NodeJS-Dienst wird so aufgerufen, als würde er über die Befehlszeile ausgeführt und dabei Argumente übergeben
  • Der Knotendienst RNNode ist in RN durch Importieren von react-native-node Verfügbar.
    • react-native-node Enthält auch eine CLI, die zum Zeitpunkt der Erstellung Node Code überträgt
  • Das Beispielprojekt kommuniziert vom React Native zum NodeJS-Dienst über REST
    • Einen express Server auf http://localhost:5000 Auf der Seite Node ausführen

Vorteile :

  • Einfaches Projekt, nicht viel Installationscode
  • Offensichtlich: React Native Unterstützung mit NodeJS auf Android!
  • Node-as-Executable wird wahrscheinlich mit 64-Bit-Geräte + React-Native funktionieren

Nachteile :

  • Sehr neues Projekt, nur noch experimenteller Code
  • Kommt mit alter NodeJS 7.1.0 Version (aber DIY Build neueren)
  • Keine einfache Möglichkeit zur Kommunikation zwischen RN- und Node - Apps (REST-basiert)
    • Müssen Sie REST API erweitern oder Ihren eigenen Mechanismus rollen
  • Keine Debugging-Unterstützung für die App Node. Wirklich schwer zu wissen, was los ist

Status (2017-08-17)

Mein Ziel ist React Native + NodeJS. Dies ist der Status meiner Aktivitäten:

  • Das Kompilieren von NodeJS v7.x-Versionen als ausführbare Datei funktioniert
  • Das Kompilieren von NodeJS v7.4.0 bis v7.9.0 funktioniert mit dem neuen J2V8-Buildsystem
  • Das Kompilieren von NodeJS v8.1.2 wird in Kürze mit J2v8 funktionieren (kompiliert gegen libc++)
  • react-native-node Kompiliert, funktioniert aber trotz vieler Versuche nicht
  • node-on-Android Funktioniert, aber die Entwicklung von Node-Only-Apps und 64-Bit-Versionen sind mit RN nicht kompatibel

Ich habe mich entschieden, react-native-node Mit J2V8 Zu kombinieren, weil:

React Native 0.46.4 + NodeJS 7.9.0 Funktioniert jetzt! Sehen:


Mein Anwendungsfall: Fat Client mit dezentraler P2P-Vernetzung

Ich denke an ein CQRS-Design (Command-Query-Responsibility-Segregation):

  • die reaktionsnative Benutzeroberfläche wird aus der vom Knotendienst abgefragten Ansicht erstellt
  • reaktionsunabhängige Benutzeroberflächenaktionen lösen Befehle im Knotenhintergrunddienst aus
  • hintergrunddienst verarbeitet Netzwerknachrichten, eingehende Befehle, löst Ereignisse aus
  • ereignisse werden in der Realm-Datenbank gespeichert, die die Brücke zwischen Vorder- und Rückseite bildet

Details: Realm.io, um native NodeJS + React Native in Android Fat Client-App (CQRS-Stil) zu überbrücken


Fazit

Selbst nach Jahren, in denen Leute versucht haben, NodeJS auf Android zu portieren, gibt es immer noch keine wirklich guten Lösungen. Es ist wegweisend.

Erwarten Sie beim Einrichten Ihres Projekts und der Build-Umgebung viele Hürden und Fehler, aber sobald Sie es eingerichtet haben, können Sie die volle Leistung von Node auf Ihrem Telefon nutzen.

15

Ab heute (März 2018) gibt es eine andere praktikable Alternative, die in den aktuellen Antworten noch nicht aufgeführt ist: Node.js für Mobile Apps

Im Kern bietet das Projekt eine native Bibliothek zum Einbetten von Node.js in native Android- und iOS-Anwendungen. es kommt aber auch mit Plugins für React Native und Cordova .

Vorgefertigte Binärdateien für die Bibliothek sind für Android-Modelle armeabi-v7a, x86, arm64-v8a, x86_64 und für iOS 64-Bit verfügbar.

Die Kernbibliothek ist eine Gabel von nodejs/node-chakracore , die wiederum eine Gabel von nodejs/node ist. Die Android-Version ist so ziemlich normal, dass Node.js als Bibliothek erstellt wurde, mit ein paar Korrekturen für die Portabilität. In der iOS-Version wird anstelle von V8 die ChakraCore-Engine verwendet (V8 durch ChakraCore zu ersetzen, ist dank der Änderungen in den Knoten js/node-chakracore möglich).

Die Plugins React Native und Cordova erleichtern das Hinzufügen von Node.js zu Anwendungen, die mit diesen Frameworks erstellt wurden. Der Node.js-Code wird in einer separaten Engine und einem anderen Thread als dem Framework (React Native/Cordova) ausgeführt. Die Kommunikation zwischen den beiden JavaScript-Welten erfolgt über eine von den Plugins bereitgestellte Messaging-Bridge.

Weitere Informationen, einschließlich einiger Dokumentation, finden Sie auf der Website project .

(Vollständige Offenlegung: Ich arbeite für das Unternehmen, das Node.js für Mobile Apps entwickelt.)

9

Ich habe eine Antwort von @ dna2github erhalten, dem Ersteller von NodeBase (vielen Dank!), Die ich hier (mit Erlaubnis) einschließen werde:


Hallo,

Danke für deine Frage. Ich werde aus meiner Sicht eine kurze Antwort geben.

1. Ausführen von V8-JavaScript-Engine auf Android, einschließlich NodeJS

profis:

  • in die Java-Welt integriert; kann die volle Kontrolle über den Code erlangen.

nachteile:

  • ein wenig schwer zu integrieren mit 3. Paketen (brauchen Zeit, um zu lernen wie).
  • sie müssen etwas über NodeJS und V8 sowie über J2V8-Dokumente lernen (dies verbraucht viel Zeit).

2. Kompilieren Sie NodeJS als native Bibliothek (mit Node-on-Android)

profis:

  • konzentrieren Sie sich auf js dev und müssen nicht auf die Android-Seite achten.
  • weniger Lernzeit; ähnlich wie Cordova Phonegap ....

nachteile:

  • js app => apk ist eine Blackbox.

3. NodeJS unter Android mit Termux ausführen

profis:

  • flexibel

nachteile:

  • keine gui

4. Andere interessante Ansätze

Nicht vertraut mit LiquidCore; Build-Micro-Service vor allem von URL, denke ich, ist kein direkt verfügbarer Speicher unter iOS aufzulösen. Reaktiver-Knoten Der Android-Teil basiert auf der NodeBase-Methode und verwendet die vorgefertigte Binärdatei. 

Für NodeBase:

profis:

  • ähnlich wie 3; Unterschied ist, dass es eine eigene GUI zum Starten/Stoppen der App hat.
  • es kann eine Vorlage für alles sein; Wenn Sie beispielsweise Django ausführen möchten, müssen Sie nur den Knoten in Python ersetzen. Schienen, Rubin ...

nachteile:

  • natives Prozesszugriffsproblem; Der Prozess kann den Zugriff von der Android-App nicht erben.
  • happy Toy Happy Open Source nicht wie eine kommerzielle App; Sie benötigen mehr Design, wenn Sie sie an Kunden verteilen möchten

Zuerst führe ich Knoten im Terminal aus; Ich finde nur dev kann es leicht verwenden, um js App zu starten. Meine Freunde und Familien möchten auch ein paar Werkzeuge, um beispielsweise Wasserzeichen auf dem Bild in Serie zu machen. NodeBase wird erstellt, damit die App einfach gestartet/gestoppt werden kann. Dann müssen sie lediglich den Browser öffnen, um ihn verwenden zu können. Meine weitere Idee zur Erstellung von NodeBase besteht darin, dass wir gemeinsam nutzbare Anwendungen erstellen können, die in demselben Wi-Fi gemeinsam genutzt werden können. Wenn der Host eine App startet, kann sie von Personen in der Nähe besucht werden. Dann können sie zusammen arbeiten und spielen. Zum Beispiel spielen wir Werwolf, und wenn es keinen Richter gibt, werden wir mit der Werwolf-App einen Richter für die erste Runde haben. Wir können Dateien auch per Download/Upload zwischen Geräten teilen.

Für mich kann ich flexibel bauen, was ich will, zum Beispiel möchte ich mein Android als Machine Learning Runner machen; Es kann mir dabei helfen, jederzeit maschinelle Lernprogramme auszuführen (mit Knoten und Python, also in meinem anderen Repo: dna2oslab ist der Fokus auf das Erstellen von Binärdateien), um die Telefonlaufzeit zu nutzen.

Für Sie, wenn Sie Ihre App in kurzer Zeit portieren möchten, empfehle ich 2; Wenn Sie Zeit und andere Ressourcen haben, ist 1 besser. 3, wenn Sie gerade ein Spielzeug/eine Demo machen. 4 andere sind immer möglich und lassen Sie Ihrer Vorstellung freien Lauf.

Beste Wünsche, Sieben

2

Ich bin der Autor von LiquidCore . Mit LiquidCore können Sie vollständige Implementierungen von Node.js sowohl für Android als auch für iOS verwenden (iOS-Unterstützung wurde kürzlich in Version 0.5.0 - September 2018 veröffentlicht).

LiquidCore ist so konzipiert, dass mehrere Instanzen von Node gleichzeitig in einer nativen mobilen App ausgeführt werden können. Jede Instanz verfügt über ein eigenes virtuelles Dateisystem und eine systemeigene Unterstützung für MySQL. Das Ziel des Projekts ist es, vollständige "Mikro-Apps" mit JavaScript/WebAssembly zu erstellen, die dann in andere Apps eingebettet werden können, und ich arbeite immer noch auf dieses Ziel hin. Aber ab heute funktioniert es hervorragend, wenn Sie nur einen Node.js-Spielplatz suchen.

Wenn Sie sehen möchten, was es kann, gibt es eine einfache Knotenkonsolen-App für Android und iOS .

2
Eric Lange

Ich habe versucht, J2V8 in meiner Android-Java-App zu verwenden, um ein JS-Skript über node.js auszuführen. Es schlägt mit diesem Fehler fehl:

Java.lang.UnsupportedOperationException: StartNodeJS nicht unterstützt.

Die Antwort von J2V8 war:

"Die Node-Wrapper sind auf Android nicht verfügbar. Sie sind nur auf Desktop-Plattformen (Windows, Mac, Linux) verfügbar. Dies ist das erwartete Verhalten, bis wir Knoten-Binärdateien für Android haben."

Soweit ich weiß, gibt es derzeit keine Pläne, Node-Wrapper für Android zu implementieren.

Vielen Dank,

Alex Donnini

0
user1673603