这是我最近一年在作的项目,用咱们老大的话说,就是“能不能弄一个东西,让个人 iOS 程序一行代码不用改,却能运行在 Android 上”。为了这个目标,咱们最后弄出了个这样的东西。git
提及来咱们之因此要作这个东西也是蛮有趣的。事情的原由,咱们须要把一个为 iOS 写的排版引擎移植到 Android 上。但咱们以为这个排版引擎实在是太复杂了,并且把一个写好的 iOS 程序从新写个 Android 版本很无趣,那就变成了跟抄做业同样把 Objective-C 代码换成 Java 代码的行为了。程序员
因而,为了移植这个排版引擎,咱们面临两个选择:微信
把排版引擎移植到 Androidspa
把 iOS 移植到 Android,不改排版引擎,直接在 Android 上跑日志
最终,咱们选择了 2,因而我从此的一年(至今)就在搞这个东西了。code
谈谈我我的的体会吧。我参与到这个项目以后,就真正体会到了 iOS 的博大精深。我以前固然知道 iOS 必定有不少不少东西,可是当真正参与了这个项目,才发现 iOS 竟然是如此的庞大。以致于它的一个小小的方面竟然就包含了那么多东西。blog
我本人的工做主要是把 Cocoa Touch 层移植到 Android 上去。具体就是如图:ip
把最上面那个青蓝色的方块移植到 Android 上去。顺便一提,iOS 的不少库是和 Mac 共用的。Apple 会用开源项目,Apple 本身闭源的东西会被别人开源。所以,若是是有历史的库,并且和 Mac 共用的库,通常都有开源项目可利用。可是 Cocoa Touch 层就比较坑爹,几乎没有可用的开源项目可直接使用。开发
因而,我本人的工做就是,手写 Cocoa Touch 层的代码,这个工做花了大概一年的时间。文档
某种意义上,个人任务性质有点像逆向推导出 Cocoa Touch 的内容。我须要查阅 Apple 的 API 文档,对文档的阅读要到细致到每一个单词。而后给 h 文件填充实现,实现内容和 Apple 的程序员的实现越接近越好。但有一件事是 Apple 的程序员绝对不会作但我会作的,我还须要经过 JNI 调用 Android 的 API,并用 Java 编写一些功能让 Objective-C 使用。总之,至少在 Cocoa Touch 层这里,我要骗目标代码说它是在 iOS 上运行,而不能让它发现其实它是在 Android 上运行。
这个工做最麻烦的地方其实并非在于“写出一个 Cocoa Touch 层”。光是写个 Cocoa Touch 是很简单的。难点在于,我手头能拿到的只有 Apple 的 API 文档以及和 h 文件。可是 API 文档给出的细节并不充足,这也能够理解,由于 API 文档是给开发 iOS 的开发者看的,可不是给我这种人看的。
所以,使人头疼的地方在于,针对具体实现,不少状态是隐藏的,也没有必要让 iOS 开发者知道这些状态,所以这些细节也绝对别想在 Apple 的 API 文档里找到。可是我必须知道这些细节,若是不知道这些细节,或者我本身写个实现有误差的东西,到了 Android 上跑后会看到巨大的差别,并且这种差别极其难以定位。我这么说可能难以理解(恕我表达能力有限),总之就是“差之毫厘谬以千里”这样子。
这种定位的困难若是处理不当,对进度影响是很恶劣的。由于 bug 出现的地方可能和实际暴露的点之间隔了好多层呢。可能涉及到排版引擎的代码、各类开源项目的代码、我本人写的代码等。你要把 bug 和出问题的地方联系起来,不把整个项目拆了是作不到的。这种事情出一次,你也许得浪费 三、4 天时间来收拾。
并且更棘手的地方在于,若是你处理很差,这种现象可能天天都会冒出来。若是连续出个10几个,你就只能自杀了。幸运的是,我真的有认真考虑过这些可能性,并做了一些措施,结果,这一年里这种事情只出过几回。(但这几回就够呛了。)
这种问题通过我摸索,基本上靠两种方法解决。
第一,创建假设模型,而后实验。经过实验结果获取反馈,或者修改模型,或者证明模型。模型一旦证明,就能够开始码代码了。
第二,作实验能够得到大部分细节,可是某些太细节的东西作实验也无法活的。就只好先实现一个版本,而后假设它没有太大问题,等到以后证明有问题再改。
后一种状况比较坑爹,有些问题须要 3 个月才能暴露。将 3 个月后出现的问题与 3 个月以前写的代码联系起来是一件很头疼的事情。好在我 git 操做还算熟练。
对比起以前在另外一家公司写业务逻辑代码的 Debug 过程,简直不要过轻松。有强大的 IDE,加上仅仅经过设置断点和打印日志就能发现 bug,简直太美好了。
如今,咱们的排版引擎已经能顺利在 Android 上运行了。
你能想象,你用 MacBook 接上一台 Android 平板和一台 iPad,而后在 Xcode 按一个按钮,你的 Android 平板和 iPad 会同时打开一个相同的 App。目前咱们就能达到这种程度。
不过很遗憾的是,咱们的团队恐怕过几个月后就要解散了。虽然这个项目还有不少工做能够继续作,可是咱们的团队恐怕不会继续作它了。之后可能会把它开源吧。
顺便为推销一下我本身:
本人 2014 年毕业,快 2 年工做经验,过去 1 年远程工做经验
优先考虑远程工做
个人邮箱:xiangtantaozeyu@icloud.com
微信号:xiangtan_tao