gpt4 book ai didi

java - Android:javac 与 Dalvik

转载 作者:IT老高 更新时间:2023-10-28 21:21:25 25 4
gpt4 key购买 nike

我的理解是,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/

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