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

by , at 18 July 2020, tags : 开发 Android C 手机 智能机 点击纠错 点击删除
使用CN2/CN2GIA顶级线路,支持Shadowsocks/V2ray科学上网,支持支付宝付款,每月仅需 5 美元
## 加入品葱精选 Telegram Channel ##

知乎用户 rlei 发表

因为有一家你从没听说过的手机公司,在 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)

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

知乎用户 朱元 发表

什么原因都没有,就是因为创始人鲁宾当初就选了这个语言提供应用 api 接口。

有时候什么腾讯喜欢 C++,阿里喜欢 java,说一千道一万,说不尽的理由,其实就是最早的那批工程师自己的个人爱好而已,连 Linus 本人也不能免俗。君不见腾讯最早非得用 C++ 来开发 android app 不可?

而 android 的 kernel 却还不是得老老实实用 C/C++ 开发。

知乎用户 圆胖肿 发表

昨天有人在 kt 群里发了一个留言说,他说他们公司有一个 app 是用 qt 开发的

神奇了,然后一堆人围观

你自己动手试试就知道了,java 比 c++ 开发起来快太多了,人也容易找

而且各种依赖什么也都更成熟

像连数据库,jdbc 这种数据库连接规范都不知道几个版本了,c++ 有这玩意么?

还有第三方类库的仓库,你见过有 c++ 的仓库么?java 的 maven central,安卓开发用得不少吧?

我见过 java 的,node 的,ruby 的,python 的,dart 的仓库,其他没见过,好像还有 rust 也有

linux 下开发 app 用什么都可以,也不是只能用 c++,java 跨平台不就是为了 linux,unix 这些平台么?

所以你看,跨平台,语言自身的易用性,第三方类库这几个方面看,肯定用 java 啊

现在 fuchsia 也是主打跟 java 类似的 dart 语言,苹果那边也开始 swift 了,这些语言都差不太多

如果你会 java 和 kotlin 的话,看 dart 和 swift,看看就能写了

但是安卓的 java 跟真 java 不太一样,安卓的 java 的 gui 是自己做的,不是 awt 和 swing 那些

正统 java 的以后要靠 graal 20.2 出来之后,才能将 java 的 gui 搬到安卓和 ios 上去,这也是安卓和 java 冲突的点,明明不是 java,但是却用了 java 的语法,实际上谷歌也是当 java 在推广,所以 oracle 说安卓 api 不能用 java 这个名称,找个理由告谷歌而已

至于你说的 ruby 选 java,那就不知道是什么意思了,jruby?

知乎用户 无痕 发表

android 的内核是 linux,用 java 包装一层会有效率上的损失。但是 java 的用户基数庞大,在当时拉开了 c 用户 5 个点之多。此外,当时市场上有强大的 iphone 已经抢先建立了 apple store,应用数量超 android 很多,如果用了 java 就有可能在程序员数量上超过 ios 程序员。从而建立自己的生态系统。

知乎用户 haroel 发表

大多数主流的 os 开发语言都是非常上层(原谅我选的词汇)的计算机语言,这样便于系统推广和应用生态的形成。如果选用较底层的 c/c++ 开发,难度较大也会导致多数初中级别开发者不愿意开发应用。因此,很多 IT 公司都会推出适合自己操作系统并更容易上手的语言来开发。
参照,微软选择 c#,apple 选择 objc(现在换成更简单的 swift),安卓则是 java,这些语言难度相对 c/c++ 较小。也更适合于 GUI 类型的应用开发。
当然,理论上,c/c++ 是万能的。

知乎用户 jl wang 发表

自古以来从别人屁股后面追很少有成功的,只能说 google 一开始看上的就是手机替代电脑的时候弯道超车~~

另外,纠正楼主一个错误,c++ 仅仅是大门同志一意孤行(请参考《观止》),在 windows 上_曾经_硬推过的一个语言,在 linux 上使用得极少,从来没有主流过: D

你可以随便装任何一个发行版,数一数里面有几个 c++ 程序。

知乎用户 Belleve​ 发表

当年的 android CPU 指令集都不统一,好像有些连浮点都没有,用 C++ 那部署就成大坑了

知乎用户 袁阳 发表

开发者多

知乎用户 扶余城里小老二 发表

说到底还是能用的 cpp 程序员太少,只能退而求其次了。JAVA 的母公司都破产了,结果 JAVA 还活着。靠的就是这波人

知乎用户 Joni 发表

我相信做 android 应该会比较讨厌 NDK 和 so 文件

一是 c++ 难 IDE 对 NDK 也支持不好 最新的 AndroidStudio 都没有高亮

二是 so 文件真占 apk 大小

当然 NDK 可以实现更底层的功能 希望 android 接口更完善吧 把 NDK 淘汰掉 噗

知乎用户 holly2k 发表

因为市场上做 JAVA 的人最多,用 JAVA 作为语言可以快速壮大开发者团队,形成生态

知乎用户 福瑞 发表

因为当时塞班就是 c++ 开发的,结果发现社区不温不火。学习成本也很高。甚至那时候微软的开发工具都是嵌入式 vc 和嵌入式 vb。结果也不是很好用。

而 java 社区那时候正热火朝天,使用 java 作为开发语言可以借社区的力量。但是 google 也不想让其他家占了他的便宜。所以在 vm 上选择不兼容(那所谓寄存器的理由就是扯淡),弄出了个 dalvik。当时 sun/oracle 是没能预料到 android 以后的发展,否则的话一开始就应该摁死 dalvik,必须使用标准 jvm 兼容虚拟机,要不就别用 java。如果是这样,现在 android 就更开放了。

当年 sun 走错了路,小家子气,弄 j2me 等等,就是担心手机和移动设备没有强大的计算力,而且 j2me 本质上是寄生而不是整体控制。如果现在返回去看,当初就推动标准 jvm 和基于 jvm 的 OS,早就没 google 什么事了。

知乎用户 朽木可以沙雕 发表

java 只能算是胶水,很多方法你一路点下去,会发现是用 jni,也就是说用 c++ 实现

知乎用户 伟大儿童 发表

现在 google 也想换成 Kotlin 了。。但感觉这个有点不好用。

知乎用户 乐卡克 X 发表

java 开发人员多吧。生态容易建立,况且 java 语言难度适中,有 gc,但也算是埋下隐患

知乎用户 跑跑更健康 发表

可以用 c++ 开发的,Android 有 NDK 做支持。
http://developer.android.com/tools/sdk/ndk/index.html

知乎用户 陈子平 发表

感觉这问题只能问 android 他爹才能回答了。倒是比较好奇,题主希望 android 用什么语言来开发 android ?

知乎用户 「已注销」 发表

C++ 也能开发啊

知乎用户 匿名用户 发表

除非谷歌一开始就打算推出自己的应用开发语言,java 就是不二之选。当然 C/C++ 的重要性在 ndk 和 jni 上也体现的非常明显。

最简单好用的 VPS,没有之一,注册立得 100 美金
comments powered by Disqus

See Also

我不会用智能手机,你们是不是准备让我去死?

哎……我们今天看到这个消息真的是整整难过了一天,其实这个事情我们早就想吐槽,这个社会有时候真的是太过分了。 老实说,我们看到这个事情真的眼泪水都下来了。事情非常简单,6月17日,浙江台州,货车司机刘师傅,拉完货返程时,遇见一位大爷向他招手。 …

急到跳楼也防不住!无需你参与,我就能转空你的银行卡!

说来也讽刺,昨天刚刚说完现在智能手机对老人太不友好,今天就是出这个事情。大家别不信!夸张?离谱?绝对不可能发生? 抱歉,这个是真的,真的不需要你任何操作,你银行卡里的钱就是我的了。不多解释,央视报道,千真万确,很多技术细节还是犯罪嫌疑人自己 …

通俗说说5G和华为那些事儿

通俗说说5G和华为那些事儿 作者:Goodhelper 近来加拿大应美国要求拘捕孟晚舟以及美国串通西方国家抵制中国手机通讯设备等等事件,让许多人指责美国是出于妒忌,恶意围堵中国以华为为首的5G通讯的全球发展。事实是这样吗? 还是从头说起。 …

罗永浩的“锤子”自砸“坚果”

罗永浩的“锤子”自砸“坚果” ·方舟子· 罗永浩卖了一年的“锤子手机”,据他说,到现在总共卖出25万部。我们姑且相信这个数据没有水分(实际上当然极可能兑了大量的水分),用他自己的话说,这么一点销售量也是可以忽略不计的,因为他在2013年评论 …

手机辐射会让人长脑瘤吗?

手机辐射会让人长脑瘤吗? ·方舟子· 现在手机已经在很大程度上取代了有线电话,而且大家打手机的时间越来越多。手机会产生电磁波辐射,会不会对健康产生不良影响,就成了大家很关心的一个问题。最近美国国家环境健康研究所发布了一项相关研究的初步结果, …