首先声明一下,我做移动平台开发的时间很短,短到还不足一年,其次再强调一下,我涉及的移动开发平台只是Android。这就意味着我看到的东西非常非常的片面,甚至都没有参考价值和意义。只是自己周末觉得应该写个博客,而暂时也没有整理好的技术博客,所以索性就扯一下。
在做Android之前,我做过一年时间的JNI开发,一门原本非常非常偏门的中间件开发技术,在进入之前的公司(SuperMap)之前,我从未接触过JNI开发,虽然在零星地做着一些Java方面的工作,但是均只限于Demo的学习与演练,绝对没有半分实践的经验。进入超图之后,开始学习JNI开发技术,半年之后渐入佳境,日常的开发工作之余开始接触一些业务的东西,也就是说开始接触了一些技术支持方面的工作,偶尔需要到客户的现场处理缺陷或者针对用户的使用场景提出解决方案。当然这么说好像有点大,好吧,我承认有点虚。不过当时山中无老虎,猴子尚且称霸王呢,自己当时也算是团队中的核心开发成员了,所以当时有幸出了一次差,而且有幸坐了第一次飞机,体验了一下空中交通工具的便捷性。还是回到正题吧,在超图工作的重点有两个,一个是编码一个是支持,编码的过程非常简单,流程化很高。接口设计由架构团队讨论决定之后,底层开发团队根据功能需求完成基础接口,然后由Java层面通过JNI技术将底层团队提供的C/C++接口封装起来,当然同时还有.NET团队在做CLR的封装。
JNI封装的工作性质很简单,主要就是与C/C++层面的通信,把一堆基础接口攒成一个可用性高的接口,当然这个工作主要有架构师团队完成设计。编码工作中主要注意的东西有一些,异常判断,数组搬移,野指针等等。SDK作为基础开发平台主要就是模块化,稳定压倒一切。在超图的工作经历,让我对与JNI整个的工作机制以及编码方法有了一个大体的了解,来到喜讯之后,做了第一个游戏——《黄金矿工喜讯特别版》Android版本。编码的过程中逐渐开始熟悉Android的开发方式以及框架结构,在开发过程中碰到了很多的问题,不过所幸最后产品还是成功的出炉了。据说市场反应还不错,因为这作为公司一个磨练团队的产品,目前还没有后续的开发和维护,只是出了一个版本,对于市场反馈也没有做太多的统计,甚至都没有放到Google Market上去,只是在一些国内论坛和第三方市场中做过分享。不过大体了解一些Android中开发的猫腻和技巧,Android由于其开源的特性,有很多东西可以窥探到,在Android Framework中有很多带有// TODO标签的代码段,很多的注释中直接标明“This is a bug”类似的字眼。不过正因为它的开源,很多Framework的机制可以自己一一剥开来慢慢瞧,例如对于图像解码中非常容易出现的OOM错误,顺着代码链,我们可以看到所有的代码,从Java=>JNI=>C,最终可以跟踪到VM创建时堆大小的初始化,详情可以参见我这篇博客。
虽然最终我们看似已经找到了问题,但是究竟如何解决这个问题呢,目前我还没有找到非常好的方法,因为这个受到了Framework的限制,而Framework也没有提供非常好的机制来防止该问题的出现,不过也许可以借助异常的捕获来解决该问题,不过本人自己还未做过该方面的尝试。在做完这个游戏之后,又经历了两个软件项目,项目中自己主要负责的是UI层面的东西,不过主要的设计和UE控制并不由我主要负责,本人主要负责代码实现,主要设计与UE控制由设计师来完成。Android原生的开发环境是Java,按说开发效率是比较高的,当然这个并不是我自己说的,也是从网络上诸多的报告和大牛们的分析中看到的,至于他们为什么得出这个结论我自己并不是非常明了,我自己比较有感触的就是Java相对于C/C++来说,自由度相对要小,不过基础库非常完备,很多的特性均有平台完成,程序员主要负责的就是逻辑和界面的问题,相对来说会较C/C++效率高一些(当然这还是因人而异的)。既然Java开发效率要高一些,那么Android中的开发效率是否会高一些呢?我看不尽然,Android虽然提供Java的开发环境,但是其框架环境非常庞大和复杂,个人认为比Java SE复杂多了很多。Java只是Android开发中的一个敲门砖而已,不过既然已经没有了语言层面上的问题,那么就剩下框架的问题。
然而框架的问题并不是那么的简单,Android是一个在工程实验室中就被推到市场上的项目,当年Andy Rubin创建Android具体是什么时候不是很清楚,不过Andy Rubin还是Danger, Inc.的联合创始人,而Danger在2008年2月份才被Microsoft收购。
The company was originally started by former Apple Inc., WebTV and Philips employees Andy Rubin, Joe Britt, and Matt Hershenson. Danger was acquired by Microsoft on 11 February 2008, for a price rumored to be around $500 million (USD).
由此看来这家公司参与者还有Apple的身影。再来看看Android
In July 2005, Google acquired Android Inc., a small startup company based in Palo Alto, California, USA.[20] Android’s co-founders who went to work at Google included Andy Rubin (co-founder of Danger),[21] Rich Miner (co-founder of Wildfire Communications, Inc.),[22] Nick Sears (once VP at T-Mobile),[23] and Chris White (headed design and interface development at WebTV).[24] At the time, little was known about the functions of Android, Inc. other than that they made software for mobile phones.[20] This began rumors that Google was planning to enter the mobile phone market.
从这两个简介中看来Andy Rubin的经历不能不说是很神奇啊,曾经供职过Apple, Philips,然后是WebTV,Danger,现在是Google,Andy Rubin好像一直都是在做移动设备,在该领域他的经验非常的丰富和恐怖。从Danger和Android的两个简介看来,Andy Rubin在这两个公司之间是有交集的,不只是职务上,在时间上也是有的,Android 05年被Google收购,08年Danger被Microsoft收购。当然我们不管这个了,这只是一个八卦而已。Android存在的问题很多,昨天看了一下在Google Code上的Android Issues列表,目前Open Issues的数量是9257,总共Issues是13851,也就是说Fixed的Issued最多就是4594个,比例是0.331672803,百分比33%,刚刚1/3。当然这跟Android Open是有一定关系的,任何人都可以提交Issue,还有很多的Issue是重复的。不过我还是认为这个是能说明一些问题的,那就是开发者对于Android Framework还不是很满意和放心,当然这其中包括我自己,因为Android中有太多@hide标签的东西以及需要自己去Hack的东西,一个AlertDialog你想自定义其风格,非常的困难,而系统提供的默认UI风格真的非常的一般,从我自己的心眼里来说我非常的不感冒Google原生的UI,我使用的Legend自带的HTC Scense我就认为非常出色,是一个不可多得的UI套件,当然现在市面上已经有了很多很多的UI套件,著名一些的国内UI套件,有点心科技、MIUI等等。这确实说明了大家对Google原生的UI不是很感冒,而且既然你开放,别人能做得比你好干嘛不做啊。
开放带来的问题不只是UI的分裂和多样化,还带来了设备的极大丰富和多样,分辨率的多样和分裂更是成为诸多开发者的噩梦。不过其实也不是那么夸张啦,只是需要很大的精力来做好适配,开发者需要更多的时间来调试,设计者需要为多种设备做考虑。这样的情况下,粗看下来,其实设备更多市场越大,用户越多,开发出来的游戏和应用能更大程度地体现价值,更有可能得到不错的回报。这是一个毫无疑问的肯定句,不过能做到适配多机型的软件并不是非常多,因为这个工作量确实不小,关键是设计的工作量不小。Android开发的难度大不大我想这个因人而异吧,小米团队号称80多天弄出来一个MIUI,那可是非常强大的呢,而我折腾了半年有余,至今未见什么动静。不过我想我碰到的问题每个开发者难免多少都会碰到一些,所谓都在河边走,谁能不湿鞋啊,不湿鞋的那是光着脚走路。
- Android开发中没有良好的可视化控件开发工具,虽然ADT中有一个简单的XML预览功能,但是确实非常的简陋,不过ADT 8.0.1已经好很多了。
- Android Framework对于内存有限制,默认一个Activity分配的非Native内存由生产商在VM初始化确定其值为多大,在MDPI的模拟器上是16M,在HDPI的模拟器上是24M。很多开发者都曾碰到过让人头疼讨厌的OOM错误。
- 多设备和多分辨率带来的问题,虽然说这可以是一个正面的数据,大不了不支持那么多就行了,但是随便支持几个,你都会或多或少地碰到一些问题,这些问题就是因为分辨率的适配,你的Layout甚至可能需要依照分辨率来编写,你的图像资源文件几乎是完全按着分辨率来重新制作的。
- UI 的不统一型带来的问题,由于某些ROM直接修改了系统默认控件的效果,在很多时候你无法预知你的程序发布出去用户安装之后是一个什么样的运行效果,因为你无法充分测试所有的设备和ROM,如果非得从根本上让应用在所有设备上效果一致,控件需要自己完全重新实现,这个非常的不现实。
- 用户免费心理对开发者的打击甚大,目前在Android上收费的软件成功的很少,虽然Android号称已经在全球市场上超过了iPhone,但是目前还仍未出现一个公司能通过在Android Market上出售软件实现盈利。遍地开花的破解软件商店,粗制滥造的免费应用充斥着市场等等,无疑让这趟浑水越来越浑了。
- 版本的错乱导致的特别版本,针对NDK的程序必须在1.6以上的机器上运行,Android几乎是每半年一个大版本,非常有开源社区的风格。每次更新都会带来一些新的特性,那么你能在你的应用中使用吗?我想大多数时候,回答是否定的。市场上的设备很少能及时跟上Android版本更新的速度,为了向下兼容,很多时候我们经常是看着已有的轮子不能用,非得自己重新造轮子。
- Native开发环境的恶劣,几乎无法调试的开发,让开发者几近发狂。JNI开发的特殊性本来就让挺多人挺头疼的了,目前还没有什么好的开发环境,更是让开发者有苦难言啊。
- 胜利就在眼前,而你却看不见胜利,多么地令人遗憾啊!
- 没有第九点。
相对而言,iPhone成功的App Store和优秀的开发环境和稳定的SDK,版本相对稳定,机型更是全球唯一确定的那么几种。Symbian呢,我也不知道说什么,我挺喜欢Nokia的,能做这么好的手机的厂商也就是Nokia了。WP 7会是2011年微软最成功的产品吗?Visual Studio的易用性世人皆知,Windows系统的操作习惯早日深入全世界人民心中,Microsoft又舍得在这上面砸钱。
我想说的是WTF,真混乱,趟浑水究竟要到什么时候啊…
I have a dream, One day there is no mobile device in this world.