gpt4 book ai didi

javascript - 在Android上运行NodeJS的可行选项(2017年8月)

转载 作者:行者123 更新时间:2023-12-02 16:45:52 26 4
gpt4 key购买 nike

有许多旧的SO线程处理在Android上运行NodeJS的问题。其中大多数不再可行(JXCore)和/或提供令人困惑,过时,不完整或错误的信息。

因此,我调查了目前(截至2017年8月)似乎可行的方法,并找到了三种可能的候选方法。

要在他们之间做出决定,我想知道:

  • 这些方法之间的主要区别
  • 每种方法的特定优点和缺点
  • 可能会遇到障碍,挑战和缺点
  • 您知道其他可行的选择吗?

  • 可行的方法是:
  • 正在运行V8 JavaScript引擎,其中包括NodeJS(J2V8)
  • 直接使用NodeJS,作为 native 库(node-on-android)嵌入
  • 将React Native与NodeJS app-as-a-service(react-native-node)结合

  • 除此之外,我还发现了许多相关的有趣资源:
  • NPM直接使用Termux来安装NodeJS,而无需生根(不适用于最终用户)
  • LiquidCore- native 移动微型应用程序开发(未调查,有趣的概念)
  • dna2oslab-具有适用于 Node 可执行文件的有效NodeJS构建脚本
  • Building NodeJS for Android-博客,其中包含有用的编译提示和example project
  • 最佳答案

    研究可行的选择

    [注意该答案包含原始问题中的发现]

    我对各种选择进行了更多研究,这是一些初步发现。

    0.编译NodeJS

    每个选项都使用某种形式的为Android编译的NodeJS。但是要使用任何选项,您可能希望将其编译为不同的Node,Android和体系结构(x86,ARM,ARM64等)版本。

    这是有问题的。 NodeJS有一个android-configure脚本,但这会导致我尝试过的大多数组合出现错误。我为有效的构建脚本创建了许多github问题。在本期中,将收集结果:

  • Working build script for Android ARM Node 7.x or 8.x shared library

  • 总结一下:
  • 共享库构建全部失败(除非在您的android上进行物理构建,请参见下文)
    libnode.a中静态链接的带有NodeJS(libj2v8.so)的
  • J2V8适用于7.x直到7.9.0
  • 构建为 Node 可执行的版本,适用于7.x(使用dna2oslab构建脚本)

  • @mafintosh使用了一种有趣的解决方法:使用Termux和 do the compilation there将Node传输到设备(需要大量的空间和时间,但是可以工作)。

    1.运行包含NodeJS( J2V8)的V8 JavaScript引擎

    J2V8 is a set of Java bindings for V8. J2V8 focuses on performance and tight integration with V8. [...] [which] forces a more static type system between the JS and Java code, but it also improves the performance since intermediate Objects are not created. [...]

    Building J2V8 requires building both the native parts and the Java library (.jar/.aar file). To build the native parts we first build node.js as a library and then statically link J2V8 to that. [...]

    For cross-compiling J2V8 uses Docker (android, linux, windows) and Vagrant (macos).



    请参阅slideshare: Running NodeJS in a Java World(或请参阅 InfoQ video,32分钟。)

    功能:
  • 用功能更强大的v8(带有NodeJS)替换JavaScriptCore引擎
  • 通过添加的J2V8 JNI/Java层来支持
  • 多线程(线程/ worker )
  • 每个线程可以有其自己的隔离V8实例
  • 2路js到Java桥(从脚本调用Java,反之亦然)
  • 2路集成错误/异常处理
  • 漂亮的交叉编译交互式构建系统(in the works)
  • Chrome调试支持
  • 其他,类型数组,ES6支持,...

  • 特性:
  • 指定要在build_system/build_settings.py中编译的版本
  • 只需使用python build.py --interactive开始构建,选择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
  • 选择构建步骤(或all):
    NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit
  • 将V8编译为共享库libj2v8_{platform}_{abi}.{ext}
  • 注意:nodejs构建步骤无法构建 Node 共享库(错误),创建要在libnode.a中链接的静态libj2v8.so
  • 具有一个JNI层,可以使Java可以访问v8的大部分
  • Java
  • 中实现的其他功能(例如JS <-> Java桥)
  • 最终构建输出是Gradle .aar,包含为项目依赖项

  • 优点:
  • 相对 Activity 的项目
  • 高质量代码,包括Java单元测试
  • 将Java的全部功能添加到您的应用程序设计工具包
  • 出色,直观的构建系统(完成后)

  • 缺点:
  • 很少使用,大多是过时的用法文档
  • 在大型JS项目中的用法尤其没有记载
  • 必须维护的许多JNI粘合代码
  • 项目维护得不好(许多旧的未解决问题,未合并的PR)
  • 一些公关公司徘徊了2年,甚至没有得到回应。不好
  • 与其他选项
  • 相比,更难理解J2V8项目设置(许多文件)
  • Licensing issue(EPL 1.0许可证中的“保留所有权利”)

  • 2.直接使用NodeJS,作为 native 库( node-on-android)嵌入

    Node on android works by running your Node.js inside the android app using a shared library. It then bundles a WebView that hosts your UI code. All UI is just classic html/css/js.

    In the node app you can require node-on-android to get access to the WebView. You can use this to load an html page in the WebView.



    根据 node-on-android创建者( @mafintosh)的说法,这比J2V8更容易和更好,因为它直接将V8编译为真实的东西。

    功能:
  • 构建成熟的NodeJS应用程序,包括UI(通过 native WebView)

  • 特性:
  • gradle app项目中的相关目录/文件:

    带有 Node app/src/main/include/node header 的
  • .h
  • app/src/main/jniLibs/arm64-v8alibc++_shared.solibnode.so
  • app/src/main/cppnative-lib.cpp(包括node.h)
  • Java代码,仅在 Node 运行在单独线程
  • 中的情况下启动 Service
  • 没有libnode.so的JNI,因此private native void startNode(String... app);在IDE中显示为错误(但会编译)
  • NodeJS项目驻留在android/app/src/main/assets/node
  • NodeJS代码被传输到临时存储并从那里执行
  • NodeJS应用程序通过公开的loadUrl函数指定要在WebView中加载的 View
  • 可通过NPM软件包node-on-android
  • 访问 Node 服务

    优点:
  • 简单的项目,没有太多的管道代码
  • 随附了最新的v8.x Node 版本
  • 基于HTML的简单应用程序UI编程(例如,使用choo)
  • 开箱即用:)

  • 缺点:
  • 非常新的项目,仍然只有实验代码
  • 仅适用于arm64体系结构(已计划全面的移动支持,或进行DIY构建)
  • 注意:64位不能与React Native(no 64-bit support)结合使用!
  • 没有 native UI(除非在Gradle/Java/XML中编码)
  • Node应用程序上没有调试支持(AFAIK,但也许您可以以某种方式连接到WebView)

  • 3.将React Native与NodeJS app-as-a-service( react-native-node)结合

    Run a real Node.js process in the background, behind a React Native app.

    Using this package you can: run http servers in Android, use Node streams, interface with the filesystem, offload some heavy processing out of the JS thread in React Native, and more! Running the real Node.js in Android, you can do everything that Node.js on desktop can.



    功能:
  • 将React Native用于UI,NodeJS作为后台服务

  • 特性:
  • 源自NodeBase
  • 非常类似于Android上的node(在单独的线程上与Node一起运行Service)
  • 但是node被编译/用作应用程序,而不是嵌入式共享库
  • NodeJS应用程序代码位于{projectRoot}/background
  • NodeJS可执行文件位于/android/src/main/res/raw/bin_node_v710
  • 在构建时,Node app已压缩,在`/android/src/main/res/raw/{appName}中解压缩
  • 就像从命令行运行一样调用NodeJS服务,并传递args
  • Node 服务RNNode可通过导入react-native-node在RN中使用
  • react-native-node还包含在构建时传输 Node 代码的CLI
  • 该示例项目通过REST从React Native传递到NodeJS服务
  • 在 Node 侧
  • 上的 express上运行 http://localhost:5000服务器

    优点:
  • 简单的项目,没有太多的管道代码
  • 显而易见:在Android上使用NodeJS响应 native 支持!
  • 可执行 Node 可以与64-bit devices + react-native一起使用

  • 缺点:
  • 非常新的项目,仍然只有实验代码
  • 随附旧的NodeJS 7.1.0版本(但DIY build较新版本)
  • 在RN和Node应用之间进行通信的简便方法(基于REST)
  • 需要扩展REST API或推出自己的机制
  • Node应用程序上没有调试支持。真的很难知道
  • 发生了什么

    状态(2017-08-17)

    我的目标是React Native + NodeJS。这是我的 Activity 状态:
  • 将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-nodeJ2V8结合使用:
  • 大跨编译版本PR:https://github.com/eclipsesource/J2V8/pull/327
  • 内置到一个不错的J2V8 .aar中,可以轻松地包含在Gradle中

  • React Native 0.46.4 + NodeJS 7.9.0现在可以工作了!看:
  • https://github.com/staltz/react-native-node/issues/5#issuecomment-323049897


  • 我的用例: 胖客户端,具有P2P分散式网络功能

    我正在考虑一个CQRS(命令-查询-责任-隔离)设计:
  • react-native UI是从 Node 服务
  • 查询的 View 构造的
  • react-native UI操作在 Node 后台服务
  • 上触发命令
  • 后台服务处理网络消息,传入命令,触发事件
  • 事件存储在Realm DB中,该数据库构成了前后
  • 之间的桥梁

    详细信息: Realm.io to bridge native NodeJS + React Native in Android fat client app (CQRS-style)

    结论

    即使经过多年的人们尝试将NodeJS移植到Android上,仍然没有真正好的解决方案,它是开创性的。

    在设置项目和构建环境时,会遇到许多障碍和错误,但是一旦设置,您就可以在手机上享受Node的全部功能。

    关于javascript - 在Android上运行NodeJS的可行选项(2017年8月),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459909/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com