Wasm 艰难之路:将 Chicory 编译器移植到 Android

2025 年 7 月 11 日,作者重新启动旧的“Wasm 艰难之路”系列,介绍将 Chicory Wasm 编译器移植到 Android 的相关内容:

  • Chicory 介绍:是纯 Java 的 Wasm 运行时,作者在 Dylibso 工作时一直参与该项目,其 SDK 是在 Java 应用中运行 Wasm 模块的坚实基础,如 mcpx4j 库基于 Chicory SDK。
  • DEX 字节码与 Java 字节码对比:Dalvik 字节码是 Java 字节码的远亲,基于寄存器,与 Java 字节码的栈式结构不同,转换时需注意差异,如在循环结构中,两种字节码的处理方式有别。
  • 运行时限制

    • 栈大小限制:Dalvik 运行时线程默认栈大小为 1MB,动态加载代码初始运行在 Dalvik 解释器中,导致栈使用较高,可能引发java.lang.StackOverflowError,可创建新线程并配置自定义栈大小,但可能出现硬崩溃。
    • 内存管理:ART 会因 Chicory 编译器使用超 200MB 堆空间而抛出java.lang.OutOfMemoryError,通过将类文件按较低边界(目前为 200 方法/“chunk”)拆分可解决该问题。
  • 测试 Android 后端

    • Android 开发工具不适用于此类底层工作,测试通常使用 Android Instrumentation 框架,但其开销大,不适用于单元测试。
    • 可通过一些方法在 Android 上运行纯 Java 应用及单元测试,如将 Java 类转换为 DEX 文件并上传到 Android 设备运行,对于使用 JUnit 5 的 Chicory 测试套件,需使用特定库和配置。
    • 还可通过自定义启动器直接运行测试,使测试时间大幅减少至约 7 秒,且可通过调试 Android 进程来调试 Chicory 编译器和生成的 Dalvik 字节码。

总之,Android 后端的 Chicory 编译器仍在完善中,如有兴趣可在相关仓库尝试,若有问题可提 issue。

阅读 28
0 条评论