精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

微信 Android 模塊化架構重構實踐(下)

開發 開發工具
“大前端”是個熱門的方向。我們結合自身情況,考慮到遷移已有代碼不是一件容易事,讓團隊徹底切換編程工具短期不現實。這種“遠水解不了近渴”的感覺,也只能暫且作罷。

上篇:http://zhuanlan.51cto.com/art/201708/547499.htm

取舍和選擇

對于架構重構,我們也曾放眼行業內已經發布過的各種方案,希望從中找到一些解決思路。

我們參考了很多業界開放和發表的架構設計。總的來說,目前Android端App整體架設計上,除了聚焦在“大前端”之外,基本上都在“插件化/應用沙盒”上面下功夫。可以參考如atlas、small、DroidPlugin、DynamicApk等等方案,不難發現讓模塊最終具備動態性是它們最核心的能力。

“大前端”是個熱門的方向。我們結合自身情況,考慮到遷移已有代碼不是一件容易事,讓團隊徹底切換編程工具短期不現實。這種“遠水解不了近渴”的感覺,也只能暫且作罷。

我們把目光投向了“插件化/應用沙盒”。沙盒的好處是它具備很強的隔離性,有些方案可以徹底隔離代碼和資源,邊界限制性極強,效果很好。此外,多數方案也都具備動態更新能力、補丁能力,動態性基本成為標配。所以這時我們在考慮需不需要走上這樣的路。

一切從自身情況出發。在微信的角度看,我們最關心的問題是如何能約束住代碼邊界,如何防止架構劣化,如何提高開發效率。這樣的情況下,重新審視了具備動態性的插件化和沙盒方案。先從動態性上考慮,回看業內的使用經驗,目前的動態性通常有兩個主要的用途:1)作為熱補丁使用;2)業務并行發布需求強烈,例如運營需求,作為快速發布的手段。對于第二點,就目前的微信團隊來說是較少遇到的弱需求。相較之下,工具類和電商類應用常有符合的使用場景。而對于***點,我們則期望在實現模塊化上,目標相對純粹一些,專心解決代碼自身問題,之后再通過tinker在開發階段之外實現熱補丁上的動態性需要。

再來看隔離性。需要說明的是,這里的隔離型主要來自于沙盒架構效果。對于非獨立插件化工程(需要編譯依賴其他插件)除了動態性,它的作用和普通module在代碼隔離上沒有區別,不做討論。

我們心里很期盼代碼與代碼之間那種干凈清爽的分割效果,但事與愿違。

圖20 - 模塊依賴示意圖

圖20 - 模塊依賴示意圖

從上面這張模塊依賴示意圖看到,微信業務模塊之間數據關系相當復雜,模塊間相互訪問數據、共享某些功能的行為如此普遍。而實際情況比示意圖更麻煩。

面對微信業務數據相互間頻繁的調用,沙盒隔離容易導致代碼復用困難和相互調用麻煩,想在微信上實現,目前困難極大。重構難度不談,單是隔離的收益就很有可能無法彌補開發效率上的損失。

從開發模式上看也是一樣。微信Android團隊目前每個迭代大概三四十人參與,內部溝通成本不算高到不可接受。通常開發同學可能要同時開發和修改幾個模塊并保證他們相互模塊獨立,同時又可能有頻繁的模塊間通信。這種時候,模塊調用方不方便顯得很重要。

此外還需要考慮的問題,從幾個成熟方案中都能看到hook Android框架、修改aapt、替換或包裝android gradle plugin、代理組件等等設計。這些方案的復雜度和兼容性代價,不能忽視。使用和維護它們需要仔細權衡。

所以思前想后我們仍選擇了重走最開始的模塊化之路。一切問題的根本還是在那個說的很多年的代碼邊界、解耦和內聚上。只要有了清晰獨立的代碼模塊,才有將來其他變化的可能性。

代碼之外,架構之內

模塊負責人制度

有這樣一句話,“不被監管的權利一定會發生腐敗” 。如果放到軟件開發的行當來說,就是“不被監管的代碼也一定會發生劣化”。所以代碼應該要接受“監管”。

為了能長期有效的保持代碼質量,我們開始執行新的代碼審查機制——模塊負責人制度。

代碼審查的好處毋庸置疑。在這之前,微信由于業務發展快速,同學們經常會變換需求的開發方向。面對著業務模塊數量比人多的情況,開發同學經常一個人需要開發多個模塊。也因此許多模塊被無數人維護過,基礎的支撐工程更是如此。這種類似游擊戰的方式,開發效率很高,支撐了微信快速的研發節奏,但也導致了“無主代碼”特別多。大家缺少對代碼的“歸屬感”,也降低了改進優化模塊的欲望。

另外在這之前,代碼審查是由leader對申請回流主干的Merge Request進行review,這導致效率較低且容易遺漏問題。合理的代碼審查更應該是全員性質的。

模塊負責人制度嘗試改變這些現狀。通過大家認領模塊,對模塊的代碼和設計負責,對模塊對外提供的接口服務負責,對其他人修改自己模塊的行為進行監督。這些情況明顯提高開發同學的代碼所有感,改變大家修改優化和修改代碼的動機。

推動模塊負責人制度,漸進式的推動了大范圍的代碼審查,這樣的方式很適合像微信這樣沒有從一開始執行全員性質Code Review的項目。目前模塊負責人機制運轉順利,代碼審查率和模塊認領率都在提高。

重構與開發者心態的關系

在一個長期沒有改進的框架下,開發者的習慣可能會逐步變成跟隨式、保守式的開發。這大概可以被描述成“只要別人這樣做,我也這樣做,哪怕這么樣的設計不好,但也不會錯”。隨著心態逐漸普遍,另一種情形出現:經常能聽到有同學吐槽一些代碼,卻更少看到代碼在被改進。這說明一些沉積的問題不是沒有被大家發現,只是沒有人愿意去修改。這種情況下代碼和框架會隨著時間變得越來越差,有些問題逐漸變成“陳年舊病”。 面對這個問題首先要說,這不是開發者合格與否的問題,實際上有想法的開發人員有很多,但想將每個想法轉換成代碼并讓大家接受,并不是一件很容易的事。尤其在一個大框架下,嘗試改變的代價很大。如果他的主要任務不在改進某些模塊上,那么很多想法***都無法變成現實。這也是為什么保守和跟隨的習慣會逐漸變的普遍。

保守的氣氛需要被打破。當開啟一次重構之后,你會發現團隊中會有很多積極的聲音響應,他們會把積壓的想法和意見拋出來。一次問題的解決,可能會為另一個問題的解決帶來機會,其他開發同學的一些想法也許就能更容易落地。所以不定期的推動一些模塊的重構,將一些對代碼的不滿釋放出來,是一種不錯的激活。

此外在重構之后,還要考慮引導開發的代碼組織方式切換,多用模板、正確的代碼實例等,讓他們可以放心參考。

模塊劃分經驗談

維持代碼邊界

代碼的邊界就像一堵墻,架構的劣化都是從這堵墻的瓦解開始的。從以往的經驗來看,編譯上的隔離是***的約束手段,單純的約定或準則并不能永遠的保持下去。 所以在任何情況下都盡可能不要放開編譯上的約束。接著,將接口和實現分離,其他工程只依賴接口而不依賴實現,這樣的邊界效果更好。當然破壞無處不在,例如遇到某個緊急需求要某模塊新增若干接口,就可能出現跳過接口直接依賴實現工程進行開發的情況。這時可以考慮通過代碼的審查進行監督,也可以通過開發簡單的編譯腳本,檢查是否有不當依賴產生。

劃定模塊邊界的細節問題

當對代碼進行解耦時,即便大體上的模塊職責劃分已經清晰,但因為模塊間的各種業務關系,細節上仍會遇到糾纏不清的情況。事實上,因為需求及功能的不同,并沒有哪一種模塊劃分的規則是完全適用于每個應用的。隨著業務的發展和變化,模塊邊界出現不合適的情況完全符合預期。

那么如何讓模塊劃分更讓大家覺得合理,或者說當遇到一個兩難選擇時,按照什么樣的方式大家會更好理解?我們建議的方法其實也很簡單:試著對代碼“講一個符合邏輯的故事”,哪個故事講得通,你就可以將之作為拆分的選擇。因為代碼解耦從來不是問題,糾結的只是解耦行為能不能讓人理解。例如一些模塊間通信用的數據結構究竟屬于那個模塊的問題就可以用這種方式仲裁。在糾結的時候,能自圓其說的方案往往就足夠了。我們要盡力避免的,應該是隨意拼湊和單純為了類型解耦而解耦的情況。

模塊的一般組織方式

設計一個模塊,我們有一個一般性的組織方式,可以將模塊分成三個工程:implementation工程、api工程、library工程。

implementation工程提供邏輯的實現。api工程提供對外的接口和數據結構。library工程,則提供該模塊的一些工具類。

從另一個角度看,implementation工程實際上是和應用的狀態、生命周期相關的,它的執行依賴于各種應用狀態。而library工程則不關心這些狀態。因此也可以看做library提供某種功能,implementation則是如何運用這種功能。例如,我們實現一個表情模塊,library工程提供表情的資源、表情的渲染和播放能力,api工程提供了使用表情的服務接口,implementation工程則提供了api的實現,及何時開始加載表情資源、緩存管理、以及其他表情功能例如商店等等。

當然,這是一個指導性的建議,很多時候library工程和api工程之間沒有明顯邊界也很正常。但強烈建議至少要有implementation工程和api工程。

分析依賴關系的工具

解耦代碼時,快速分析代碼的依賴關系能很好的提升工作效率。Android Studio提供了一個不錯的工具。

圖21 - Analyze dependency工具

文件、資源以及工程,都可以進行依賴分析。有了分析結果,接下來一步一步把代碼分離就簡單多了。

***

重構整體架構不是一件容易事,通常也不太可能讓整個團隊停下來只做重構。所以一直以來微信的重構都是隨著版本迭代進行“拆分”-> “灰度” -> “回流”的循環節奏。

“設計系統的組織,其產生的設計和架構等價于組織間的溝通結構”。對于微信幾年間走過的路程,時至今日團隊內的溝通形式還可以做到較多的直接溝通。這些情況決定了微信如今的技術選擇。所以在方案選擇上我們就更愿意尋求相對簡單合適的方式解決問題——用純粹的模塊化保持后續架構的靈活性和健壯性,重新強調依賴、強調應用狀態和生命周期、強化代碼的邊界。

除了代碼上的設計,代碼之外我們也做了些努力。我們認同代碼審查的意義,也開始推行模塊負責人的審查機制。此外我們還打算強化文檔的使用,當然這個還在規劃中。

原文鏈接:https://www.qcloud.com/community/article/794491,作者:carlguo

【本文是51CTO專欄作者“騰訊云技術社區”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 騰訊云
相關推薦

2017-08-08 16:07:57

Android 模塊化架構

2017-05-18 11:43:41

Android模塊化軟件

2013-08-20 16:45:22

重構Web App模塊化

2015-07-02 13:21:44

模塊化數據中心

2016-12-14 14:50:26

CSS預處理語言模塊化實踐

2010-02-03 09:01:01

Java動態模塊化

2010-05-28 10:31:28

模塊化IT

2019-08-28 16:18:39

JavaScriptJS前端

2025-07-10 03:00:00

2021-10-11 09:51:37

模塊化UPS架構

2017-02-13 18:46:38

Android模塊化組件化

2016-11-08 20:31:19

同方服務器模塊化

2025-05-12 08:45:00

模塊化FastAPI路由分發

2022-01-10 08:43:25

CanonicalSnap應用Linux

2023-06-28 08:12:49

Python代碼重構

2021-12-24 07:10:36

架構分層模塊化

2017-06-09 12:58:20

微信小程序架構分析

2017-07-11 11:02:03

APP模塊化架構

2020-09-17 10:30:21

前端模塊化組件

2017-05-18 10:23:55

模塊化開發RequireJsJavascript
點贊
收藏

51CTO技術棧公眾號

性一交一乱一色一视频麻豆| 中文字幕国产专区| 深夜国产在线播放| 成人av第一页| 国产成人久久久精品一区| 国产无遮挡在线观看| 欧美一区一区| 色综合天天综合狠狠| 老司机av福利| 欧美偷拍视频| 国产精品99久久久久久有的能看| 九九视频这里只有精品| av网在线播放| 国产精品白浆| 91精品黄色片免费大全| 92看片淫黄大片一级| 国产激情视频在线| 国产日产欧美一区二区三区| 成人av资源网| 中国女人真人一级毛片| 亚洲欧洲视频| 成人97在线观看视频| 中国美女乱淫免费看视频| 欧洲精品99毛片免费高清观看| 色综合久久88色综合天天6| 亚洲国产一二三精品无码| 国产中文在线观看| 91亚洲午夜精品久久久久久| 91入口在线观看| 中国一级片黄色一级片黄| 99av国产精品欲麻豆| 欧美xxxx18国产| 激情无码人妻又粗又大| 美女毛片一区二区三区四区最新中文字幕亚洲 | 我和岳m愉情xxxⅹ视频| 国产精品jk白丝蜜臀av小说 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 欧美色手机在线观看| 99热在线这里只有精品| 91九色美女在线视频| 伊人婷婷欧美激情| 中文字幕色呦呦| 69成人在线| 一区二区三区av电影| 二级片在线观看| 黄色免费在线观看| 中文字幕视频一区| 亚洲伊人婷婷| 日本在线免费看| 中文字幕一区二区三区不卡 | 天天影视久久综合| 欧美国产成人在线| 日本一区免费| www.亚洲视频| 国产精品嫩草影院av蜜臀| 翔田千里亚洲一二三区| 国产www.大片在线| 欧美精彩视频一区二区三区| 日韩理论片在线观看| www.av在线播放| 国产精品视频线看| 宅男在线精品国产免费观看| 蜜芽在线免费观看| 国产精品久久久久久久浪潮网站| 亚洲三区视频| 天堂va在线| 午夜视频在线观看一区| 乱妇乱女熟妇熟女网站| 色尼玛亚洲综合影院| 欧美曰成人黄网| 亚洲免费黄色录像| 欧美成年网站| 亚洲国产天堂久久综合网| 日本japanese极品少妇| 国产成人精品免费视| 在线视频精品一| 欧美一级片在线视频| 欧美日韩爆操| 欧美亚洲免费电影| 亚洲一区二区人妻| 国产99久久久久| 免费国产在线精品一区二区三区| av在线女优影院| 一区二区三区在线免费视频 | 国内成人精品2018免费看| 亚洲影影院av| 毛片在线能看| 亚洲免费观看高清完整| 国产精品50p| 涩涩涩久久久成人精品| 日韩精品一区二区在线| 性高潮久久久久久久| 在线电影一区二区| 欧美一级高清免费播放| 97在线播放免费观看| www.欧美日韩国产在线| 亚洲ai欧洲av| free性m.freesex欧美| 欧美性极品少妇| www.美色吧.com| 日韩欧美午夜| 欧美亚洲成人免费| 精品久久久久久亚洲综合网站| 久久人人97超碰com| 三年中文高清在线观看第6集| 久久青草伊人| 欧美一二三区在线| av永久免费观看| 日韩视频二区| 亚洲最大av网站| 高清毛片在线看| 亚洲电影中文字幕在线观看| www.久久av.com| 国产一区二区三区91| 欧美极品少妇xxxxⅹ裸体艺术 | 天堂√中文最新版在线| 欧美一级久久久| 五月婷婷婷婷婷| 国产婷婷精品| 国产成人av一区二区三区| 亚洲欧美视频一区二区| 色综合一个色综合| 无码国产69精品久久久久网站 | 国产精品久久久久影院亚瑟| 欧洲黄色一级视频| 一区中文字幕| 欧美xxxx做受欧美| 99久久久无码国产精品免费| 亚洲国产精品成人综合色在线婷婷| 日韩精品xxxx| 国产精品调教| 国外成人在线直播| 国精产品乱码一区一区三区四区| 亚洲视频网在线直播| 欧美第一页浮力影院| 成人动漫免费在线观看| 欧美最顶级的aⅴ艳星| 污污网站免费在线观看| 亚洲午夜电影网| 亚洲av午夜精品一区二区三区| 午夜激情久久| 成人黄色av免费在线观看| 91caoporn在线| 欧美日韩免费高清一区色橹橹 | 天天操天天干天天干| 亚洲一区二区三区四区在线观看| www.久久com| 亚洲午夜精品一区二区国产 | 国语自产精品视频在线看抢先版图片 | 亚洲一区bb| 日韩不卡视频在线观看| 国产午夜精品免费一区二区三区 | 亚洲国产精品va在线| 久久久久亚洲AV| 成人av在线资源| 欧美极品欧美精品欧美| 免费欧美视频| 国产精品一区二区三区免费视频| 日本a级在线| 日韩亚洲欧美在线| 国产一级淫片a| 2024国产精品| 亚洲成人福利在线观看| 日韩精品久久| 亚洲www视频| 欧美亚洲天堂| 日韩经典中文字幕| 国产精品午夜一区二区| 亚洲欧洲国产日本综合| 成年人性生活视频| 国产亚洲毛片在线| 日韩在线第一区| 国产精品一区二区三区av| 欧美激情乱人伦| 男操女在线观看| 欧美精三区欧美精三区| 欧美片一区二区| 久久丝袜美腿综合| 亚洲欧美日韩三级| 亚洲大胆视频| 午夜精品福利一区二区| 免费一级欧美片在线观看网站| 555www成人网| 黄视频网站在线| 亚洲精品久久久久久久久久久久久 | 欧美 日韩 国产 一区| 精品国产乱码久久久久久郑州公司| 中文字幕在线免费观看视频| 日韩在线免费视频| 天天干在线观看| 欧美美女视频在线观看| 激情五月色婷婷| 亚洲免费在线播放| 国产全是老熟女太爽了| 国产精品一区久久久久| 欧美黄网站在线观看| 欧美另类专区| 水蜜桃亚洲精品| 成人爽a毛片| 国产日产欧美精品| 日韩激情电影免费看| 日韩视频免费观看| 黄色片在线播放| 精品国产百合女同互慰| 91亚洲精品国偷拍自产在线观看| 午夜视频在线观看一区二区 | 高清国产福利在线观看| 精品国产91乱码一区二区三区 | 久久久久久激情| 亚洲国产成人私人影院tom | 人人精品视频| 亚洲自拍高清视频网站| 91精品国产经典在线观看| 97久久精品人搡人人玩| av免费在线免费观看| 中文字幕在线视频日韩| 日韩欧美在线番号| 亚洲第一免费网站| wwwav网站| 欧美一区二区三区啪啪| 中文字幕乱码视频| 色猫猫国产区一区二在线视频| 亚洲精品在线观看av| 亚洲日本欧美天堂| av资源在线免费观看| 国产亚洲va综合人人澡精品| 少妇饥渴放荡91麻豆| 成人爽a毛片一区二区免费| a级大片免费看| 激情综合五月婷婷| 色片在线免费观看| 日韩高清在线不卡| 日韩欧美在线免费观看视频| 亚洲一区二区三区高清| 成年人午夜视频在线观看| 国产精品vip| 黄色三级中文字幕| 欧美日韩国产一区精品一区| 大桥未久一区二区三区| 亚洲区综合中文字幕日日| 亚洲欧美日韩国产yyy| 欧美日韩中文一区二区| 色噜噜狠狠一区二区三区| 国产乱码精品一区二区三区四区| 精品一区二区三区自拍图片区| 国产精品115| 久久大香伊蕉在人线观看热2| 久久97精品| 欧美日本亚洲| 欧美伦理在线视频| 亚洲日本理论电影| 久久久久久久久久久久久久| 国产奶头好大揉着好爽视频| 亚洲成av人片乱码色午夜| 成年人黄色在线观看| 欧美在线网址| 黄色一级视频在线播放| 99av国产精品欲麻豆| 国产成人精品视频ⅴa片软件竹菊| 视频一区视频二区在线观看| 浓精h攵女乱爱av| 精品一区二区三区欧美| 日本中文字幕精品| 99精品视频在线观看| 播金莲一级淫片aaaaaaa| 国产精品丝袜在线| 人妻人人澡人人添人人爽| 亚洲线精品一区二区三区 | 18加网站在线| 久久久在线观看| 亚洲风情在线资源| 国产精品麻豆va在线播放| 精品国产麻豆| 精品久久sese| 日本不卡免费一区| 黄色小视频大全| 亚洲一区欧美激情| wwwwwxxxx日本| 成人午夜又粗又硬又大| 午夜精产品一区二区在线观看的| 国产精品毛片大码女人| 久久午夜无码鲁丝片| 午夜成人免费电影| 性色av一区二区三区四区| 91精品国产综合久久小美女| 欧美性受xxxx狂喷水| 国产一区二区日韩精品欧美精品| 国产黄色在线网站| 日本不卡免费高清视频| 精品视频在线播放一区二区三区| 久久久精品动漫| 99久久夜色精品国产亚洲96 | 日韩成人av影视| 亚洲高清av一区二区三区| 久久久影视传媒| 免费看一级黄色| 欧美日韩国产中文字幕 | 日韩av综合网| 毛片在线播放a| 91av在线视频观看| 国产高清精品二区| 日韩欧美99| 日韩午夜在线电影| 国产黄色一区二区三区 | 日韩精品在线播放| 色的视频在线免费看| 欧美一区视频在线| 亚洲小说春色综合另类电影| 无码免费一区二区三区免费播放 | 亚洲男人都懂的| 欧美一区二区三区久久久| 精品国产成人系列| av网站免费在线观看| 国产精品女主播| 欧洲亚洲一区二区三区| www.一区二区.com| 久久99精品久久久久久久久久久久| 日本japanese极品少妇| 亚洲国产一区在线观看| 国产精品欧美激情在线| 亚洲区中文字幕| 热色播在线视频| 国产精品乱码| 国产精品hd| 秋霞午夜鲁丝一区二区| 亚洲色图19p| 亚洲天堂网视频| 国产亚洲精品高潮| www.成人爱| 国产一区在线免费| 亚洲一级高清| 波多野吉衣在线视频| 亚洲另类春色国产| 97精品人妻一区二区三区在线| 一本色道久久综合狠狠躁篇怎么玩| 中老年在线免费视频| 精品亚洲欧美日韩| 99热免费精品在线观看| 理论片大全免费理伦片| 亚洲成人免费在线| 日批视频免费播放| 97超碰国产精品女人人人爽| 精品国产乱子伦一区二区| 欧美性潮喷xxxxx免费视频看| 韩日欧美一区二区三区| 成年人二级毛片| 日韩欧美国产三级| 激情网站在线| 国产一区免费视频| 国产精品婷婷| 国产jk精品白丝av在线观看| 欧洲精品一区二区| 91se在线| 99三级在线| 国产日本精品| 亚洲av无码国产精品麻豆天美| 色88888久久久久久影院野外| 国产三级视频在线看| 国产精品免费在线免费| 99热在线成人| 中文字幕一二三| 黑人精品xxx一区| 国产高清视频免费最新在线| 国产在线视频一区| 欧美性久久久| 无码一区二区三区在线| 欧美日韩一本到| 中文字幕有码在线观看| 国产免费一区二区三区| 米奇777在线欧美播放| 亚洲女同二女同志奶水| 日韩无一区二区| 日本乱码一区二区三区不卡| 亚洲精品一区二区三区樱花| 国产一区在线观看麻豆| 日韩欧美亚洲国产| 一二美女精品欧洲| 亚洲2区在线| av网址在线观看免费| 中文字幕一区二区三| 粉嫩av一区二区夜夜嗨| 国产精品久久久91| 黄色亚洲大片免费在线观看| 男人天堂av电影| 日韩一二三四区| 日本综合久久| 超碰超碰超碰超碰超碰| 久久综合色一综合色88| 91亚洲欧美激情| 欧洲日韩成人av| 一区二区中文字| xxx在线播放| 欧美成va人片在线观看| 成人在线黄色| 免费看毛片的网址| 国产精品成人网| 欧美亚洲日本| 国产精品日韩一区二区免费视频| 奇米777欧美一区二区| 特一级黄色大片|