我知道你可以在Dalvik 的 VM中运行几乎所有的 Java,你可以在Java 的 VM中运行,但是限制不是很清楚。有没有人遇到任何主要的绊脚石?有什么大图书馆有问题吗?任何编译成 Java 字节码的语言(Scala、Jython等)都不能按预期工作?
4 回答
有很多东西是 Dalvik 不会处理或不会以与标准 Java 字节码完全相同的方式处理的,尽管它们中的大多数都非常先进。
最严重的例子是运行时字节码生成和自定义类加载。假设您想创建一些字节码,然后使用类加载器为您加载它,如果该技巧在您的普通机器上有效,则保证在 Dalvik 上无效,除非您更改字节码生成。
这会阻止您使用某些依赖注入框架,最著名的例子是 Google Guice(尽管我相信有些人在做这件事)。另一方面,AspectJ 应该可以工作,因为它使用字节码检测作为编译步骤(尽管我不知道是否有人尝试过)。
至于其他 jvm 语言——最终编译为标准字节码并且在运行时不使用字节码检测的任何东西都可以转换为 Dalvik 并且应该可以工作。我知道人们确实在 Android 上运行了 Jython,而且运行良好。
需要注意的另一件事是没有及时编译。这不是严格意义上的 Dalvik 问题(如果你愿意,你可以随时编译任何字节码),但 Android 不支持,而且不太可能这样做。实际上,虽然标准 Java 的微基准测试毫无用处——组件在测试中的运行时特性与作为大型系统的一部分不同——但 Android 手机的微基准测试完全有意义。
如果您看到“ Dalvik Virtual Machine internals ”Google IO 会话,您会发现 Dalvik 不支持分代 GC。
因此,它可能会降低频繁创建和删除对象的性能。Java VM 支持分代 GC,因此在相同情况下它会表现出更好的 GC 性能。
此外,Dalvik 使用跟踪粒度 JIT代替方法粒度 JIT。
我想可以在这里添加的另一件事是,Dalvik 在使用反射 API 列出类的字段时显然不保留字段顺序。现在,反射 API 无论如何都不会对它做出任何保证(所以理想情况下,无论如何你都不应该依赖它),但大多数其他 VM确实保留了顺序。
只是为了增加对话,而不是为了恢复旧线程。我刚刚在搜索中遇到了这个问题,并想补充一点,Jython 也不能与 Dalvik 一起使用。简单地尝试做一个 hello world 示例将产生以下结果: