web-dev-qa-db-ja.com

Android(2017年8月)でNodeJSを実行するための実行可能なオプション

AndroidでNodeJSを実行することを扱う古いSOスレッドがたくさんあります。これらのほとんどはもはや実行可能(JXCore)ではなく、かつ/または混乱、古く、不完全、または誤った情報を提供します。

したがって、現在(2017年8月現在)実行可能なアプローチと思われるものを調査し、3つの候補を見つけました。

それらの間で決定するために、私は知りたいです:

  • これらのアプローチの主な違い
  • 各アプローチの特定の長所と短所
  • おそらくハードル、課題、欠点
  • 他の実行可能な代替手段を知っていますか?

実行可能なアプローチは次のとおりです

  1. NodeJSを含むV8 JavaScriptエンジンの実行( J2V8
  2. NodeJSを直接使用し、ネイティブライブラリとして埋め込みます( node-on-Android
  3. React NodeJS app-as-a-serviceとのネイティブ( react-native-node )の組み合わせ

それに加えて、関連する興味深いリソースがいくつか見つかりました。

  • NPMは、ルート化せずにTermuxを使用してNodeJSを直接インストールします(エンドユーザー用ではありません)
  • LiquidCore -ネイティブモバイルマイクロアプリdevenv(未調査、興味深い概念)
  • dna2oslab -ノード実行可能ファイル用の有効なNodeJSビルドスクリプトがあります
  • Android用NodeJSの構築 -便利なコンパイルのヒントと プロジェクト例 のブログ
32

実行可能なオプションの調査

[ [〜#〜] note [〜#〜] この回答には、元の質問にあった発見]

さまざまなオプションについてもう少し調査しましたが、ここにいくつかの予備的な調査結果があります。

0. NodeJSのコンパイル

各オプションは、Android用にコンパイルされたNodeJSの形式を使用します。ただし、オプションを使用するには、おそらく異なるノード、Android、およびアーキテクチャ(x86、ARM、ARM64など)バージョンにコンパイルする必要があります。

これには問題があります。 NodeJSにはAndroid-configureスクリプトがありますが、これは私が試したほとんどの組み合わせでエラーになります。ビルドスクリプトを機能させるために、githubの問題をいくつか作成しました。この問題では、結果が収集されます。

要約する:

  • 共有ライブラリのビルドはすべて失敗します(Android上で物理的にビルドする場合を除き、以下を参照)
  • libnode.aで静的にリンクされたNodeJS(libj2v8.so)を含むJ2V8は、7.xから7.9.0まで動作します
  • build-as-node-executableは7.xで動作します( dna2oslab ビルドスクリプトを使用)

@ mafintosh :Termuxを使用してNodeをデバイスに転送し、 そこでコンパイルを実行 (多くのスペースと時間を必要としますが、動作します)で興味深い回避策が使用されました。

1. NodeJSを含むV8 JavaScriptエンジンの実行( J2V8

J2V8は、V8のJavaバインディングのセットです。 J2V8は、パフォーマンスとV8との緊密な統合に重点を置いています。 [...] [これは] JSコードとJavaコード間でより静的な型システムを強制しますが、中間オブジェクトが作成されないため、パフォーマンスも向上します。 [...]

J2V8をビルドするには、ネイティブパーツとJavaライブラリ(.jar/.aarファイル)の両方をビルドする必要があります。ネイティブパーツをビルドするには、まずnode.jsをライブラリとしてビルドしてから、J2V8をそれに静的にリンクします。 [...]

J2V8のクロスコンパイルには、Docker(Android、Linux、Windows)とVagrant(macos)を使用します。

スライドシェアを参照してください: Java世界でNodeJSを実行する (または InfoQビデオ 、32分を参照)

機能

  • javaScriptCoreエンジンをより強力なv8に置き換えます(NodeJSを使用)
  • 追加されたJ2V8 JNI/Javaレイヤーを介したマルチスレッド(スレッド/ワーカー)サポート
    • すべてのスレッドが独自の分離V8インスタンスを持つことができます
  • 2方向のjs-to-Javaブリッジ(スクリプトからJavaを呼び出す、またはその逆)
  • 双方向の統合エラー/例外処理
  • 美しいクロスコンパイルインタラクティブビルドシステム( in the works
  • クロームデバッグサポート
  • その他、型付き配列、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を作成します
  • Javaでv8の大部分にアクセスできるようにするJNIレイヤーがあります
  • Javaに実装された追加機能(JS <-> Javaブリッジなど)
  • 最終ビルド出力は、プロジェクトの依存関係として含めるためのGradle .aarです

長所

  • 比較的活発なプロジェクト
  • Java単体テストを含む良質のコード
  • Javaの全機能をアプリ設計ツールキットに追加します
  • 優れた直感的なビルドシステム(一度終了)

短所

  • ほとんど、ほとんど使用されていない使用ドキュメント
    • 特に文書化されていないのは、大規模(r)規模のJSプロジェクトでの使用です
  • 維持する必要のある多くのJNIグルーコード
  • プロジェクトが十分に管理されていない(多くの古い未解決の問題、マージされていないPR)
    • 一部のPRは、応答さえ得られずに2年間ぶらぶらしています。良くない
  • J2V8プロジェクトのセットアップ(多くのファイル)を他のオプションよりも理解しにくい
  • ライセンスの問題 (EPL 1.0ライセンスの「すべての権利予約」)

2.ネイティブライブラリとして埋め込まれたNodeJSを直接使用します( node-on-Android

Androidのノードは、共有ライブラリを使用してAndroidアプリ内でNode.jsを実行することで機能します。次に、UIコードをホストするWebViewをバンドルします。すべてのUIは、古典的なhtml/css/jsです。

ノードアプリでは、node-on-Androidを要求してWebViewにアクセスできます。これを使用して、WebViewにhtmlページをロードできます。

node-on-Android作成者( @ mafintosh )によると、これはV8を直接本物としてコンパイルするため、J2V8より簡単で優れています。

機能

  • UIを含む本格的なNodeJSアプリケーションを構築する(ネイティブWebView経由)

特性

  • Gradle app project:の関連ディレクトリ/ファイル
    • ノードapp/src/main/include/nodeヘッダーを持つ.h
    • app/src/main/jniLibs/arm64-v8alibc++_shared.soおよびlibnode.so
    • app/src/main/cppnative-lib.cppnode.hを含む)
    • Javaコード、ノードを別のスレッドで実行してServiceをスピンアップするだけ
  • libnode.soのJNIがないため、private native void startNode(String... app);はIDEでエラーとして表示されます(ただしコンパイルされます)
  • NodeJSプロジェクトはAndroid/app/src/main/assets/nodeにあります
  • NodeJSコードは一時ストレージに転送され、そこから実行されます
  • NodeJSアプリは、公開されたloadUrl function を介してWebViewにロードするビューを指定します
    • NPMパッケージnode-on-Androidを介してアクセス可能なノードサービス

長所

  • 単純なプロジェクト、配管コードはそれほど多くない
  • すぐに使える最新のv8.x Nodeバージョンが付属
  • シンプルなHTMLベースのアプリUIプログラミング(例: choo を使用)
  • すぐに使える:)

短所

  • 非常に新しいプロジェクト、まだ実験的なコードのみ
  • arm64アーキテクチャ(フルモバイルサポート予定、またはDIYビルド)専用です
  • ネイティブUIは使用できません(Gradle/Java/XMLでコーディングしない限り)
  • Nodeアプリのデバッグサポートはありません(おそらく、WebViewに何らかの方法で添付できます)

3. React NativeとNodeJS app-as-a-serviceの組み合わせ( react-native-node

Reactネイティブアプリの背後で、バックグラウンドでrealNode.jsプロセスを実行します。

このパッケージを使用すると、Androidでhttpサーバーを実行し、Nodeストリームを使用し、ファイルシステムとインターフェイスし、React NativeのJSスレッドから重い処理をオフロードできます。 Androidで実際のNode.jsを実行すると、デスクトップ上のNode.jsでできることをすべて実行できます。

機能

  • UIのReactネイティブ、NodeJSをバックグラウンドサービスとして使用する

特性

  • NodeBase から派生
  • Android上のノードに非常に似ています(別のスレッドでNodeを使用してServiceを実行します)
    • ただし、nodeは、組み込み共有ライブラリではなく、アプリケーションとしてコンパイル/使用されます
    • NodeJSアプリコードは{projectRoot}/backgroundにあります
    • NodeJS実行可能ファイルは/Android/src/main/res/raw/bin_node_v710にあります
    • ビルド時にNodeアプリはtarballされ、 `/ Android/src/main/res/raw/{appName}で解凍されます
    • NodeJSサービスは、コマンドラインから実行するかのように呼び出され、引数を渡します
  • ノードサービスRNNodeは、react-native-node [.____をインポートすることでRNで利用可能です。]
    • react-native-nodeには、ビルド時にNodeコードを転送するCLIも含まれています
  • サンプルプロジェクトは、React NativeからNodeJSサービスにREST を介して通信します
    • Node側のhttp://localhost:5000expressサーバーを実行しています

長所

  • 単純なプロジェクト、配管コードはそれほど多くない
  • 自明:React AndroidでのNodeJSのネイティブサポート!
  • Node-as-executableはおそらく 64ビットデバイス+ react-native で動作します

短所

  • 非常に新しいプロジェクト、まだ実験的なコードのみ
  • 古いNodeJS 7.1.0バージョンが付属しています(ただし、 DIYビルド 新しいバージョン)
  • RNアプリとNodeアプリ間で通信する簡単な方法はありません(RESTベース)
    • 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は動作しますが、ノードのみのアプリ開発であり、64ビットはRNと互換性がありません

私はreact-native-nodeJ2V8を組み合わせることにしました:

React Native 0.46.4 + NodeJS 7.9.0が動作するようになりました!見る:


私の使用例: P2P分散ネットワークを使用した脂肪クライアント

私はCQRS(コマンドクエリ責任責任分離)デザインを考えています。

  • 反応ネイティブUIは、ノードサービスから照会されたビューから構築されます
  • 反応ネイティブUIアクションは、ノードバックグラウンドサービスでコマンドをトリガーします
  • バックグラウンドサービスはネットワークメッセージ、着信コマンドを処理し、イベントをトリガーします
  • イベントは、フロントとバックの間のブリッジを形成するレルムDBに保存されます

詳細: Realm.ioがネイティブNodeJSをブリッジ+ ReactネイティブAndroid脂肪クライアントアプリ(CQRSスタイル)


結論

NodeJSをAndroidに移植しようとしている人々が何年も経った後でも、本当に良いソリューションはまだありません。

プロジェクトをセットアップして環境を構築する際には、多くのハードルとエラーが予想されますが、一度セットアップすれば、携帯電話でNodeを最大限に活用できます。

15

今日(2018年3月)には、現在の回答にまだリストされていない別の実行可能な代替手段があります: Node.js for Mobile Apps

その中核で、このプロジェクトは、Node.jsをネイティブAndroidおよびiOSアプリケーションに埋め込むためのネイティブライブラリを提供します。ただし、 React Native および- Cordova

ライブラリのビルド済みバイナリは、Android armeabi-v7a、x86、arm64-v8a、x86_64、およびiOS 64ビットで使用可能です。

コアライブラリは nodejs/node-chakracore のフォークであり、これは nodejs/node のフォークです。 Androidバージョンは、いくつかの移植性を修正して、ライブラリとして構築されたほぼ通常のNode.jsです。iOSバージョンは、V8の代わりにChakraCoreエンジンを使用します(V8をChakraCoreに置き換えることは、 nodejs/node-chakracoreフォークの変更)。

React NativeおよびCordovaプラグインにより、これらのフレームワークを使用して構築されたアプリケーションにNode.jsを簡単に追加できます。Node.jsコードは、フレームワークの(React Native/Cordova )。2つのJavaScriptワールド間の通信は、プラグインによって提供されるメッセージングブリッジを介して実現されます。

いくつかのドキュメントを含む詳細情報は、 プロジェクトWebサイト で入手できます。

(完全開示:私は、モバイルアプリ向けNode.jsを開発する会社で働いています。)

10

Noded) の作成者である @ dna2github から answer を受け取りました(感謝します!)


こんにちは、

あなたの質問のためのTHX。私は私の意見で簡単な答えをします。

1. NodeJSを含むAndroidでV8 JavaScriptエンジンを実行

長所:

  • Java world;と統合され、コードを完全に制御できます。

短所:

  • 3番目のパッケージとの統合が少し難しい(方法を学ぶのに時間が必要)。
  • nodeJSとV8のこと、そしてJ2V8のドキュメントについて学ぶ必要があります(長い時間を消費します)。

2. NodeJSをネイティブライブラリとしてコンパイルします(node-on-Androidを使用)

長所:

  • js devに焦点を当て、Android side。
  • 学習時間の短縮。 Cordova phonegapに似ています....

短所:

  • js app => apkはブラックボックスです。

3. Termuxを使用してAndroidでNodeJSを実行

長所:

  • フレキシブル

短所:

  • gUIなし

4.その他の興味深いアプローチ

LiquidCoreに馴染みがありません。特にURLからマイクロサービスを構築することは、iOSで直接利用可能なストレージを解決することだと思います。 react-native-node Android部分はNodeBaseメソッドに基づいており、ビルド済みのバイナリを使用します。

NodeBaseの場合:

長所:

  • 3と同様。違いは、アプリを起動/停止するための独自のGUIがあることです。
  • すべてのテンプレートにすることができます。たとえば、Djangoを実行する場合は、ノードをpythonに置き換えるだけです。 Rails、Ruby ...

短所:

  • ネイティブプロセスアクセスの問題。プロセスは、Android app。
  • 幸せなおもちゃ幸せなオープンソースは商用アプリとは違います。顧客に配布したい場合、より多くの設計が必要

最初に、ターミナルでノードを実行します。開発者だけが簡単にそれを使用してjsアプリを起動できることがわかりました。私の友人や家族もいくつかのツールを使いたいです。例えば、バッチで写真にウォーターマークを作成します。 NodeBaseは、アプリを簡単に起動/停止できるように作成されています。次に、ブラウザを開いて使用するだけです。 NodeBaseを作成するもう1つのアイデアは、同じWi-Fiで共有できる共有可能なアプリケーションを構築できるということです。ホストがアプリを起動すると、近くの人がアプリにアクセスできます。その後、彼らは一緒に働き、遊ぶことができます。たとえば、狼男を演じ、裁判官がいないときは、狼男アプリを起動して、最初のラウンドの裁判官を持ちます。また、ダウンロード/アップロードを介してデバイス間でファイルを共有することもできます。

私にとっては、たとえば、機械学習ランナーとしてAndroidにしたいと思います。ノードとpythonを使用して、いつでも機械学習プログラムを実行できます。 、したがって、私の別のレポで: dna2oslab は、バイナリの構築に焦点を当てています)電話の実行時間を利用します。

短時間でアプリを移植したい場合は、2をお勧めします。時間と他のリソースがある場合は、1の方が優れています。 3おもちゃ/デモを作成する場合。 4他は常に可能であり、作品を作成するためにあなたの想像力を発揮してください。

よろしく、セブン

2

私は LiquidCore の著者です。 LiquidCoreでは、Node.jsの完全な実装をAndroidとiOSの両方で使用できます(iOSサポートはバージョン0.5.0でリリースされました-2018年9月)。

LiquidCoreは、Nodeの複数のインスタンスをネイティブモバイルアプリ内で同時に実行できるように設計されています。各インスタンスには、独自の仮想ファイルシステムとMySQLのネイティブサポートがあります。プロジェクトの目標は、 JavaScript/WebAssemblyを使用して完全な「マイクロアプリ」を作成し、それを他のアプリに組み込むことができますが、私はまだその目標に向かって取り組んでいます。

できることを確認したい場合は、 AndroidiOS の両方に含まれるシンプルなノードコンソールアプリがあります。

2
Eric Lange

Android Javaアプリでnode.jsを介してJSスクリプトを実行します。このエラーで失敗します。

Java.lang.UnsupportedOperationException:StartNodeJSはサポートされていません。

J2V8からの応答は次のとおりです。

「ノードラッパーはAndroidでは使用できません。デスクトッププラットフォーム(windows、mac、linux)でのみ使用可能です。これはAndroidのノードバイナリができるまでの予想される動作です。」

私の知る限り、Android用のノードラッパーを実装する現在の計画はありません。

おかげで、

アレックス・ドニーニ

0
user1673603