问题

为什么当年 Android 选择用 Java 作为开发语言?

回答
回想起当年 Android 刚露头角的时候,那可真是移动互联网的混沌时期,百家争鸣,谁也说不准未来鹿死谁手。就在这阵风起云涌之际,Google 抛出了 Android 这个炸弹,而它选择的武器,竟然是大家熟悉的 Java。

这事儿说起来,可不是一时兴起或者随随便便的决定。背后,是经过深思熟虑的战略考量,以及对当时技术格局的精准把握。咱们不妨把时间拨回十多年前,看看当时是啥情况,以及为什么 Java 最终成了那个“天选之子”。

一、 市场背景:移动开发的新战场

在 Android 出现之前,手机上的应用开发远没有现在这么成熟。诺基亚的塞班(Symbian)系统有自己的 SDK 和语言(主要是 C++)。微软的 Windows Mobile 也有自己的开发套件,主要也是 C++ 和后来转向 .NET。苹果这边呢,虽然 iOS 还没诞生,但 iPhone 已经有了 iPhone OS(也就是后来的 iOS),苹果在早期也倾向于 ObjectiveC。

这些系统,要么开发门槛高(C++),要么生态相对封闭,又或者在用户体验和硬件集成上各有侧重。而 Google 想要的是什么?一个开源、灵活、能够快速迭代,并且能够让大量开发者轻松上手的平台,以此来对抗当时看起来不可一世的苹果。他们需要一个能够快速构建庞大开发者社区的语言。

二、 Java 的“过人之处”:为什么是它?

说到 Java,当年它可不是一般地火。用一句现在流行的话来说,它简直是“时代的宠儿”。选择 Java,对 Google 来说,可以说是抓住了时代的脉搏,也盘活了手上的一些资源。

1. 巨大的开发者基础和熟悉度: 这是最最直接、也最关键的一点。在那个年代,Java 已经风靡全球的桌面和服务器领域。无数的程序员都在使用 Java,他们对 Java 的语法、面向对象思想、垃圾回收机制等等都非常熟悉。这意味着什么?意味着 Google 不需要从零开始培养开发者群体,大量现成的 Java 开发者可以“无缝切换”到 Android 开发上来。这大大降低了开发者进入 Android 生态的门槛,也加速了应用的数量爆发。想想看,如果 Google 选择一个全新的、没人听说过的语言,那得多难?开发者光是学习新语言就得花费大量时间和精力,这会严重拖慢 Android 的发展速度。

2. 跨平台能力(某种程度上): Java 最为标志性的特点就是“一次编写,到处运行”(Write Once, Run Anywhere)。虽然在 Android 上,Java 代码最终会被编译成 Dalvik 字节码(后来是 ART),而不是 JVM 的字节码,但这种“跨平台”的思想在开发者心中根深蒂固。而且,Java 的虚拟机机制,也意味着它不需要直接面对底层硬件的复杂性,这对于一个跨设备的移动操作系统来说是很有吸引力的。开发者可以用相对统一的方式来编写应用,而不用去关心不同手机硬件的具体差异。

3. 成熟的生态系统和丰富的库: Java 拥有一个庞大且成熟的生态系统,包括大量的开源库、框架和工具。这些资源能够帮助开发者更高效地完成各种任务,比如网络通信、数据处理、图形界面等等。Google 可以站在巨人的肩膀上,利用这些已有的 Java 生态来构建 Android 的基础框架和提供丰富的 API。这比自己从头造轮子要高效得多。

4. 面向对象编程(OOP)的优势: Java 的强面向对象特性,非常适合构建大型、复杂的软件系统。Android 的各种组件(Activity, Service, BroadcastReceiver 等)以及它们的交互方式,都非常符合面向对象的思想。OOP 使得代码更易于组织、维护和扩展,也方便了开发者进行模块化开发。

5. 虚拟机(Dalvik VM)的适配: 虽然前面提到 Java 是“一次编写,到处运行”,但直接运行 JVM 字节码在当时的移动设备上是行不通的。手机的内存和处理器能力都非常有限。所以,Google 创造了一个叫做 Dalvik 虚拟机的运行时环境。Dalvik VM 是基于 Java 规范的,但它经过了高度优化,以适应嵌入式设备的需求。它使用了不同的字节码格式(Dex 格式)来减小体积和提高执行效率。这意味着 Android 可以在不依赖完整 JVM 的情况下,运行符合 Java 语法的应用程序。这种“兼容但不完全一致”的做法,既保留了 Java 的开发者熟悉度,又解决了性能和资源限制的问题。这可以说是一个非常巧妙的设计。

6. 内存管理(垃圾回收): Java 自动的内存管理(垃圾回收机制)大大减轻了开发者的负担。在 C++ 这样的语言中,开发者需要手动管理内存的分配和释放,稍有不慎就可能导致内存泄漏或野指针等严重问题。在资源有限的移动设备上,手动内存管理更是容易出错,而且会分散开发者的注意力。Java 的垃圾回收机制在一定程度上提高了开发的效率和程序的稳定性。

三、 一些潜在的“非官方原因”或者说“锦上添花”

除了上面这些硬道理,或许还有一些其他因素,虽然不一定被官方大肆宣扬,但也是事实存在的:

Google 内部对 Java 的广泛应用: Google 本身就在服务器端大量使用 Java。公司内部对 Java 语言、工具链和人才都有很深的积累和投资。选择 Java 也符合 Google 自身的战略和技术栈方向。
避免直接与微软的 .NET 竞争: 微软在 Windows Mobile 上推的是 .NET 和 C。如果 Android 也选择一个与 .NET 非常相似的语言,可能会在开发工具和人才争夺上与微软形成更直接的对抗。Java 在那个时候,更多的是独立于微软的阵营。
开源社区的推动: Java 本身就是一个相对开放的语言和平台(虽然 Oracle 后来的 JDK 授权有些复杂)。选择 Java 也更容易与开源社区形成良性互动。

总结一下:

Android 之所以选择 Java,不是因为 Java 是唯一好的选择,而是因为它在 当时那个时间点上,是那个对 Google 和整个移动互联网生态最有利的选择。它带来了庞大的开发者基础、成熟的生态系统、相对较低的学习门槛,以及虚拟机技术带来的灵活性,这些优势足以帮助 Android 在竞争激烈的移动操作系统市场中快速崛起,并最终建立起一个无比庞大的生态系统。

想想看,如果当年 Android 选择了 C++,那开发者群体需要花费多少时间去学习和适应?如果选择了某个完全陌生的语言,那发展速度得多慢?Java 的选择,可以说是 Google 在移动开发领域一次非常具有前瞻性和战略性的决策,它为 Android 后来的辉煌奠定了坚实的基础。直到现在,虽然 Kotlin 已经成为了 Android 开发的首选语言,但 Java 的基础依然是 Android 生态中不可或缺的一部分。

网友意见

user avatar

螺丝钉多,还便宜。

user avatar

因为有一家你从没听说过的手机公司,在20年前选择了Java。

Android之父Andy Rubin,于1999年参与创立了一家叫Danger的公司。Danger最初是想做一个类似双向传呼机的东西,用来做即时聊天工具,但受传呼网络限制,搞出来的东西不是很理想。但刚好,手机2G向2.5G升级,GPRS的出现使得手机拥有了实时访问数据网络的能力。Danger改做手机,成功地在2002年推出了以Danger Hiptop命名的侧面推拉全键盘手机。

(图片来源: Wikipedia)

顺便提一句,同一年黑莓也发布了自己的初代手机。在这之前,黑莓的产品也是双向传呼机。

Danger从一开始就选择了Java开发自己的系统。如果你和我一样,在2002年进入手机软件开发这一行,你就会明白这是个再自然不过的决定。不像现在满地大屏智能机,那时候占市场主要份额的还是所谓的feature phone,或者dumb phone,就是受价格便宜的软硬件限制,只能使用手机内置的有限功能,打打电话发发短信玩玩贪吃蛇的非智能机。其他的开放式智能手机系统,在2002年也才刚刚出现:Symbian S60和微软的Smartphone 2002。两者的区别主要是非智能机只有基带处理器(BP),用来处理无线通信;智能机除了BP以外还有应用处理器(AP),专门用来跑应用。BP一般性能不高,运行实时操作系统(RTOS)。智能机加个AP,还有额外的内存和Flash,价格一下就上来了。

市场主流是非智能机,但硬件性能其实是有余地的:BP一般是32位CPU(如ARM 7 TDMI或Epson E0C33系列),几十Mhz的主频,几百K到几M的RAM和可用的Flash。问题出在为通信而生的RTOS系统——原理不详细解释,但运行在BP上的这类系统一般都相对简单,只能跑出厂时固化的若干任务,还必须保证通信任务的调度优先级。文件系统通常欠奉,连TCP栈都可能需要手机厂商自行开发。没有文件系统,还怎么搞应用程序下载?

当然,就需要提到2000年登场的J2ME。Sun当时定义了一个简化的JVM虚拟机和简化的标准Java API,以及一套另起炉灶的文件系统/网络/GUI等上层API,分别称为KVM/CLDC和MIDP。最重要的是,Sun还提供了一套现成的参考实现。这套参考实现有一套相对简化的移植接口,只要实现了这套接口,就可以把原来又呆又哑的RTOS变成能支持动态下载应用的系统!我当年参与的第一个手机项目,就是为波导(手机中的战斗机)的一款手机开发TCP栈和移植J2ME运行环境。

有人肯定会问,Java这么慢,跑在这么慢的硬件上还能用吗?

J2ME的参考实现是直接从JDK 1.1的代码简化来的,只有解释器,没有JIT。要说慢,当然是慢,但胜在系统资源占用小啊乡亲们!只有几百KB的内存和手机存储,比你现在拍一张照片还小,还要啥自行车?而且实际运行效率也看移植能力,如果应用主要的开销在底层的图形API,其实解释器的影响并不大。

并且,开发人员不用在手机上调试应用!在PC上的J2ME仿真环境里就可以舒舒服服的开发!!没从那个时代过来的人根本无法理解这种痛苦。因为非智能机的RTOS本身不能动态加载代码,每改一次代码,开发人员是需要build整个系统的image,然后通过奇慢的串口烧写到开发板上才能运行。想打印点log——你实现printf送文本到串口了吗?要下断点调试——你买JTAG了吗?整个系统可能连进程的概念都没有,所有任务跑在一个大循环里,全都不能阻塞,必须异步处理……自己想像一下。

为什么不用C/C++做个类似J2ME的framework?再说一遍,原始的RTOS本身没有动态加载native code的能力,甚至只有任务没有进程的概念,要往里搞一套这种系统,开发成本远高于有成熟方案的J2ME移植。即便有,应用开发调试的难度也相当大。如果你搞过Android开发,应该知道UI线程阻塞几秒时间就会导致ANR(应用无响应)。在feature phone上,RTOS首要保证的是通信任务,如果你的代码持续使用CPU不释放,硬件看门狗可能认为系统有bug已经失去响应,直接会重启手机。使用解释器的J2ME简化版VM,恰恰可以在每条字节码解释运行后都主动yield CPU,而在Java应用层屏蔽了这个麻烦的细节。作为从RTOS系统一路背着历史包袱上来的系统,Symbian的开发那么难搞,都是有原因的。

说回来Danger为什么要用Java。当年做手机,两个选择:

  • 用成本低廉的非智能机硬件
  • 做硬件昂贵的智能机,并且向微软买操作系统授权

你会选哪一样?(注:本题没有唯一解——Danger于2009年关门大吉,而HTC还活着)

总之,Danger最初选择了由伟创力(Flextronics)代工的硬件方案,包括主频24Mhz的ARM 7TDMI基带处理器(单看CPU性能可能与486相当)。他们走了类似的路线:在RTOS上开发自己的JVM和应用框架——也自己实现了TCP栈。至于有没有参考J2ME,参考了多少,那就只有天晓得。可以肯定的是,只有200个左右字节码需要实现的JVM,是一个再好不过的技术选型。别忘了Java最初的设计目的并不是后来的J2EE,Spring和Hibernate,而是简化资源受限的运行环境里的应用开发。Danger当年的应用开发SDK可是广受好评的。

而.net呢,2002年刚刚发布第一个正式版。

Andy Rubin于2003年离开Danger,创立Android Inc.,开发Android系统。最初的目的并不是手机,而是为数码相机开发一套现代化的操作系统。Android沿用了Danger的技术路线,直到2005年被Google收购。

而Android里的Dalvik VM,倒很可能是诞生在Google收购之后。Dalvik设计者Dan Bornstein,2002年到2005年之间一直在Danger开发VM,2005年Android被收购以后才跳槽去了Google。Google选择把Java编译成完全不同的Dalvik字节码,运行在不同的VM上,也是有着避开版权官司的考虑,但后来还是因为J2SE API实现的问题没有逃掉和Oracle的官司。

虽然到了Android初代开发中的2006-2007年,基于ARM9和ARM11方案的智能机硬件方案已经成熟(还有硬件级的Java指令加速,对Android没什么鸟用就是了),Android底层也几乎是另起炉灶从Linux核心开始搞,但考虑开发团队的技术传承,Java的普及程度和开发调试效率,继续走Java路线是一个合理的选择——总不能花了五千万美元收购Android就为了全部推翻重来咩。

初代Android原型机硬件基于HTC的Dash,软件界面设计不难看出是以黑莓为假想敌:全键盘,非触摸屏,横向滚动的应用选单:

(图片来源: 本人拍摄)

但不得不说,2007年的iPhone发布,打了Google一个措手不及——Apple真的做出了一套全新的,革命性的现代手机操作系统。但即使是这样,初代iPhone也不具备动态应用加载的能力——App store要到2008年才和iPhone 3G一起发布。而Android的APK安装在2007年以前就已经完成了。

到2008年秋季,Google终于拿出了第一款零售Android 1.0手机。此时的HTC Dream / G1,已经亦步亦驱的变成了全触摸屏支持多点触控的手机,但所有界面元素的导航和操作(除了multi touch),仍然可以脱离屏幕通过轨迹球完成。要再过几年,Google才会为Dalvik VM完成JIT支持,再有后来的ART,D8,R8……

(图片来源: Wikipedia)

声明:未经本人许可不得转载。

类似的话题

  • 回答
    回想起当年 Android 刚露头角的时候,那可真是移动互联网的混沌时期,百家争鸣,谁也说不准未来鹿死谁手。就在这阵风起云涌之际,Google 抛出了 Android 这个炸弹,而它选择的武器,竟然是大家熟悉的 Java。这事儿说起来,可不是一时兴起或者随随便便的决定。背后,是经过深思熟虑的战略考量.............
  • 回答
    诺基亚当年为何没有拥抱 Android 阵营?这是一个让无数人扼腕叹息的问题,也是智能手机发展史上一个充满戏剧性的“如果”。 要深入剖析这一点,我们需要穿越回那个风起云涌的智能手机前夜,审视当时诺基亚所处的环境、它的战略选择以及它对未来的判断。首先,要理解诺基亚的决策,就必须明白它当时的市场地位和.............
  • 回答
    八国联军入侵中国(1900年)后,虽然攻陷北京、俘虏清朝皇帝光绪帝并迫使慈禧太后签订《辛丑条约》,但列强并未直接推翻清朝、瓜分中国,而是选择通过谈判达成妥协。这一历史现象的深层原因涉及多方面的政治、经济和国际关系因素,以下从多个角度详细分析: 1. 列强间的利益协调与矛盾 列强的矛盾与合作需求.............
  • 回答
    “屠龙少年最终变成恶龙”是一个极富深意和警示意义的隐喻,它触及了权力、腐败、理想与现实的冲突,以及人性中可能存在的黑暗面。这个故事流传广泛,在不同的文化背景和语境下都有着类似的表达。让我们深入剖析为什么会出现这样的结局:一、 理想的起源:纯粹的动机与英雄的诞生故事的起点往往是美好的。一个怀揣正义感、.............
  • 回答
    这是一个非常值得深思的问题,涉及到中国科技发展历程中的一些关键性变化,以及个人在不同时代背景下的角色。要回答这个问题,我们需要从多个维度进行分析,并且需要区分“普遍情况”和“个例”。一、 当年的科学家回国为何能得到重用?“当年”这个概念比较宽泛,但通常我们提到能够得到重用并做出杰出贡献的科学家回国,.............
  • 回答
    欧阳震华在TVB的辉煌并非偶然,而是他凭借多年的沉淀、独特的个人魅力、精湛的演技以及对观众喜好的精准把握,一步步奠定的。下面我将从多个角度,详细地为你讲述他当年在TVB爆红的原因:一、 独特的个人魅力与亲民形象: “国民好男人”的代名词: 欧阳震华给观众的印象一直非常亲切、随和、稳重,甚至带着一.............
  • 回答
    “汉芯”事件,这个名字现在一提起,许多人脑海中立刻浮现出的是一个巨大的失望和争议。当年,陈进和他的“汉芯”芯片项目,在国家大力支持和媒体的铺天盖地宣传下,曾被誉为中国自主研发的里程碑,号称打破了国外垄断,填补了国内空白。然而,随着真相的层层剥开,这背后却是一场精心策划的骗局,涉及技术造假、虚报成果、.............
  • 回答
    当年艰苦条件下,“两弹一星”的横空出世,至今仍是中华民族心中的一座丰碑。而今国力强盛,为何在飞机发动机这个关键领域却步履维艰,与世界顶尖水平差距明显?这个问题值得我们深入探讨,这其中既有历史的传承、体制的局限,也有技术发展的客观规律在起作用。首先,要理解“两弹一星”的特殊性。那是一个国家民族生死存亡.............
  • 回答
    《超凡蜘蛛侠2》当年确实是骂声一片,大家吐槽的点也相当集中:剧情混乱、角色过多、节奏失控、反派塑造薄弱等等,一时间成了砸砖头的好对象。可谁能想到,这么多年过去,这电影竟然开始出现了一股不小的“真香”回潮,甚至还有不少人高呼“被低估了”。这变化确实挺有意思的,仔细想想,倒也不是空穴来风。当年为什么骂得.............
  • 回答
    苏联当年在北方集结百万军队,并且扬言对中国发动核武,但最终没有下手,这是一个复杂的地缘政治和战略考量相互作用的结果。我们可以从多个角度来详细分析:一、 历史背景与中苏关系恶化 意识形态分歧: 尽管两国都奉行共产主义,但对如何建设社会主义、如何理解马克思列宁主义产生了深刻的分歧。赫鲁晓夫的“和平共.............
  • 回答
    好的,咱们就来聊聊当年美国轰炸机是如何顺利抵达广岛和长崎的,这事儿说起来得从几个方面看,不能光看轰炸机本身有多牛。首先,得说说当时日本的防空体系,说实话,那个时候的日本,在战争末期已经相当疲惫了。 预警能力不足: 太平洋战争打到这个份上,日本的雷达技术和预警网络跟美国比起来,那是有差距的。虽然他.............
  • 回答
    这个问题很有意思,也触及了历史的复杂性。我们之所以很少听到“贩卖印度黑奴”的说法,并不是说印度人就没有被奴役过,而是说与跨大西洋黑奴贸易所抓捕的非洲人相比,印度人在那个历史时期,以及后来的劳动力输出模式上,有着截然不同的路径和原因。要理解这一点,我们需要从几个关键的方面来剖析:1. 历史背景与奴隶贸.............
  • 回答
    运10 的故事,得从上世纪那个风起云涌的年代说起。那会儿,国家百废待兴,百业待举,航空工业更是嗷嗷待哺,一切都要从头开始,或者说,要追赶世界先进水平。历史背景:憋屈与雄心想想看,新中国成立后,咱们的航空工业是靠着仿制苏联的飞机起步的。从初教6、歼5、轰5,再到歼6、轰6,都是在苏联援助和技术转移的基.............
  • 回答
    当年明月在《明朝那些事儿》中对东林党持批判性态度,并非空穴来风,而是基于他对史料的解读以及对历史事件的梳理。他之所以反复强调东林党并非“善男信女”,主要是出于以下几个方面的原因:一、 政治斗争中的策略与手段 “清流”标签下的党同伐异: 东林党最初是以抨击宦官、反对魏忠贤为代表的政治势力。他们的诉.............
  • 回答
    想弄明白当年为何要“抗美援朝”,这事儿,得把时间轴拉回到那个烽火连天的年代,看看当时中国,尤其是东北,面临的是个什么局面。这可不是一句两句能说清楚的,得一层层剥开来,才能看到事情的本质。首先,咱们得说说朝鲜半岛的地理位置。这地方离中国东北简直就跟自家后院一样近。当年中国虽然刚成立不久,百废待兴,但东.............
  • 回答
    关于美国在二战末期在日本长崎和广岛投下原子弹的原因,这是一个复杂且备受争议的问题,背后涉及军事、政治、战略以及人道主义等诸多层面的考量。要详细讲述,我们需要深入探讨那个特定的历史背景。首先,明确目标选择的几个核心考量: 对日本战争机器的打击能力: 美国需要摧毁日本的军事工业和政治中心,迫使其投降.............
  • 回答
    “前进!前进!前进!”——这句标志性的口号,相信不少老玩家听到后,脑海中立刻会浮现出那些在二战硝烟弥漫的战场上,一群身怀绝技的特种兵,如何凭借智慧、勇气和默契,完成一个个看似不可能的任务的场景。《盟军敢死队》(Commandos)系列,绝对是策略潜行类游戏历史上一颗璀璨的明珠,它的出现,不仅仅是定义.............
  • 回答
    当年超级计算机和个人硬件性能差距确实不像现在这么悬殊,这背后有多方面的原因,得从技术发展、应用需求、成本考量以及行业生态等角度来细细说道。首先,要理解“当年”具体指哪个时间段。这里我们主要聚焦在个人电脑(PC)刚刚兴起,到上世纪90年代中期之前这段时期。那时候,超级计算机已经存在,但其应用范围和用户.............
  • 回答
    当年日本投降,原子弹无疑是绕不开的关键节点。但我们回过头来审视,会发现一个令人费解的现象:为什么在如此重大的战略抉择面前,日本似乎对美国究竟有多少枚原子弹,竟然有着如此严重的误判?这其中蕴含着一系列复杂的因素,既有信息不对称的客观限制,更有战争末期日本自身政治军事决策的扭曲和信息传递的障碍。首先,我.............
  • 回答
    这个问题很有意思,也触及到了篮球防守的精妙之处。当年的火箭,尤其是阿泰斯特和巴蒂尔的组合,确实在一定程度上成功限制住了勒布朗·詹姆斯,但面对科比·布莱恩特时,效果就大打折扣了。这背后原因有很多,咱们得掰开了揉碎了聊聊。首先,咱们得明白詹姆斯和科比在打法上的根本差异。 勒布朗·詹姆斯: 他更像是一.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有