Android为什么要使用Java?[关闭]


114

好的,应该确实向Google的某人问这个问题,但是我只想提出其他意见。

甚至Android也支持本机代码应用程序,主要的开发工具是Java。但为什么?我的意思是,在移动设备上解释代码是否太慢?Google在介绍Froyo时说,新的JIT编译器可以使应用程序速度提高2-5倍。这意味着通过本机代码使用Java的速度要慢2倍。

是的,我知道使用托管代码应用程序在系统稳定性方面更加安全,因为虚拟机可以更好地控制程序,但是,这种性能下降仍然很大,我看不出为什么要使用它。


12
Java代码不会被解释,至少在Android上不会被解释-它是在虚拟机上编译和运行的。
Radomir Dopieralski

4
我以为Sun证明Java可以(在几个方面,但经常是几乎可以)与本地代码一样快?另外,谷歌家伙是一个聪明的包-我相信他们最近引入的JIT迟早会产生非常好的代码。

1
@ b-gen-jack-o-neill答案实际上是否定的,因为VM可以告知运行时正在执行什么代码以及如何执行代码。例如,Apple在OS X中使用LLVM的明确目的是在运行时优化对性能至关重要的图形功能。这样做是因为它比本机代码技术快。
PeterAllenWebb

1
@ b-gen-jack-o-neill,可以在运行时将Java字节码编译为本机代码。
Mike Daniels 2010年

1
@ b-gen-jack-o-neill-与典型的编译器相比,VM可以访问有关执行环境的更多信息,因此它可以做出更明智的选择。抵销的程度会因应用程序而异。
CurtainDog

Answers:


98

一些要点:

  1. Java是一种已知的语言,开发人员知道它,而不必学习它

  2. 使用Java比使用C / C ++代码更难射击,因为它没有指针算法

  3. 它在VM中运行,因此无需为那里的每部电话重新编译它,并且易于保护

  4. 大量的Java开发工具(请参见第1点)

  5. 几款手机已经使用Java ME,因此Java在业界已广为人知

  6. 对于大多数应用而言,速度差异不是问题;如果是的话,您应该使用低级语言编写代码


5
在VM上运行(因此无需重新编译)是一个巨大的优势。而且,它可以轻松地将进程彼此分离,从而防止恶意应用破坏您的手机或干扰其他应用
Falmarri 2010年

1
关于流氓应用程序的事情-听起来很有趣。如果我错了,请纠正我,但是x86 CPU通过分页和环形模式提供了一些保护,因此应用程序无法更改其在内存中的页面,因此除了使用OS API之外,不能干扰其他应用程序。但是此功能是否具有ARM CPU?我真的不知道 如果不是这样,那么对于此平台上的Java来说,这将是很棒的选择。
B.Gen.Jack.O.Neill,2010年

CPU与做
恶作剧

4
内存保护是某些cpu体系结构的一部分。它可以防止恶意应用程序访问分配给其他应用程序的内存。en.wikipedia.org/wiki/Memory_protection
josefx

1
@法尔马里:是的,确实如此。基本上它很简单。您的应用已分配了自己的地址空间。您要访问的所有地址均由MMU翻译。您要访问地址0x0000,MMU将其转换为例如0x0E21。为了防止您更改基本地址,其特权指令以及由OS启动时的程序分配了最低特权级别。如果不是,则单个CLI(禁用中断)指令将导致系统崩溃。–
B.Gen.Jack.O.Neill 2010年

39

在字节码级别,Android不使用Java。源是Java,但不使用JVM。


7
是。Java是源代码,但未编译为与Java虚拟机兼容的字节码。这就是为什么他们可能会与sun / oracle进行大部分/全部专利纠纷。他们仅使用语言的语法。
约翰·加德纳

1
它仍然必须支持Java vm的大多数功能。因此,他们无法优化它们。
josefx

1
那么,为什么在Android中进行开发时需要安装JDK?仅用于模拟器吗?
jiggunjer '16

@jiggunjer实际上,Android Studio是用Java开发的。模拟器也是如此。
Rudra B. Saraswat

20

系统稳定性的提高是 在诸如手机之类的设备上非常重要

安全性甚至更为重要。Android环境允许用户运行半信任的应用程序,这些应用程序可能会以真正令人不快的方式利用手机而没有出色的安全性。通过在虚拟机中运行所有应用程序,可以确保除非VM实施存在缺陷,否则任何应用程序都无法利用OS内核。相应地,VM实施可能很小,并且具有小的,定义明确的安全性表面。

也许最重要的是,当程序被编译为虚拟机的代码时,不必为新硬件而重新编译它们。手机芯片市场是多种多样且瞬息万变的,因此这很重要。

同样,使用Java使得人们编写的应用程序更容易被自己利用。没有缓冲区溢出,指针错误等。


David的另一个回答是android不使用jvm
Ssenyonjo

13

本机代码不一定比Java代码快。您的个人资料数据在哪里显示本机代码可以运行得更快?

为什么选择Java?

  • Android可在许多不同的硬件平台上运行。您将需要针对这些不同平台中的每一个编译并优化您的本机代码,以查看任何真正的好处。

  • 已经有许多开发人员精通Java。

  • Java具有强大的开源支持,提供了许多库和工具,可简化开发人员的生活。

  • Java保护您免受本机代码固有的许多问题的困扰,例如内存泄漏,错误的指针使用等。

  • Java允许他们创建沙箱应用程序,并创建更好的安全模型,以使一个不良的应用程序无法关闭整个操作系统。


7

首先,据Google称,Android不使用Java。这就是Oracle起诉Google的原因。甲骨文声称Android侵犯了某些Java技术,但Google称其为Dalvik。

其次,自1995年以来,我还没有见过Java字节码解释器。

您可以用一些实际基准来支持您的性能推测吗?鉴于您提供的背景信息不准确,因此您的推定范围似乎不合理。


4

Java对于谷歌在Android中使用Java有一个令人信服的论点:它拥有大量的开发人员。所有这些开发人员都准备好为其移动平台进行开发。

请记住,从技术上讲,Android不使用 Java。


2
我认为所有对移动开发感兴趣的人也对“更酷”的语言比对Java感兴趣。
Earlz 2010年

4

正如其他地方所提到的那样,主要问题是Android被设计为可移植的OS,可以在各种硬件上运行。它还建立在许多现有移动开发人员熟悉的框架和语言上。

最后,我要说这是对未来的赌注-无论存在什么性能问题都将随着硬件的改进而变得无关紧要-同样地,通过让开发人员根据抽象进行编码,Google可以比以前更容易地剥离和更改底层操作系统开发人员正在对POSIX / Unix API进行编码。

对于大多数应用程序,在本机上使用基于VM的语言的开销并不重要(使用Web服务(如Twitter)的应用程序的瓶颈主要是网络)。Palm WebOS也演示了这一点-并且使用JavaScript而不是Java作为主要语言。

鉴于几乎所有的JIT虚拟机都可以编译为本地代码,因此原始代码的速度通常可与本地速度相媲美。与其他因素(复杂的对象运行时,通过执行边界检查来“安全”检查内存访问等)相比,归因于高级语言的许多延迟与VM开销的关系较小。

还请记住,无论用于编写应用程序的语言是什么,许多实际工作都是在较低级别的API中完成的。顶级语言通常只是将API调用链接在一起。

当然,该规则也有许多例外情况-游戏,音频和图形应用程序会限制电话硬件的使用。即使在iOS上,开发人员也经常使用C / C ++来加快这些领域的速度。


1

新的JIT运行应用程序的速度是旧dalvikVM(均为JAVA)的2-5倍。因此,比较不是通过Java进行C而是通过dalvikVM进行JIT。


1

首先,对于Windows Mobile或iPhone,.net框架需要自己的VM和可可粉。

即使性能不是最好的,因为它是对字节码的一种解释,所以android将整个java社区带入了潜在的开发人员。更多的应用程序,更多的客户,等等。

最后,性能还不错,这就是为什么即使在较小的设备上也使用Java的原因(请参阅JavaMe)。


Cocoa不是基于VM的-都是经过编译的本机代码-但是与纯C / C ++不同,它确实具有动态运行时(类似于Smalltalk / Ruby / Python),这具有自身的性能问题和优化。值得注意的是,大多数iPhone游戏很大程度上都是C ++,而不是Obj-C。
JulesLt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.