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”)拆分可解决该问题。
- 栈大小限制:Dalvik 运行时线程默认栈大小为 1MB,动态加载代码初始运行在 Dalvik 解释器中,导致栈使用较高,可能引发
测试 Android 后端:
- Android 开发工具不适用于此类底层工作,测试通常使用 Android Instrumentation 框架,但其开销大,不适用于单元测试。
- 可通过一些方法在 Android 上运行纯 Java 应用及单元测试,如将 Java 类转换为 DEX 文件并上传到 Android 设备运行,对于使用 JUnit 5 的 Chicory 测试套件,需使用特定库和配置。
- 还可通过自定义启动器直接运行测试,使测试时间大幅减少至约 7 秒,且可通过调试 Android 进程来调试 Chicory 编译器和生成的 Dalvik 字节码。
总之,Android 后端的 Chicory 编译器仍在完善中,如有兴趣可在相关仓库尝试,若有问题可提 issue。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。