咱們把 iOS 的 Cocoa Touch 移植到了 Android

這是我最近一年在作的項目,用咱們老大的話說,就是「能不能弄一個東西,讓個人 iOS 程序一行代碼不用改,卻能運行在 Android 上」。爲了這個目標,咱們最後弄出了個這樣的東西。git

提及來咱們之因此要作這個東西也是蠻有趣的。事情的原由,咱們須要把一個爲 iOS 寫的排版引擎移植到 Android 上。但咱們以爲這個排版引擎實在是太複雜了,並且把一個寫好的 iOS 程序從新寫個 Android 版本很無趣,那就變成了跟抄做業同樣把 Objective-C 代碼換成 Java 代碼的行爲了。程序員

因而,爲了移植這個排版引擎,咱們面臨兩個選擇:微信

  1. 把排版引擎移植到 Androidspa

  2. 把 iOS 移植到 Android,不改排版引擎,直接在 Android 上跑日誌

最終,咱們選擇了 2,因而我從此的一年(至今)就在搞這個東西了。code


談談我我的的體會吧。我參與到這個項目以後,就真正體會到了 iOS 的博大精深。我以前固然知道 iOS 必定有不少不少東西,可是當真正參與了這個項目,才發現 iOS 竟然是如此的龐大。以致於它的一個小小的方面竟然就包含了那麼多東西。blog

我本人的工做主要是把 Cocoa Touch 層移植到 Android 上去。具體就是如圖:ip

clipboard.png

把最上面那個青藍色的方塊移植到 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

相關文章
相關標籤/搜索