速看(安卓为什么不放弃java)安卓手机app都是java开发的吗,为什么当年 Android 选择用 Java 作为开发语言?,什么手机是java系统,
因为有一家你从没听说过的手机公司,在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)
声明:未经本人许可不得转载。
本文系作者 @河马 原创发布在河马博客站点。未经许可,禁止转载。
暂无评论数据