杭州app定制已步入app工廠時代
分享 2021.04.22 瀏覽次數:4163次
杭州app定制開發(fā)越來越炙手可熱。app工廠是什么?app工廠,是根據一個具有完備組件庫以及這些組件的依賴關系,組合成一個個app。在多app場景下,由于存在一套代碼,按需生成不同app所需要的代碼,原有的架構、代碼依賴關系、工程代碼組織方式都需要相應的改變。
app工廠的目標是在特定架構和業(yè)務場景下,基于一套代碼,按需生成目標app所需的代碼。一套代碼和按需生成是核心,缺一不可。特別是按需生成,意味著不攜帶任何不需要的代碼,這個在實現的過程中非常具有挑戰(zhàn)性。
業(yè)務的快速試錯催生多app
移動互聯網不論是在上半場,還是在下半場,業(yè)務的創(chuàng)新從來沒有停歇過。從微博到團購,從共享汽車到共享單車,從長視頻到短視頻,業(yè)務和模式的創(chuàng)新不斷。近幾年尤以頭條系的業(yè)務試錯見諸于各報端,從資訊到直播,再到短視頻,是一波接一波。
當前不論是大的互聯網公司,還是創(chuàng)業(yè)性的小公司,要想在新的領域摸索出一番天地,必須不斷試錯。移動領域的業(yè)務不斷試錯,要求能快速產出各業(yè)務對應的創(chuàng)新app。
集團業(yè)務的逐步擴大與細化催生多app
互聯網江湖早已三分天下,巨頭已經建立,大的互聯網平臺很難形成。但越是大的互聯網平臺,越擔心垂直細分業(yè)務的進攻。為應對進攻,集團業(yè)務也需要在一些領域逐步擴大和細化,垂直app應運而生。
垂直app與創(chuàng)新app的差距在于,垂直app是基于現有平臺業(yè)務細分而來,而創(chuàng)新app是平臺業(yè)務所沒有的。
另外,為了應對應用市場的分發(fā)和對包大小敏感的用戶,這幾年極速包幾乎成為各大公司的必備app。
集團業(yè)務的合并融合催生多app交叉
業(yè)務的收購、合并也是大型互聯網公司常有的事。收購合并后的業(yè)務如何融合,如何既能保持業(yè)務的獨立性,又能節(jié)省集團研發(fā)資源,還能支持一套交叉業(yè)務(又稱垂直業(yè)務)代碼在各獨立app運行,是一個重要又復雜的問題。比如今年集團內安居客房產業(yè)務和原房產業(yè)務的融合就是一個典型的案例。
app工廠的實施目標
1.app工廠有以下目標:
標準化能力的產出,為app研發(fā)提效增速
標準化能力是實現app工廠的基礎,標準化能力與app業(yè)務代碼無耦合關系,比如React Native SDK,網絡庫、緩存庫等。
支持創(chuàng)新app、垂直app、極速app的生成和迭代
同一套代碼,根據配置,能按需生成不同app所需的代碼。按需生成是關鍵和核心,不給app工廠生成的app代碼攜帶任何無用代碼,增加包大小。
支持垂直業(yè)務在獨立app上的平移
app工廠依附于app框架代碼上,馬甲包、極速包與app工廠(app)是一個子集與全集的關系。但類似安居客app與app是兩個獨立app,有交集(公共底層代碼或某些業(yè)務代碼),業(yè)務代碼集合不一樣。
針對獨立app的公共業(yè)務代碼,定義為垂直業(yè)務。app工廠在統(tǒng)一底層服務的前提下,也要支持垂直業(yè)務在獨立app上的平移。即一套業(yè)務代碼,能在兩個或多個獨立app上運行。
app工廠架構
PODS
在iOS領域,pods特指cocoapods,是其縮寫。cocoapods是對OC或swift Cocoa 工程的依賴管理。(CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. )
中間件
中間件在軟件領域的通用解釋是:連接軟件組件和應用的程序。在這里中間件體現的是連接和共用。連接的是業(yè)務層和基礎庫層,共用體現在業(yè)務層的公共服務。
中間件按照業(yè)務強相關與否分為業(yè)務中間件和標準中間件。
業(yè)務中間件:與業(yè)務強相關的中間件,在某一個獨立app中通用。由于對當前app其它功能的過多依賴,所以不適用于其他獨立app。
標準中間件:與業(yè)務弱相關的中間件,不僅在某一個獨立app中通用,在其它獨立app中也通用,與app中的業(yè)務弱相關。最常見的是標準版的RNSDK。
基礎庫
對其它pod不產生依賴的獨立庫。比如一些開源的三方庫,是常見的基礎庫。除了第三方開源的,集團內自封裝的sdk,如果對其它pod不產生依賴,也可以歸入基礎庫范圍,比如Passport SDK,WPush SDK等;
入口工程
主要負責對app工廠生成的app所需代碼進行配置。
入口工程pods:主要負責對app工廠生成的app所需代碼進行配置,入口工程中包括的功能有:
appInfo:對app基礎信息的設置,比如app名稱,bundle identifier,版本號,證書等;
Podfile:當前app對所需工程代碼的依賴,比如招聘馬甲包會依賴招聘業(yè)務pod以及其他基礎服務pod和三方庫pod;
Regen.sh: 一個可執(zhí)行文件(本地RD研發(fā)調試用),讀取podfile配置,拷貝app所需代碼及配置,然后生成app所需代碼;
Reng_jenkins.sh: 一個可執(zhí)行文件(Jenkins服務打包用),讀取podfile配置,拷貝app所需代碼及配置,然后生成app所需代碼;
工程庫池
工程池是app工廠總的pod代碼集合。
工程池是app工廠總的代碼集合,每一個生成app所需代碼都是從這個代碼集合中獲取,研發(fā)過程中代碼更新也會同步更新到此代碼集合中去。
業(yè)務pods:各獨立業(yè)務工程代碼,代碼集合根據業(yè)務類型來劃分,比如app首頁pod、房產pod、招聘pod;
中間件pods:app工廠中間服務代碼,是自己封裝的,區(qū)別于外界的第三方公開代碼,故稱為中間件代碼。中間件根據對app業(yè)務的是否強依賴分為:
業(yè)務中間件:與app業(yè)務強相關,但是是app中業(yè)務中通用中間服務,其應用場景在app的業(yè)務場景內。
標準中間件:與app業(yè)務弱相關,可以作為一個標準化中間件在其它獨立app上引入。在標準中間件中可以看到有圖標加了兩條豎線,這表示此標準中間件某些功能的實現依賴接入app的實現,只開放了接口協議。以RN基礎庫標準中間件為例:中間件包含的內容是載體頁及熱更新的全部公共的與業(yè)務弱相關的內容,但對于一些擴展的組件(比如埋點)需要開放協議讓接入方實現,中間件中不實現此邏輯。
三方庫pods:外界的開源第三方庫代碼,基本在行業(yè)內有統(tǒng)一的引用標準;
在架構設計上,各層pods的依賴準則為:
上層可以依賴下層,但下層不可以依賴上層。比如上層中的業(yè)務pod中的首頁(MainPage)可以依賴業(yè)務中間件中的生命周期(WBLifeCircle),但反之不能依賴。
可以隔層依賴。比如業(yè)務pod可以依賴基礎庫pod;
業(yè)務pod間不能產生依賴。比如房產pod不能依賴招聘pod。
中間件pod和三方庫pod可以單向依賴。比如RN所在pod可以對登錄服務所在pod產生單向依賴。
制定上述依賴準則,是為了在生產app時或者進行垂直業(yè)務平移時可以按需配置所需pod。
如何借助app工廠架構達成設計目標
1.如何提供標準化的能力
所謂標準化能力,可以理解為獨立無依賴的Framework或SDK,對應上述架構圖中的標準中間件。比如RN基礎庫,封裝了載體頁、熱更新等一整套公共服務,app外的獨立app可以無縫接入。
另外,還有一些集團內其他中臺部門提供的標準化SDK,比如PassportSDK、IMSDK、PaySDK等。
2.如何支持創(chuàng)新app、極速app的生成
在理想工程架構狀態(tài)下(即達到架構各層依賴準則),可以按需配置app所需功能,來生成馬甲包或者極速包。當然為了應對蘋果審核(app之間必須保持差異性),還得針對馬甲包或者極速包來做一些個性化的處理。這種個性化處理在先前的馬賽克項目有完成,具體詳見馬賽克項目。
3.如何支持垂直業(yè)務的平移
垂直業(yè)務:同一業(yè)務在多個app上呈現的業(yè)務稱之為垂直業(yè)務。
垂直業(yè)務平移:并不是真的去移動,是指垂直業(yè)務及依賴的底層代碼是一套公共代碼,能夠運行在不同app上。
上圖所示的是租房和二手房這兩個垂直業(yè)務需要達到一套代碼,同時運行在app和安居客app上。這就要求:
app和安居客app共用垂直業(yè)務所依賴的底層代碼(中間件代碼+基礎庫代碼);
垂直業(yè)務代碼及所依賴的底層代碼對app或安居客app中的獨有代碼沒有任何耦合,這樣就不會攜帶一些無關的不需要的代碼,有利于控制包大小;
垂直業(yè)務代碼及所依賴的底層代碼必須滿足app工廠架構中的分層原則和依賴原則,這樣架構擴展性會比較靈活
如何對存量代碼實施app工廠?
基于前文app工廠技術架構及各層pod的依賴準則,各層pod的依賴關系理想示意圖如下圖所示(以招聘業(yè)務pod依賴為例):
從業(yè)務層到中間件層再到基礎庫層,從上到下單向依賴,沒有反向依賴和循環(huán)依賴
業(yè)務層之間沒有依賴
中間件層和基礎庫層可以允許有單向依賴
有了上述理想的依賴關系后,在入口工程進行生成app所需代碼進行配置時,就能按需配置,不會因為pod之間的反向依賴、循環(huán)依賴、整層依賴攜帶很多無用代碼,增加包大小。
1. 業(yè)務層pod解耦
上圖所示的招聘業(yè)務的依賴關系。黑色箭頭表示的是pod的單向依賴,紅色的雙向箭頭表示的pod的雙向依賴。
備注:服務層對應中間件層,三方庫層對應基礎庫層。
針對業(yè)務pod解耦主要處理下層pod對業(yè)務pod的依賴以及業(yè)務pod之間的依賴,如下圖所示:
2. 中間件層pod解耦
如上圖中實線所示的是招聘pod所依賴的中間件層pod之間的耦合關系。
服務層pod解耦要解決以下兩種耦合關系:
pod之間的雙向耦合
pod之間的不必要單向依賴
服務層pod的解耦至關重要,直接涉及到對工具庫pod的依賴處理。如不解除服務層pod的循環(huán)依賴關系,則會導致對工具庫pod的整層依賴,沒法按需配置所依賴的pod,造成包大小無法控制。
3. 基礎庫層pod解耦
由于基礎庫層pod是最底層pod,沒有其他的依賴pod,所以也是這三層pod解耦工作量最少的。
目前app內的基礎庫層pod全都是放在一個pod中,這層解耦所要作的是按照功能對這個pod進行拆分,拆成一個個上層pod可依賴的單元。
如何保證app工廠質量?
app工廠的質量在版本迭代過程中的質量非常重要。如果在后續(xù)版本迭代過程中代碼沒有嚴格遵循app工廠的pod依賴準則,等到發(fā)現問題才去解決,會帶來很大的額外工作量。
1. Pod依賴關系檢測
這個是所有質量檢測的基礎。在本文看到的一些pod的依賴關系都是我們開發(fā)的pod依賴自動分析工具得出的。如果沒有這個工具,在一些中大型的app中,靠人工方式去梳理這種依賴關系,將是一個極大的工作量。在這里大概說一下思路,有更好的方式歡迎交流:
掃描本地工程目錄下所有pod代碼文件夾,及里面的類文件,建立類文件與pod工程的映射關系 filePodDict。
掃描每一個pod下面類文件中的文件依賴部分(import部分),根據頭文件依賴及上面的filePodDict,建立pod的直接依賴關系podDepenDict。
串聯所有pod的直接依賴關系,形成pod依賴最終關系podFinalDepenGraph,并輸出。最終Pod的依賴關系對應的數據結構是有向圖。
如上圖所示,是基于招聘pod和其依賴的pod構建的有向圖的示意圖(為便于識別,將兩個pod直接相互依賴的一條線畫成了虛線)?;谶@個數據結構,能實現前文所說的app工廠依賴準則的檢測。
2. 下層Pod對上層pod反向依賴檢測
下層pod對上層pod反向依賴,是app工廠依賴準則首要禁止內容。比如如果中間件層的WubaRN的這個pod依賴了上層 首頁pod,會導致在業(yè)務平移過程中因為依賴WubaRN,而需攜帶不需要的首頁業(yè)務代碼。
基于上述的有向圖,反向檢測在技術上很容易實現:
內置一份pod與層級的映射關系
遍歷pod依賴關系有向圖,檢測當前pod所依賴的pod層級是否小于自己的層級,如果小于,則是反向依賴,并標記
將標記的反向依賴關系輸出
3. Pod循環(huán)依賴檢測
在app工廠中,除了業(yè)務層代碼有非常明確的原因不能有依賴和環(huán)外,其它層的pod之間即使存在環(huán),也有辦法達到app工廠不攜帶多余代碼的目標。但撇開app工廠不說,環(huán)的存在本質上是大多數情況兩個pod之間存在公共代碼沒有下沉。所以為了使app工廠的依賴準則更簡單和更易執(zhí)行,就統(tǒng)一規(guī)定不能產生循環(huán)依賴。
檢測有向圖是否存在環(huán),是一個基礎的數據結構問題,在此不贅述。
4. 標準中間件污染檢測
標準中間件是app工廠的核心,如果標準中間件在后續(xù)的業(yè)務迭代過程中被污染,即引入了不符合準則的依賴關系,將帶來額外的維護成本和解耦成本。所以如果能在單分支研發(fā)的時候以及集成分支上進行檢測,將被污染的概率降到最低。
在app工廠中,標準中間件只允許依賴基礎庫層的pod。所以檢測策略也很簡單:
遍歷所有標準中間件
遍歷每一個標準中間件所依賴的pod,并判斷所依賴的pod是否屬于基礎庫層。如果不屬于,則標記這個被污染的依賴關系。
輸出所有被污染的標準中間件及不合規(guī)的依賴關系。
app工廠的實踐經驗
app工廠在app上有著廣泛的應用。目前已在房產垂直業(yè)務平移和招聘垂直app生成上進行了應用,并上線。
房產垂直業(yè)務平移實踐(木星計劃項目)
從去年開始,同城房產業(yè)務和安居客房產業(yè)務進行了調整,租房和二手房業(yè)務在兩個獨立app上進行了重新拆分和整合。業(yè)務調整后原來的同城租房和安居客二手房業(yè)務變成了垂直業(yè)務,即在同城app和安居客app兩個獨立app上同時運行。業(yè)務的調整給技術架構帶來了很大的挑戰(zhàn):
如何將同城租房、安居客二手房從原有app中拆分出來?
如何在拆分過程中處理依賴代碼,最大限度降低攜帶無關代碼?
可以想象一下,如果不基于app工廠要達成上述目標,會出現什么情況?
要么攜帶很多對方app所不需要的,或者重復的代碼,造成包大小失控。
要么針對具體業(yè)務寫非常多的協議(Protocol),各獨立app針對協議做各自實現。但這個協議會非常多,尤其針對存量代碼的改造成本非常高。
于是,無線技術部與房產技術部(安居客房產技術部、房產技術部)一拍即合,就將app工廠應用到房產垂直業(yè)務平移中。
1.項目里程碑
這里重點介紹一下項目里程碑,以說明在多app垂直業(yè)務平移過程中,接入app工廠的思路。
從上述表格及依賴關系可以看出項目主要分為三個階段:
抽離出垂直業(yè)務所依賴的公共庫
各app分別接入抽出的公共庫
垂直業(yè)務做一些適配,能同時運行在雙app上
第一個階段公共庫的抽離大概用了1個半月;第二個階段各獨立app接入公共庫用了1-2個版本(平均3個星期一個版本),主要看測試資源的情況;第三個階段垂直業(yè)務平移用了2-3個版本。
2.項目實施概述
2.1 公共庫的抽離
這里的公共庫是指垂直業(yè)務所依賴的中間件層代碼庫和基礎庫層代碼庫。這一步非常重要,如果沒有處理到位,后續(xù)業(yè)務在接入的過程中會不斷返工。
具體垂直業(yè)務對中間件代碼和基礎庫代碼的耦合分析上文已詳細介紹了,在此不重復描述。這里要討論一個實踐中很重要的問題:從兩個獨立app中抽離公共庫,如何統(tǒng)一的問題?
這個問題很復雜,以網絡中間件為例,各獨立app都有自己的封裝,而且封裝的API差異很大,很難通過調整API協議去抹平差異。這種情況下最簡單高效的方法是以一方app為基準,另一方app提兼容需求并放棄原有自己的代碼,抽離出來后共同維護。
考慮到app的體量和對業(yè)務的影響,當時商量的是以app為基準,安居客根據二手房業(yè)務代碼的調用需求,提兼容需求。app抽離出來后,安居客重新接入。
最終剝離出的公共庫(標準中間件)如下表所示:
關于公共庫的剝離有兩個關鍵點要注意:
以要平移的業(yè)務所依賴的公共庫為核心,不要貪多。以業(yè)務驅動來剝離公共庫,隨著業(yè)務的逐步接入和不斷支持,公共庫的數量和能力也逐漸上去了。
技術上剝離公共庫不難,難的是最大限度降低對其它業(yè)務的影響,以及保證關聯業(yè)務上線的穩(wěn)定性。
如前文架構中介紹的,公共庫有標準中間價和業(yè)務中間件。在這里沒有具體介紹業(yè)務中間件的情況。因為業(yè)務中間件的依賴關系比較復雜。在具體拆分時一定要詳細分析拆分成本。
2.2 各獨立app接入公共庫
下表列舉了實施過程中的其中有代表性的四個中間件在各獨立app上的接入方案。
由于是基于app抽離出的中間件,所以app租房代碼在平移的過程中,業(yè)務代碼基本不用改動。但安居客的業(yè)務代碼需要做相應的改動,這個成本是節(jié)省不了的。從當前上線的安居客二手房功能代碼穩(wěn)定性來看,這個部分改動很成功。
2.3 垂直業(yè)務平移
上述垂直業(yè)務依賴的公共庫在各個獨立app接入后,并不意味著垂直業(yè)務就可以平移了。app工廠的一個核心目標是不攜帶無關代碼。垂直業(yè)務除了對公共庫有依賴,還對自身app中的其它模塊代碼有依賴。只有最大限度對這些非公共庫代碼摘除依賴,即拆分成業(yè)務中間件,才能真正滿足app工廠目標。
這里不具體敘述如何去解藕業(yè)務中間件,主要介紹一下操作過程中的幾個準則,只要把握好這個準則,基本沒什么大的問題:
分析依賴代碼能否做成業(yè)務中間件。業(yè)務中間件一定要滿足前文敘述的單向依賴原則,否則在代碼攜帶過程中無法做分析。
如果依賴代碼只是少數幾個文件,不足以拆分出業(yè)務中間件。在對包大小沒有影響的前提下可以允許一些重復代碼。
拆分業(yè)務中間件的過程中一定要保證對其它業(yè)務線不要產生影響。比如房產和招聘都依賴一塊業(yè)務中間件代碼,那在滿足房產業(yè)務平移的過程中,要想辦法不要對招聘代碼產生影響。
對常見的解藕手段一定要注意選型,比如什么場景該用通知,什么場景該用runtime,什么場景該用protocol。
3.項目成果
這個項目是三方一起共同完成的,在這里僅說無線iOS側的一些成果:
上述成果只涵蓋了app工廠標準化成果,這些標準化成果不僅僅支持房產垂直業(yè)務平移,還適用于對其它業(yè)務的支持,比如同城招聘app(已完成)、同城租房app(即將進行)的生成和部落垂直業(yè)務平移(正在進行)。關于業(yè)務中間件的解耦與具體業(yè)務有關聯,在此沒有詳細梳理。
app工廠在木星計劃中對包大小的收益及接入后的穩(wěn)定性如下表所示:
從上表可以看出,包大小上不論是對app還是安居客app,都有非常大的收益。崩潰率在接入前后沒有顯著性變化,代碼上線穩(wěn)定表現良好。特別是針對崩潰率和功能穩(wěn)定性,涉及這么大范圍的變動,能做到沒有線上事故確實不容易。
- PREV:杭州汽車定制app主要有哪些模式?
- NEXT:無
-
杭州APP定制:選擇合適開發(fā)公司的重要性
日期:2024-12-20瀏覽次數:730次
-
杭州app開發(fā):如何選擇專業(yè)開發(fā)公司?
日期:2024-12-20瀏覽次數:730次
-
杭州定制小程序公司:小程序行業(yè)的未來趨勢
日期:2024-12-20瀏覽次數:747次
-
杭州小程序開發(fā)公司:如何運營小程序以吸引更多客戶
日期:2024-12-13瀏覽次數:950次
-
杭州app定制公司:如何打造網站建設第一品牌的特色?
日期:2024-12-13瀏覽次數:943次
相關新聞
整合同類新聞,相關新聞一手掌握
-
伊春網頁設計,要了解的基礎常識有哪些?
日期:2023-02-21瀏覽次數:1693次
-
伊春公司的網站排名怎么做
日期:2023-02-21瀏覽次數:1661次
-
伊春網站制作的主要步驟有哪些
日期:2023-02-21瀏覽次數:1667次
-
伊春企業(yè)的,網站用戶來自哪里?
日期:2023-02-21瀏覽次數:1658次
-
伊春做網站建設找哪家好?
日期:2023-02-21瀏覽次數:1672次
最新新聞
與互聯網同行,實時掌握網建行業(yè)最新動態(tài)
-
網站建設前期需要做哪些準備
日期:2020-01-21瀏覽次數:5257次
-
APP開發(fā)現狀如何?未來之路如何走?
日期:2020-02-19瀏覽次數:4723次
-
新能源APP開發(fā)的好處是什么?
日期:2021-03-02瀏覽次數:2015次
-
怎樣讓杭州網站制作更精致?
日期:2021-07-22瀏覽次數:3814次
-
杭州網站制作對杭州企業(yè)的營銷有多重要?
日期:2021-08-04瀏覽次數:3950次
隨機新聞
新聞新動態(tài),您需要的新聞管家
洞悉市場趨勢演變讓傳播回歸社會
免費獲取網站建設與網絡推廣方案報價
-
關于我們
杭州帷拓科技有限公司,是一家新型的全案網絡開發(fā)公司,作為以互聯網高端網站建設、APP開發(fā)、小程序開發(fā)為核心的專業(yè)網絡技術服務供應商,帷拓科技致力于全面分析市場環(huán)境、衡量與預測市場需求、整合區(qū)別于行業(yè)競爭對手的絕對優(yōu)勢,結合品牌理念深度挖掘項目優(yōu)勢和產品價值,提升客戶品牌認知、認可度。
-
我們的客戶
帷拓科技歷經十年沉淀,與國內外上千家客戶達成合作關系,其中穩(wěn)定合作的公司有:浙江華為、浙江移動、浙江5G產業(yè)聯盟、浙江省社科院、綠城足球俱樂部、娃哈哈雙語學校、健康中國杭州峰會、科雷機電等,帷拓科技始終堅持“帷有專業(yè),才能拓展無限”的服務理念,堅持“認真堅持細節(jié)”的優(yōu)質服務理念,不斷完善自身,成就企業(yè),最終實現共贏。
-
我們的業(yè)務
帷拓科技主營業(yè)務范圍包含互聯網高端網站建設、APP開發(fā)、小程序開發(fā)、商城網站建設、公眾號運營以及數字營銷等,涵蓋了服務、房產、數碼、服裝、物流貿易等行業(yè),根據品牌現狀,為每個客戶量身定制項目整體服務方案,以敏銳的市場洞察力、創(chuàng)新的市場策劃能力,全面把握市場變化,為客戶實現從企業(yè)到消費者的價值轉換。