精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩免费影院| 日韩国产成人在线| 国产精品chinese在线观看| 夜夜爽夜夜爽精品视频| 国产综合动作在线观看| 无码人妻精品一区二区三区9厂 | 搜索黄色一级片| 国产精品丝袜在线播放| 日本久久一区二区三区| 综合久久国产| 视频在线不卡| 国内精品久久久久影院薰衣草| 久久全球大尺度高清视频| 日韩乱码人妻无码中文字幕久久| 国外成人福利视频| 午夜私人影院久久久久| 亚洲欧美影院| 亚洲AV成人无码一二三区在线| 黄色羞羞视频在线观看| 欧美www视频在线观看| 日韩欧美在线一区二区三区| 欧美黄色一级片视频| 污视频免费在线观看| 国产女人18毛片水真多成人如厕| 国产chinese精品一区二区| 涩涩视频在线观看| 99pao成人国产永久免费视频| 自拍偷拍免费精品| 波多野结衣片子| 国产精品欧美大片| 精品日韩99亚洲| 网站在线你懂的| 激情中国色综合| 一本大道av一区二区在线播放| 污污污污污污www网站免费| av电影在线网| 国产欧美一区在线| 欧美1o一11sex性hdhd| 成人久久久精品国产乱码一区二区| 免费成人性网站| 日韩av片永久免费网站| 精品91久久久| 亚洲人体偷拍| 高清欧美性猛交xxxx黑人猛交| 国产精品成人免费观看| 日本不卡二三区| 亚洲性线免费观看视频成熟| 亚洲欧美色图视频| 日韩欧美中文字幕电影| 亚洲成人精品视频| 年下总裁被打光屁股sp| 在线日韩成人| 精品国产一区二区三区久久影院| 三级黄色片免费观看| **国产精品| 宅男噜噜噜66一区二区66| gai在线观看免费高清| 另类一区二区三区| 91精品国产欧美日韩| 黄色片免费网址| 亚洲欧美日本国产| 精品区一区二区| 亚洲视频在线观看网站| 亚洲小视频网站| 日韩黄色碟片| 欧美一区二区视频在线观看| 在线观看日本www| 日本在线一区二区三区| 欧美成人精品福利| 国产极品一区二区| 美女久久99| 亚洲人成人99网站| 日韩一区二区三区四区视频| 欧美第十八页| 九九热r在线视频精品| 久久久久久免费观看| 亚洲美洲欧洲综合国产一区| 456亚洲影院| 日本丰满少妇做爰爽爽| 久久精品国产精品亚洲精品| 91久久国产自产拍夜夜嗨| 蜜臀av午夜精品| 久久久av毛片精品| 伊人色综合影院| 丰满诱人av在线播放| 狠狠综合久久av一区二区小说 | 久久精品三级| 国产日韩在线看| 理论片中文字幕| 久久久久久亚洲综合| 超碰免费在线公开| av资源中文在线| 在线精品视频一区二区| 午夜影院免费观看视频| 亚洲国产精品嫩草影院久久av| 在线成人激情黄色| 国产一级一片免费播放| 日韩精品视频网站| 99精品99久久久久久宅男| 欧美zzoo| 一区二区三区蜜桃| 狠狠热免费视频| 99这里只有精品视频| 国产亚洲欧美日韩精品| 国产主播在线观看| 蜜桃一区二区三区在线观看| 国产精品久久久久久久久久久久午夜片 | 国产在线自天天| 亚洲欧美日韩综合aⅴ视频| 欧美精品99久久| 国产精品视频一区二区三区综合| 日韩久久精品成人| 青青草偷拍视频| 日韩电影在线一区| 国产欧美日韩一区| h网站久久久| 欧美亚洲国产一区二区三区va | 一卡二卡三卡在线| 久久久久国产精品免费免费搜索| avav在线播放| 二区三区精品| 国产亚洲欧美日韩一区二区| 日本三级片在线观看| 精品一区二区三区不卡| 日本一区免费在线观看| 国产三级电影在线播放| 91精品国产综合久久久久| 在线观看国产精品一区| 亚洲久久一区二区| 成人h在线播放| 国内外激情在线| 欧美日韩高清一区二区三区| 这里只有久久精品| 亚洲在线视频| 久久久久se| 国内老司机av在线| 欧美大片在线观看一区二区| 欧美特黄一级片| 七七婷婷婷婷精品国产| 日本不卡一区二区三区在线观看| 成入视频在线观看| 亚洲成人久久一区| 日韩精品视频播放| 成年人国产精品| www.国产在线视频| 成人搞黄视频| 高清欧美性猛交xxxx| 好吊色视频一区二区| 亚洲一区二区免费视频| 亚洲一二三四五| 日韩资源在线| 日韩高清欧美激情| 日韩精品电影网站| 亚洲国产尤物| 中文字幕日韩av电影| 中文字幕欧美在线观看| 亚洲国产精品黑人久久久| 亚洲精品怡红院| 爽成人777777婷婷| 亚洲影院高清在线| 欧美午夜大胆人体| 亚洲国产成人精品久久久国产成人一区 | 国产真实乱子伦| 欧美亚洲国产一区| 国产一区二区丝袜| 亚洲电影视频在线| 亚洲精品国产精品国自产观看浪潮| wwwxxx亚洲| 久久久www成人免费无遮挡大片| 国产av人人夜夜澡人人爽| 欧洲杯半决赛直播| 91精品视频在线播放| 里番在线播放| 亚洲精品中文字幕有码专区| 波多野结衣爱爱| 亚洲视频一区在线| 波多野结衣一二三区| 久久久久久婷| 国产av不卡一区二区| 超碰地址久久| 国产精品日韩欧美| 亚洲图区一区| 亚洲美女性视频| 中文字幕视频免费观看| 亚洲激情网站免费观看| 亚洲国产果冻传媒av在线观看| 久久精品盗摄| 大桥未久一区二区三区| 黄色美女久久久| 国产精品久久久久久久一区探花| 超碰在线caoporen| 亚洲欧美第一页| 国产色综合视频| 福利微拍一区二区| 日本精品在线免费观看| 99久久久免费精品国产一区二区| 91在线视频观看免费| 亚洲二区视频| 自拍偷拍99| 国产精品片aa在线观看| 国产精品久久国产三级国电话系列 | 丰满熟妇乱又伦| 91福利在线导航| 久久精品无码人妻| 国产精品欧美精品| 波多野结衣福利| 国产一区二区成人久久免费影院| 免费av网址在线| 狠狠色丁香久久综合频道| 亚洲高清不卡一区| 欧美1区二区| 91福利入口| 六九午夜精品视频| 国产不卡av在线免费观看| 天使と恶魔の榨精在线播放| 色青青草原桃花久久综合| 午夜性色福利影院| 日韩女优电影在线观看| 亚洲天堂一二三| 色偷偷久久一区二区三区| 国产精选第一页| 亚洲欧美日韩人成在线播放| 国产性猛交xx乱| 91视频观看视频| 白嫩情侣偷拍呻吟刺激| 国产麻豆9l精品三级站| 孩娇小videos精品| 日日夜夜免费精品视频| 国产又黄又大又粗视频| 亚洲黄色毛片| 精品国产一区二区三区无码| 91成人观看| 亚洲色图自拍| 欧美综合另类| 蜜桃av久久久亚洲精品| 加勒比中文字幕精品| 国产经品一区二区| 亚洲精品午夜| 99在线免费观看视频| 一区二区三区四区精品视频| 成人性生交大片免费看视频直播| 成人在线中文| 91精品国产综合久久久久久久久| www.久久.com| 国产精品久久久久7777婷婷| 成人做爰视频www网站小优视频| 欧美亚洲免费电影| 国产社区精品视频| 欧美专区在线视频| 欧美成人精品一区二区男人小说| 欧美性视频网站| 亚洲深夜视频| 日韩免费高清在线观看| 电影亚洲一区| 国产精品免费久久久久久| 欧美日韩尤物久久| 国产日本欧美一区二区三区在线 | 国产精品一区二区三区免费| 中文字幕一区图| 极品日韩久久| 亚洲精品白浆高清| 日韩av一级大片| 欧美国产美女| 先锋影音男人资源| 精久久久久久| 99999精品视频| 日产欧产美韩系列久久99| 视频在线观看免费高清| 精品一区二区三区免费毛片爱| 日本黄色www| 成人午夜免费视频| 少妇按摩一区二区三区| 中文字幕乱码日本亚洲一区二区 | 欧美日韩国产精品一区| 无码人妻av一区二区三区波多野| 欧美视频在线观看一区二区| 91亚洲国产成人精品一区| 欧美一级黄色片| 天堂在线中文| 日韩最新av在线| 青草在线视频在线观看| 热久久这里只有| 久久影视精品| 精品国产福利| 成人在线一区| 800av在线免费观看| 天堂成人免费av电影一区| 免费成人黄色大片| 暴力调教一区二区三区| 亚洲一二三精品| 亚洲国产精品久久人人爱| 波多野结衣不卡| 日韩欧美国产一区二区在线播放| 五月天激情婷婷| www.色综合| 国产美女高潮在线| 91在线观看免费高清完整版在线观看| 美女呻吟一区| 麻豆md0077饥渴少妇| 蜜桃av一区| 麻豆tv在线观看| 国产精品入口麻豆九色| 激情五月色婷婷| 欧美福利一区二区| 九色在线观看| 久久久久国产一区二区三区| 丁香婷婷久久| 久久一区二区三区欧美亚洲| 亚洲综合小说| 黄色三级视频片| 99精品热视频| 国产成人自拍网站| 欧美羞羞免费网站| 午夜小视频免费| 欧美极品美女电影一区| 欧美美女被草| 日韩av电影免费观看| 亚洲资源av| 一级黄色电影片| 国产精品国产三级国产a| 在线观看 亚洲| 亚洲第一福利网| 欧美极品少妇videossex| 国产一区深夜福利| 精品久久久亚洲| 国产精品欧美激情在线观看| 国产69精品久久777的优势| 美国一级片在线观看| 欧美专区在线观看一区| 三级黄视频在线观看| 97国产精品人人爽人人做| 中文字幕一区二区三区四区久久| 在线视频一区观看| 麻豆精品视频在线观看免费| 色一情一交一乱一区二区三区| 午夜精品福利一区二区三区蜜桃| 亚洲精品久久久蜜桃动漫 | 麻豆成全视频免费观看在线看| 99免费在线观看视频| 欧美喷水视频| 天天色天天干天天色| 亚洲欧美二区三区| 国产免费黄色大片| 免费91麻豆精品国产自产在线观看| 欧美日韩视频免费看| 亚洲国产精品视频一区| 日本在线观看不卡视频| 欧美另类z0zx974| 欧洲亚洲国产日韩| 1769视频在线播放免费观看| 国产女精品视频网站免费| 999久久久精品国产| 亚洲午夜激情影院| 亚洲欧美视频在线观看视频| 国产情侣一区二区| 欧美大片欧美激情性色a∨久久| 亚洲精品一区二区三区在线| 久久99久久久久久| 91色porny在线视频| 无码人妻黑人中文字幕| 中国人与牲禽动交精品| 亚洲日本中文| 国产精品视频网站在线观看| 成人做爰69片免费看网站| 久久久久黄色片| 亚洲精品国产品国语在线| 国产精品专区免费| 亚洲一区二区三区精品动漫| 国产一区日韩二区欧美三区| 久久这里只有精品免费| 精品偷拍一区二区三区在线看| 婷婷午夜社区一区| 波多野结衣三级在线| 粉嫩嫩av羞羞动漫久久久| 欧美一级特黄视频| 综合国产在线视频| 伊人精品综合| 欧美日韩亚洲一二三| 国产精品久久久久久久久久免费看 | 欧美精品99久久久**| 日本片在线观看| 欧美一区二区综合| 激情另类小说区图片区视频区| 国产大片中文字幕| 国产一区二区激情| 日韩欧美中文在线观看| 日韩激情免费视频| 亚洲少妇中出一区| 午夜小视频免费| 亚洲bt欧美bt日本bt| 亚洲裸体俱乐部裸体舞表演av| 精品成人无码一区二区三区| 91精品国产综合久久久久久漫画 | 欧美日韩国产专区| 91在线视频| 国产日韩欧美亚洲一区| 美女视频网站黄色亚洲| 亚洲精品77777| www.亚洲天堂| 亚洲日产av中文字幕|