天天看點

蘋果封的不是熱更新,封的依然是底層敏感接口

最近大家都在讨論蘋果封殺熱更新,覺得蘋果手又癢癢了,為了賺錢,無所不用其極。

大家擔心一堆遊戲要玩不了了,甚至擔心微信小程式要完蛋了,更奇葩的還有擔心 12306 也不能用了。

作為軟體工程師,筆者嘗試揣測一下蘋果封殺熱更新的初衷,以及對行業可能的影響。

我們首先從“APP”和“更新”這兩個東東來說,業内人士請直接跳到第 4 段開始。

—1—

APP,即 application 的縮寫,中文翻譯為應用程式。蘋果手機上的應用,屬于面向使用者的終端應用,屬于一種計算機應用程式(軟體)。

闆磚機時代,手機裡也有程式,比如俄羅斯方塊,這個程式是定死的,不可改變,甚至關機之後,連自己的遊戲積分也沒了。這就像是小商小販使用的電腦,功能是定死的,而且無法儲存任何曆史資料。

這種程式定死的裝置,除了早期的闆磚機、電腦、遊戲機、還有 VCD、DVD、MP3 播放器等等。

小霸王遊戲機,想玩什麼遊戲,必須要買遊戲卡,遊戲軟體是固化在遊戲卡裡邊的。

VCD、DVD、MP3,程式軟體是定死的,有些能解碼 MP3,有些能解碼 MP4,但要解碼的音視訊内容則存儲在碟片上。

小霸王遊戲機的主機,相當于計算機硬體系統(處理器、記憶體等);

包含有多種遊戲的遊戲卡,相當于計算機的軟體程式,電腦上用軟碟、硬碟、CD光牒存儲,遊戲機上用遊戲卡存儲;

包含有音視訊内容的碟片,相當于需要處理的各種資料。

這裡我們劃分了三個角色:看得見摸得着的硬體裝置、完成不同任務的軟體程式、資料。

DVD/MP3/MP4 的硬體和軟體都是定死的,唯一可以更換的就是資料碟片或記憶體内容,除了看電影,我們不能指望 DVD 幹别的。

遊戲機還好,可以通過更改遊戲卡玩不同的遊戲,隻不過,特定遊戲卡裡的遊戲是定死的,不能改變。

—2—

再來說更新的問題。

相比 VCD 和遊戲機,電腦的功能更強大,可以安裝不同的應用程式。

在網際網路普及之前,如果我們需要購買新的應用程式,就必須要通過購買對應的軟碟、CD光牒,或者優盤。

網際網路普及後,我們可以在網絡上下載下傳應用程式,比如說 QQ。

最開始的時候,QQ 各個版本的更新,都需要我們手動從 QQ 網站下載下傳,然後手動安裝更新。

後來,為了解決版本更新的問題,幾乎所有軟體都提供了自動下載下傳、自動更新的功能。

剛開始的時候,應用軟體将自己整體更新,後來,随着應用軟體越來越複雜,體量越來越大,逐漸采取“部分更新”的政策,即:将自己的一部分功能更新。

—3—

回頭來看蘋果手機上的軟體更新。

蘋果商店有個設定,可以自動更新應用程式,比如微信有了新版本,蘋果手機會在晚上的時候幫我們自動下載下傳更新到最新版本的微信。

這個更新動作,是由蘋果手機做出的,而不是微信做出的。

盡管最近幾年的蘋果系統都是預設自動更新,但是,依然有不少使用者停用自動更新,選擇手動更新應用軟體。更何況,整個應用軟體的更新,耗費流量比較大,時間也比較長,尤其是動辄幾百兆的手機遊戲。

問題來了:微信要做一個新的廣告,某個遊戲要更新一個遊戲場景,如果采用更新整個應用程式的方案,代價太高。

于是,軟體供應商(微信或遊戲)開始采用電腦上常用的“部分更新”政策,自己對自己進行一部分功能的更新,不更新整個應用程式。

從更新方式上,顯然,蘋果商店的自動更新,所有應用軟體依然來自于蘋果商店,都是經過蘋果稽核後的應用軟體,是以,這種方式肯定是蘋果自己主推的。

—4—

熱更新的風險

應用軟體自己對自己的熱更新,無論整體還是部分,既然電腦上可以,蘋果手機上為什麼就不允許呢?

應用軟體自己對自己的熱更新,雖然具有很大的便利性,但對使用者來講,具有巨大的“未知風險”。

首先,靜默安裝導緻的使用者知情權和控制權風險。比如電腦上,安裝一個軟體之後,過不多久,就會發現這個軟體越來越大,甚至默默的替我們安裝了一大堆别的軟體。

其次,從好的方面講,蘋果的稽核政策保證了所有蘋果手機上的軟體能夠按照蘋果設定的使用者體驗發展,否則的話,真不知道手機的左上角右上角會多出多少小圖示,沒準時不時的右下角彈出個廣告框。

再次,未經稽核的軟體,是否具有安全風險也未可知。盡管蘋果的稽核解決不了所有的安全問題,但至少能夠解決大部分的安全問題。

還有,未經稽核的軟體,自己偷偷增加了賺錢的功能,竟然不給蘋果分享,當然蘋果不樂意了。

是以,無論是從使用者體驗還是從商業利益的角度,蘋果都有很強的欲望禁止應用程式的熱更新。

—5—

熱更新的必要性

然而,如同上邊所述的案例,微信要換個廣告,遊戲要更新個場景,這個需求是存在的。

于是,在保證應用軟體的體驗、安全、利益的前提下,提供軟體的更新,就成為蘋果稽核的訴求。

是以,以下幾種熱更新,顯然是蘋果允許的。

1、資料更新。比如說 12306 更新一下全國的鐵路客車時刻表,這隻是對資料的更新,應用軟體本身的功能并沒有發生更改。

2、配置的更新。比如說某些 APP 通過更新圖檔、顔色來更新外觀界面,甚至更新各個按鈕的位置。

3、腳本(此處的腳本有歧義)的更新。比如遊戲裡增加一個故事腳本。

以上這些更新,并沒有擴大整個應用程式的功能範圍,盡管某些界面的更新會導緻使用者體驗的問題,但不會對安全性、商業利益造成沖擊,是以,蘋果不會限制。

—6—

典型的熱更新

以下幾種典型的熱更新,是否能夠通過稽核,完全取決于實作的方式,而不是外在的功能。

1、廣告更新。

如果僅僅是更新廣告内容,顯然隻是對資料進行更新,并沒有對軟體功能進行更新,是以是允許的。

如果更改了廣告的展現方式,則要區分是用何種技術手段實作的。如果多種廣告方式是提前代碼裡規劃好的,隻是通過更新配置來更新廣告方式,則是允許的。

2、微信小程式

最近微信小程式的功能擴充的非常頻繁,從微信推送的說明來看,顯然,微信小程式能夠調用到的功能和接口都是微信提前定死的,小程式必須通過微信來調用作業系統功能,而無法調用微信不提供的功能。

這就相當于:浏覽器裡邊的 H5 頁面,無論如何,都是需要通過浏覽器來間接調用系統功能的,而無法直接擷取到系統接口權限。

是以,微信小程式是安全的,也是蘋果允許的。

3、遊戲

遊戲是個重災區。

舉個例子來說:要在遊戲裡搭建一個嶄新的城市。

如果遊戲引擎中搭建城市的方式是通過配置檔案的更改,那麼,這些遊戲基本上問題不大。

如果遊戲引擎中搭建城市的方式是通過一段軟體程式直接搭建,那麼,風險就比較高了。

如果遊戲引擎本身提供的間接接口有限,為了擴充的便利性而提供了直接通路底層系統接口的能力,那麼,這種風險就非常高了。

—7—

封殺的矛頭是什麼?

從蘋果發送給各個開發者的郵件可以看出,封殺針對的是那些提供系統底層接口通路能力的“熱更新架構”,而不是針對“熱更新”這個行為。

換句話說:蘋果封殺的不是熱更新,封殺的是不受控制的底層接口通路。

比如:performSelector、method_exchangeImplementations,這兩個方法,提供了通路任何底層接口的能力。稽核的時候,應用程式不通過這些方法通路某些敏感性的接口,而稽核通過之後,應用程式通過熱更新來調用某些對安全有風險的敏感接口。

那麼,為什麼許多熱更新架構要提供這個能力呢?

熱更新的目的,當然是為了更改軟體的某些資料、配置甚至某些流程、邏輯。

然而,作為一個架構,如果要通過中間件的方式(比如微信對小程式,浏覽器對 H5)完美支援所有軟體的功能需求,顯然要做大量的工作,幾乎要将所有蘋果允許的系統接口全都封裝一遍,這幾乎是不可能實作的。

于是,就有了兩種結果:要麼瞄準某些行業,提供遠小于系統完整功能的局部功能;要麼,幹脆提供一種穿透中間件直達任何系統底層接口的能力。

前一種方案,當然會導緻此類架構的應用範圍受到極大限制。

後一種方案,雖然滿足了所有行業軟體開發商的需要,但必然會導緻軟體功能在稽核之後的完全不可控。包括影響系統及使用者資料的安全,以及規避蘋果對收費提成的訴求。是以,自然會遭到蘋果竭盡全力的封殺。

—8—

通過上述分析,可以得出一個結論:

如果軟體對系統接口的調用在稽核期間是完備的,不存在稽核之後新增系統接口的可能,那麼,無論是否存在熱更新,都是允許的。

如果軟體對系統接口的調用,尤其是某些敏感接口的調用,在稽核之後動态加載,這種方式一定是會被否決的。

同樣的,如果軟體使用了具備上述能力的架構、SDK 等第三方代碼或元件,盡管自己沒有調用敏感接口,但由于存在“調用敏感接口的可行性”,是以也是會被否決的。

對于遊戲引擎來說,過于通用化的遊戲引擎,風險是比較高的,因為遊戲引擎開發商為了通用性極有可能會提供不受控制的直達系統接口的通路能力。

從工作量上來說,實作同樣的熱更新,如果用戶端軟體做的事情越多,那麼,可控的範圍越高;用戶端軟體做的事情越少,那麼,為了擴充性,不受控制的範圍就越廣,風險也就越高。

說句不太好聽的話:有什麼大不了的功能更新,不能提前在用戶端布局好的?非要用這種完全擴充能力的熱更新架構?

“沒準哪一天我們需要新增大的功能呢?”

蘋果稽核現在已經夠快的了,這麼重大的功能,連三天的提前量都預留不出來麼?

“突然出了 bug 怎麼解決?”

出了 bug,難道沒有什麼政策能夠提前避免或者規避出現這麼嚴重的 bug 麼?非要通過熱更新?如果連熱更新自己都挂了,又該怎麼辦?

軟體工程師是喜歡自由的,不希望受到太多限制。

然而,既然是“工程師”,就要明白:所有“工程”都是有标準有流程的。

一個上萬零器件的機器,99%的零件都是标準化的。而且,從機器開始正式使用之前,所有的故障預案都已經做好了。

不能等着軟體出現故障了才尋找解決方案,而是在軟體分發出去之前,就要有出故障之後的預案。

甚至,一個标準的軟體,一大半的代碼是在規避故障,以及收集資訊以供出現故障之後迅速定位、解決。

除了故障的預防、定位和解決,任何工程的擴充性,尤其是軟體的擴充性和延續性,也是一個軟體架構是否足夠成熟的标志。

相對于面向大型機構的商業軟體,蘋果手機上面向普通使用者的大部分終端軟體,還有很多地方值得改進。