也扯 Android 开发

首先声明一下,我做移动平台开发的时间很短,短到还不足一年,其次再强调一下,我涉及的移动开发平台只是 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,那可是非常强大的呢,而我折腾了半年有余,至今未见什么动静。不过我想我碰到的问题每个开发者难免多少都会碰到一些,所谓都在河边走,谁能不湿鞋啊,不湿鞋的那是光着脚走路。

  1. Android 开发中没有良好的可视化控件开发工具,虽然 ADT 中有一个简单的 XML 预览功能,但是确实非常的简陋,不过 ADT 8.0.1 已经好很多了。
  2. Android Framework 对于内存有限制,默认一个 Activity 分配的非 Native 内存由生产商在 VM 初始化确定其值为多大,在 MDPI 的模拟器上是 16M,在 HDPI 的模拟器上是 24M。很多开发者都曾碰到过让人头疼讨厌的 OOM 错误。
  3. 多设备和多分辨率带来的问题,虽然说这可以是一个正面的数据,大不了不支持那么多就行了,但是随便支持几个,你都会或多或少地碰到一些问题,这些问题就是因为分辨率的适配,你的 Layout 甚至可能需要依照分辨率来编写,你的图像资源文件几乎是完全按着分辨率来重新制作的。
  4. UI 的不统一型带来的问题,由于某些 ROM 直接修改了系统默认控件的效果,在很多时候你无法预知你的程序发布出去用户安装之后是一个什么样的运行效果,因为你无法充分测试所有的设备和 ROM,如果非得从根本上让应用在所有设备上效果一致,控件需要自己完全重新实现,这个非常的不现实。
  5. 用户免费心理对开发者的打击甚大,目前在 Android 上收费的软件成功的很少,虽然 Android 号称已经在全球市场上超过了 iPhone,但是目前还仍未出现一个公司能通过在 Android Market 上出售软件实现盈利。遍地开花的破解软件商店,粗制滥造的免费应用充斥着市场等等,无疑让这趟浑水越来越浑了。
  6. 版本的错乱导致的特别版本,针对 NDK 的程序必须在 1.6 以上的机器上运行,Android 几乎是每半年一个大版本,非常有开源社区的风格。每次更新都会带来一些新的特性,那么你能在你的应用中使用吗?我想大多数时候,回答是否定的。市场上的设备很少能及时跟上 Android 版本更新的速度,为了向下兼容,很多时候我们经常是看着已有的轮子不能用,非得自己重新造轮子。
  7. Native 开发环境的恶劣,几乎无法调试的开发,让开发者几近发狂。JNI 开发的特殊性本来就让挺多人挺头疼的了,目前还没有什么好的开发环境,更是让开发者有苦难言啊。
  8. 胜利就在眼前,而你却看不见胜利,多么地令人遗憾啊!
  9. 没有第九点。

相对而言,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.