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

2020-12-17 開源中國

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

說起來我們之所以要做這個東西也是蠻有趣的。事情的起因,我們需要把一個為 iOS 寫的排版引擎移植到 Android 上。但我們覺得這個排版引擎實在是太複雜了,而且把一個寫好的 iOS 程序重新寫個 Android 版本很無趣,那就變成了跟抄作業一樣把 Objective-C 代碼換成 Java 代碼的行為了。

於是,為了移植這個排版引擎,我們面臨兩個選擇:

最終,我們選擇了 2,於是我今後的一年(至今)就在搞這個東西了。

談談我個人的體會吧。我參與到這個項目之後,就真正體會到了 iOS 的博大精深。我之前當然知道 iOS 一定有很多很多東西,但是當真正參與了這個項目,才發現 iOS 居然是如此的龐大。以至於它的一個小小的方面居然就包含了那麼多東西。

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

把最上面那個青藍色的方塊移植到 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 和出問題的地方聯繫起來,不把整個項目拆了是做不到的。這種事情出一次,你也許得浪費 3、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

原載:segmenfault

相關焦點

  • iOS入門基礎
    iOS框架層次 一、從底層到應用層 (一)core os -> core services -> media ->cocoa touch 核心系統->核心服務->媒體服務層->可觸摸層
  • 一看就懂的Android APP開發入門教程
    工作中有做過手機App項目,前端和android或ios程式設計師配合完成整個項目的開發,開發過程中與ios程序配合基本沒什麼問題,而 android
  • iPhone和ipod touch傻傻分不清楚?
    iPod touch和iphone的外觀非常相似,正面幾乎一樣,同樣採用相同的ios系統,唯一的區別就是ipod touch不支持通話功能,其他功能幾乎相同。iPod touch和iphone價格就差2倍還要多,那些想體驗ios系統,卻接受不了iphone昂貴价格的朋友ipod touch是不錯的選擇,當然iphone相比同年代發布的touch處理器是不同的,iphone的處理器往往要先進一到兩年左右。
  • Lego Hidden Side使用「鬧鬼」積木在Android和iOS上推進A
    這款樂高Lego Hidden Side玩具價格從20美元到130美元不等,模型包括一輛巴士、墓地和校舍。在實體形態上,模型在白天沒有任何變化,到了夜晚的時候AR應用程式會把幽靈顯現出來。樂高高級副總裁Tom Donaldson解釋說:「我們的核心是注重觸覺建築,但增強現實技術提供了機會,通過新的動作和掌握元素來增強樂高的實體玩法。」我們正在打破遊戲優先的AR遊戲體驗模式,創造一種新的遊戲類型,在這種遊戲中,現實世界實際上會影響AR層,而不是反過來的情況。
  • Python Appium開啟Android測試之路
    1、獲取 Android app的Activity  打開終端cmd,先cd進入到剛才下載的「新浪.apk」目錄下,然後使用aapt dump badging xxx.apk命令獲取包內信息。注意,啟動類名稱一個字母都不能錯。
  • 我感覺我學了一個假的Android...
    這次可是在切換到UI線程拋出來的。對應我開頭的靈魂拷問:UI線程更新UI就不會出現上面的錯誤了嗎?是不是在一股懵逼又刺激的感覺中無法自拔...還有更刺激的事情...嗯,篇幅問題,本篇我們就到這了,更刺激的事情我們下次再寫。別怕,沒完,我總得告訴你們為什麼吧。
  • 十款iOS平臺音樂播放器產品解析
    2沃音樂  運營商定製類音樂播放器  名稱:《沃音樂》  支持平臺:ios/android/wp  使用條件:無須註冊3愛音樂  名稱:《愛音樂》  支持平臺:ios/android/wp/s60  使用條件:無須註冊
  • 新iPod touch:中小學生的寵兒,成年人的智商鑑定機
    近日,蘋果商城很是低調的上架了一款新產品——iPod touch。新款 iPod touch 容量最高 256GB,搭載 A10 Fusion 晶片。本來心想時隔多年,iPod touch產品線終於復活了,於是,滿懷期待的點進了蘋果商城,看到的卻是這樣的封面圖。看到這個封面圖,我有種穿越的感覺,我甚至一度懷疑是蘋果官方粗心放錯圖片了。近幾個月一直傳出新iPod的風聲,有人還做了渲染圖,沒錯,這才是我想要的那個iPod。
  • [書摘]Android用戶輸入系統的移植與調試
    本文節選於電子工業出版社 北京博文視點資訊有限公司推出的《Android系統級深入開發——移植與調試》一書第08章第二節和第三節,這是一本全面介紹
  • 極客給力,Siri 被移植到 iPhone 4 和 Touch 4 上
    極客給力,Siri 被移植到 iPhone 4 和 Touch 4 上 根據 9to5Mac 的消息,Siri 功能現已移植到 iPhone 4 以及 iPod Touch
  • 新ipod touch,蘋果最讓人失望的產品,搭載A10也不推薦購買
    ipod touch幾個理由。不過蘋果公司就是這樣,一個外形能用在好幾代產品上,比如iPhone6到iPhone8,外形幾乎沒變,再加上新ipod touch本身更像是MP4一類的東西,不支持打電話,不支持發簡訊,那到了沒網的地方,新ipod touch就什麼事都幹不了,這有什麼意義呢?ipod touch的功能手機都支持,那有什麼必要在買了手機之後再買一款新ipod touch呢?
  • Android自定義控制項:類QQ未讀消息拖拽效果
    ,然後我們加上touch事件的監聽,達到動態的更新dragPoint的中心點位置以及stickPoint半徑的效果。現在小紅點的繪製基本告一段落,我們不得不去思考真正的難點。那就是如何將我們前面的這個GooView應用到實際呢?
  • ios13.5怎麼樣更新了什麼 ios13.5正式版什麼時候出
    繼蘋果推送ios13.5 Beat3測試版本相隔僅一周時間,近日蘋果又面向開發者設備推送了iOS13.5預覽版Beta4版本,此次更新主要是在Beta3的基礎上進行Bug修復。那麼,ios13.5怎麼樣,更新了什麼?ios13.5正式版什麼時候出?下面跟1688小編一起來看下吧。
  • 蘋果xs max升級iOS13.3後,在這4個方面提升大,還有3個bug沒解決
    這是a12晶片的代表機型,對此我們覺得本次升級在這幾個方面表現不錯:對聯通用戶很友好,聯通升級VoLTE,邊打電話邊使用4G,在ios 13.3中開通了聯通的VoLTE,之前如果是聯通卡,打電話時,蜂窩數據會從4G回落到3G。升級到IOS 13.3之後,這個問題解決了,而且VoLTE通話更清晰。
  • ipod touch上新,人們卻看到了沒落的輝煌
    在前幾天,一個哥們和小孟說ipod touch上新了,小孟當時夢回2012年,當時小孟購買了第一款ipod touch,時間過得好快,從來沒想過ipod touch還會真的推出新產品,於是小孟趕緊打開蘋果官網,官方的廣告明明白白的打著「新款ipod touch,夠快,夠快樂」,但仔細一瞧
  • Android子線程也能修改UI?
    前面的流程一切正常,然後執行到checkForRelayout的時候就有問題了:在checkForRelayout的方法裡面,radioButton最終執行了invalidate方法直接return掉了。一般我們會拋出Only the original thread that created a view hierarchy can touch its views.
  • android系統上的WII,PS2模擬器讓IOS用戶羨慕不已
    android系統上的WII,PS2模擬器讓IOS用戶羨慕不已 在很久很久以前就想過萬一PS2模擬器登陸智慧型手機會怎麼樣
  • Android應用與iOS應用之間的設計差異對比
    考慮ios和Android原生應用控制項規範的差異,對於導航模式的設計很關鍵。 Android設備底部有一個全局導航欄, 使用導航欄中的後退按鈕是返回上一個界面或步驟的簡便方法,它適用於所有Android應用。
  • 雙向教學(IOS+Android)[第二十六課]
    ios蘋果修改方法千千萬萬,我們只是其中的一個小點滴更多的了解跟學習,使我們更加的強大。尋求合作者,一起共同發展這節課主要講解的是特徵碼的運用查找跟物品代碼的查找ios首先打開我們的團隊修改器界面顯示為:然後我們選擇我們的程序設置精英範圍打開我們的裝備界面75000,那就直接搜索數據太多,我們要過濾數據,這裡我們看到第二個裝備