java - Android:javac 与 Dalvik

标签 java android javac dalvik

我的理解是,Google 不喜欢 Oracle 在 Java ME 中使用 JRE 的许可政策,所以它只是重写了 它使用自己的 JVM 规范模仿 JRE,但行为有点不同,尤其是当它出现时 让事情变得更高效、更安全。

所以,如果我的理解是正确的,那就意味着当javac在一些Java源代码上运行并编译成“二进制” 字节码,兼容的 JVM 会解释不同于 Dalvik 的字节码(在某些情况下)。这是与生俱来的 Dalvik 和其他(兼容的)JVM 之间的区别。

如果我到目前为止所说的任何内容不正确,请先纠正我!

现在,如果 Android 带有自己的编译器(它可能),并以不同的方式编译 Java 源代码(Dalvik 兼容) 方式比 javac,然后我可以理解一些代码(不是用 Android SDK 编译的)不会在 安卓设备:

MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app

但是,您似乎使用 javac 来编译 Android 应用程序!?!?所以看起来我们有这个:

MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)

如果使用javac将所有源码编译成字节码,那么为什么Dalvik不能运行某些类型 Java 代码?

我昨天问了一个非常相似的问题,虽然它在技术上得到了回答(在重新阅读我的问题之后 我知道我只是不够具体)没有人能够解释 Dalvik 所固有的 使得无法从 Google Guice 或 Apache Camel 等项目运行 Java 代码。有人告诉我,为了让 Camel 在 Dalvik 上运行,我必须获得 Camel 的源代码,然后它必须“使用 Android SDK 构建”,但我无法弄清楚这意味着什么或暗示什么.

以 Camel 为例,你有这个(简化的):

RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> JVM --> running Camel ESB
RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> Dalvik JVM --> doesn't work !!! (???)

很明显,Dalvik JVM 内部发生了一些事情,阻止了它运行某些类型的 Java 代码。 我试图了解哪些类型的 Java 代码在“输入”到 Dalvik JVM 时不会运行。

编辑:在“但是 Camel 3.0 将在 Android 上运行!”之前我知道 - 这不是我的问题!

最佳答案

I'm trying to understand what types of Java code will not run when "fed" into the Dalvik JVM.

Dalvik JVM 在以下方面与其他 JVM 不同:

  • 它使用特殊的 DEX 格式来存储应用程序二进制文件与 JAR 和标准 Java 虚拟机使用的 Pack200 格式。谷歌 声称 DEX 生成的二进制文件比 JAR 更小。我觉得他们 可以使用 Pack200 取得同样的成功,但他们决定去他们的 在这方面有自己的方式

  • Dalvik JVM 针对运行多个 JVM 进程进行了优化 同时

  • Dalvik JVM 使用基于寄存器的架构与基于堆栈的架构 其他 JVM 的架构,旨在加速执行和 减少二进制大小

  • 它使用自己的指令集(不是标准的 JVM 字节码)

  • 一个人可以运行(如果需要)多个独立的 Android 应用程序 在单个 JVM 进程中

  • 应用程序执行可以跨越多个 Dalvik JVM 进程 “自然”。为了支持它 补充:

  • 基于Parcel和Parcelable的特殊对象序列化机制 类。从功能上讲,它与标准 Java 具有相同的目的 可序列化,但会导致数据占用空间更小,并且可能对类版本的差异更宽松

  • 基于Android执行进程间调用(IPC)的特殊方式 Android 接口(interface)定义语言 (AIDL)

  • 直到 Android 2.2 Dalvik JVM 不支持 JIT 编译,这 对 Android 应用程序性能产生不利影响。在 2.2 中添加 显着提高常用应用程序的执行速度

关于java - Android:javac 与 Dalvik,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374477/

相关文章:

java - 在 Android 中加载/保存属性文件最方便的方法是什么?

java - Jenkins构建失败:javac file not found

java - Ant使用Maven的库

java - 实时图像创建期间出现异常

android - Android 上未找到类异常

java - 无法使用 javac 和 lombok 在控制台中编译 .h 文件。错误 : package lombok does not exist

java - 是否有 Java 库可以从 AST 生成类文件?

java - HashMap 在对象发生变化时自动更新

java - 与本地 mysql 数据库连接时,getConnection 不是 JDBC 中的连接

android - 我应该使用什么库进行 base64 编码/解码