亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 微信Android客戶端架構演進之路

微信Android客戶端架構演進之路

熱門標簽:大連怎么辦理400電話 萊蕪電銷機器人方案 百度圖書館地圖標注 焦作防封號電銷機器人 冰島地圖標注app 地圖標注商家位置怎么弄 阿里西藏地圖標注申請入口 樂迪電話機器人 深圳靈聲電話機器人

拓荒微信1.0 for Android的測試版本于2011年1月發布。這是微信Android客戶端的第一個版本,軟件架構采用早期標準的Android系統應用設計。

【圖1】

第一個版本是兩個人用了一個多月的時間開發出來的,其中一個還是剛剛畢業沒多久的實習生。這個時期團隊一窮二白,資源有限、經驗不夠,主導思想是,復雜的事情盡量交出去做,保持最精簡的客戶端代碼。得益于Android應用開發簡單快速,從結構上看,這個時候其實還沒有到需要特別設計的階段,是最原始、簡單的Android應用。

當然,再簡單的軟件也要考慮基本的設計思路。分層設計思想從這最早的版本開始引入一直到今天。回顧當時的設計,更像是MVP結合事件通知機制。從最上面由Activity組件組成的UI層(VIEW),往下到由NetScene組成的表現層(Presenter),再往下Network負責網絡長短連接與數據庫的通信與Storage組成的存儲層。NetScene是一個網絡或者本地任務的基本單元,包括操作網絡做數據收發、協議編解碼,操作數據庫做各種聯系人、消息模塊的讀寫。典型的例子如發送一條消息NetSceneSendMsg、做一次收信同步操作NetSceneSync。1.0版本的微信整個UI的activity可能不超過五個。

這個階段,不需要做什么“減法”,我們的安裝包也只有354k。

成長微信的快速增長,從2.0版本開始第一次爆發。從語音版,到附近的人、漂流瓶,再到搖一搖。這個階段的我們,似乎將全部的時間和精力都放在新功能拓展上。新的Activity、新的NetScene加上新的Storage,在看似成熟的框架里,一個功能就這樣完成了。簡單、快速、暴力。隨之而來的,是一些之前完全沒有想到會可能出現的問題,讓最開始接觸Android開發的我們措手不及。

早期版本因為經驗的問題,產品上很多功能不去想也不敢去想,版本開發的時間跨度也比較長。隨著開發經驗的積累和對產品方向的理解,3.0之后的每一個小版本都處在一到兩周的高速迭代過程中。

追求更好的用戶體驗,更多豐富的功能是產品經理們永遠不會放棄的事情,尤其是在新功能為微信的新增用戶帶來了一次次爆發式的增長之后,更是無法控制。功能的試錯頻率大大加速,機型覆蓋量上升后的兼容性問題也逐漸暴露。代碼量、內存占用、安裝包體積迅速膨脹。而同樣處于發展中的Android系統,也給我們埋下了很多坑,需要開發自己來實現、修復和優化。放在今天webview組件不再是什么問題,但在2.3之前的系統里面都會存在嚴重的內存泄露。內存問題為微信客戶端架構的第一次進化埋下了伏筆。

變革在微信1.0時代的時候,我們的關注點更偏向功能,隨著用戶增長,性能和穩定性問題逐漸浮上水面。2.0版本后,用戶反饋中微信消息推送不及時的比例在上升,作為一款目標替代短信的即時通訊應用,無法及時收取別人發來的消息,這一點是非常致命的。

Android 1.5、1.6、2.1在當時是主要的版本,那個時候是沒有今天的GCM的,甚至連C2DM也是2.2系統之后才會有的。而谷歌服務在國內被屏蔽,在相當長一段時間內,無論是C2DM還是GCM都無法正常進行推送。沒有像APNS一樣穩定的推送通道可供Android平臺的應用使用,怎么辦?自己實現。

國內網絡的特殊性,使得我們再實現微信推送機制時,需要維持準確的心跳周期。如果一段時間沒有活動,運營商便會將長連接斷開以回收資源,這時服務器發消息給客戶端就接收不到了。進一步研究發現,運營商網絡的時間限制各個地區不同,有的地區有兩分鐘,有的地區有半個小時,這種情況是不可接受的。我們的解決方案是縮短心跳間隔,在網絡運營商把客戶端到接入點之間的連接斷開之前,我再發送一次心跳,主動維持住這個長連接的活性。這個我們稱之為長連接的保活。關于長連接的保活策略,微信也做過多次優化,這里另文介紹,不再贅述。

還記得前面說微信的膨脹嗎?代碼、內存、apk大小都在膨脹,這其中,內存對消息收發的影響很關鍵。Android運行時的擇優置換機制,會選取占用資源最多的程序結束掉,除了微信自己功能膨脹導致內存占用加大之外,前面說的不省心的webview,還會給我們在內存問題上挖坑。而結果就是在用戶手機運行APP比較多的時候,微信會被系統殺掉回收資源,消息收取不及時的問題就出來了。

如何解決?方法其實不少,微信選擇的,是輕重分離的思路。通過在微信3.5版本時候做的架構重構,實現了不受功能增長、系統缺陷影響的穩定推送方案。

【圖2】

對比v1.x版本的微信客戶端架構圖,我們將右下角Network的部分用輕重進程分離的思想,獨立到一個單獨的進程(:push)中,而上面兩個層級依然跑在微信的主進程(:worker)中。而對于有內存泄露問題的webview或者其他不頻繁使用的功能,再把其分離到獨立的工具進程(:tools)中。通過分離進程,微信第一次重構解決了系統因為微信資源消耗,主動干掉微信服務的困境。分離后的push進程內存占用以及被系統kill回收的幾率大幅降低,而對于worker和tools進程,我們不再要求其一定存在,只在用戶收到消息,或者進入h5相關功能界面時存在即可。這個版本的架構變更基本達成了我們設定的目標,無論是電量還是平均待機內存消耗上都大幅度下降,從內存上來看下降了70%,電量的話也比競品和我們前一個版本有好轉。

當然任何事物都有兩面性。這一次架構的改變存在的問題逐漸在我們后面的開發當中暴露出來。比如進程每一次都要重新加載,里面所有的Cache、圖片、界面全部要重新去執行一遍同樣的代碼,每一次加載內存都需要重新消耗時間。而啟動速度變慢,則是最明顯,用戶最能感知的問題。“地球出現頻率高了”是我們在這一時期經常聽到的聲音。而系統資源的消耗實際上比原來單進程的時候會更多,每一個進程都需要額外多占用一份虛擬機部分的內存。

這些缺點在3.5版本時代是可以接受的。從監測結果上看,啟動速度變慢將微信的啟動速度延長到了秒級,從原來的300-500毫秒到現在800-1000毫秒的級別。主要的圖片緩存失效,則通過異步加載、解碼、展示解決。拉長來看,微信的主進程資源會被自動回收,平均內存占用相比之前還是下降的。即便在今天來回顧,依然可以看到,輕重進程拆分的思路是正確的選擇。即便系統層面各種各樣的bug逐漸減少,但應用的迭代使得功能一定不會減少。為了保證圖片、資源類在速度上的體驗,內存的消耗也只會更大,是空間換時間的思路。而輕重分離,保證了核心服務在設備資源發生競爭時最大概率存活的同時,不造成對設備過多的資源占用。典型的場景就是用戶開啟游戲、視頻錄制通話等大型應用,作為常駐應用,不應該搶占額外的有限資源,需要做到“該放手的時候就放手”。

進化很快,微信的架構演進進入了第三個階段(v3.x)。微信4.5版本的開發過程中,出現了無法安裝在一部分Android 2.3以下系統的機器上,當時2.3的市占率還在50%以上。試想一下,市場上一半用戶的手機不能安裝使用微信,這對我們是一個致命打擊。放在今天看,2.3早已被淘汰,但在當時,我們不可能停下來等待,無論從開發和產品來說都是不可接受的。技術分析的直接原因就是,微信的發展速度太快,觸發到Android虛擬機機制的設計缺陷。

兩個問題,一是單dex 65535方法數限制,二是線性內存分配器(LinearAlloc)限制。今天的Android開發者看到這兩個限制都不會陌生。前者是因為Android的早期設計中,對dex文件中方法id用16位整型標記,單個dex文件中的方法數無法超過65535,eclipse環境中生成不了未做過proguard的debug apk。后者則是dalvik虛擬機用來加載類的堆內存大小被硬編碼了,2.3以下是5M,2.3以上是8M,微信無法安裝的原因就是因為這個堆內存被耗盡導致dexopt失敗。

今天來看,Google已經給出了一些可靠的解決方案,輔以更加先進的gradle + Android Studio,開發者們可能根本不會再遇到這兩個經典問題,。官方的MultiDex分dex機制解決了方法數限制的問題,其中main dex最小化原則,結合dalvik LinearAlloc heap size調整(修改到了16M),使得dexopt的失敗幾率大幅下降。而art的出現徹底不再存在LinearAlloc這樣的限制。回過來再看,那個時代里微信是如何通過軟件架構調整解決這些問題的。

微信在高速發展過程當中,到5.0的時候已經有很多功能,而其中一些功能,隨著用戶群體、產品設計等因素變化,用戶使用的頻率在改變。之前試錯的一些功能,也大量存留在微信版本中。這些不常使用的功能不應該始終占用程序資源,從架構上進行縱向分離,保證主要場景的體驗,是這一時期的主要設計思路。

【圖3】

要做的第一步就是解耦。微信這類社交型應用,在用戶數據、關系、消息等結構上存在著各種各樣復雜的依賴,這些依賴相比工具型的軟件來說,調用頻率更高,性能要求也更高。想做到完美的拆分不是一件容易的事,但是不完美的拆分卻是可以達成的。輕重分離的思想再一次被應用,這一次是在代碼模塊的使用和組織上。保證主app功能的快速和穩定,將附屬的新功能分離在獨立的插件工程(p_XX)中,每個插件有獨立的UI界面邏輯和資源、存儲及網絡協議編解碼處理邏輯,通過共用統一的基礎庫接口訪問網絡服務。

將微信功能解耦為插件,一個插件內僅向下依賴。插件最后編譯出來會是一個jar包,其內包括的實際內容是對應的dex。這里需要注意的是,插件并不需要有獨立的進程空間,而是根據該插件實際的場景決定其運行的實際進程,絕大多數情況下,插件是和主app功能共享多進程載體的。

v3.x架構的改造工作量對當時的我們來說很大,從最開始4.3版本發現dex limit和LinearAlloc limit到5.0版本成型做第一次的驗證,我們花了8個月時間,解耦出來的工程項目有60個以上。4.5版本將附近的人分離出去是作為一次試驗,為5.0這一大版本填完了坑。5.0版本是微信歷史上非常重要的一環,從這個版本開始引入了游戲、支付和更加完善的公眾賬號體系。

這種設計思路不是微信首創,現在回顧也并不復雜。如果你的產品歷史功能不多,迭代不是很快,可以全部人停下來1到2個月集中一次重構搞定。但對于微信來說,但這一版的架構變更,更像是在給天上飛著的飛機換發動機,由一支10來個人組成的團隊完成。互聯網的快速、敏捷給處在“創業”階段的我們新的挑戰。如何做到呢?要保證不給處于高度需求壓力下的開發人員增加架構變動的額外負擔,首先要做的就是不要讓他們重復修改代碼,無縫遷移到新的架構。

一、創建必要的工具和規范。微信在4.3發現問題之前,一直堅持著非常好的開發效率優化思想,代碼自動生成起到了很大的幫助。團隊內部使用的自研的代碼生成工具autogen,通過簡單的xml定義,即可生成所需要的存儲、協議編解碼、事件機制代碼。這使得我們具備了比較輕松解耦的前提。
二、新的架構要求開發者在做新功能時,使用獨立插件子工程,好的工程模板可以事半功倍。早期傳承下來的分層設計,也使得開發人員在前后兩種開發模式下的學習成本降到最低。對應的編譯和開發調試工具。
三、對于歷史實現的功能特性,盡量通過反射等一些技巧,來保證不需要大規模重寫代碼,“先抗住,再優化”。不要一開始就追求完美,先活下來。直到5.1、5.2版本,我們才基本上全部完成這一次程序架構調整。
四、人。架構調整是必須要做的事,但是作為發起者,也不能只從理論角度去強硬推動。減少開發者的工作量,而不是增加,站在開發者的角度想問題,往往會得到非常積極的響應。

不同的客戶端架構時期,背后的團隊和開發模式也會有所不同。對比三個版本的客戶端架構,v1.x和v2.x的時候比較適合小型團隊、沒有特別復雜或者反復需求的客戶端進行快速開發。單trunk主線開發即可滿足。每次發布后,拉出來一個對應的release branch,如果發現有bug或者小優化需要修改,直接在這個release branch上修改、測試、發布上線。這一時期release branch通常保持在兩個以內,當前版本和前一版本。當前版本是為了線上問題的快速發布,而前版本則是為了修復一些廠商渠道預裝的問題。

【圖4】

v3.x就比較適合中到大型團隊,解耦之后,可以支持多個團隊的并行開發,也可以滿足多個版本的同時開發和發布。微信的產品經理和客戶端開發人員的比例大概是1.5+,也就是說產品經理會比開發人員多50%以上。開發人員會面對產品各式各樣的需求需要實現,很多需求處于原型或者是設計階段,而有些即便開發完成,也需要和老大體驗修改。這種不穩定狀態的需求,往往是今天說最終確定,但2個小時后就可能要修改,甚至臨上線前都可能說這個功能被砍掉,不要發布了。不穩定的需求會帶來不穩定的代碼實現,質量也沒法控制。通過多迭代多版本多分支并行開發,只有所有人體驗過最終確認沒問題可以上線,才會合入發布版本上線。

這個過程像什么?像開源項目的開發。

開放進入到2015年后,微信在軟件架構上逐漸趨于平穩。在v3.x原有插件加載基礎上,研究了更多行業內Android應用的技術架構。結合官方MultiDex的實現,增加動態熱補丁功能,通過終端的運營系統,實現了微信客戶端補丁版本更新48小時90%+覆蓋率。編譯系統也從buck+修改為微信自研的builder構建,支持LinearAlloc和methods/fields count的實時計算,以及融合了MultiDex與微信插件模式的dex自動分包。在v2.x架構輕重分離的多進程思路基礎上,進一步優化實現了push的在收信條件下的“lightpush”運行模式。在僅消耗push進程低內存的條件下,實時收取新消息通知,避免對進行中的游戲進行資源搶占的同時,又可以及時收取消息。

【圖5】

更重要的是,我們開始將目光轉移到開源的開發模式上。v3.x的并行開發模式,在svn下已不再適應。2015年上半年開始微信Android客戶端團隊開始轉向git,充分發揮git在多團隊并行開發下的優勢。內部也放棄了沿用許久的ant + eclipse,全面轉向gradle + Android Studio的分布式構建思想。通過內部開源,微信內的公共組件已經可以通過maven在不同的開發團隊中共享并隨時使用。

標簽:聊城 廈門 綿陽 安順 河南 西寧 蘭州 烏蘭察布

巨人網絡通訊聲明:本文標題《微信Android客戶端架構演進之路》,本文關鍵詞  微信,Android,客戶端,架構,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《微信Android客戶端架構演進之路》相關的同類信息!
  • 本頁收集關于微信Android客戶端架構演進之路的相關信息資訊供網民參考!
  • 推薦文章
    日本伦理片网站| 国产一区二区精品在线观看| 四虎影视库| 国产高清视频免费| 国产激情视频在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品在线观看国产| 精品久久久久久中文字幕一区| 美女被草网站| 久久久久久久免费视频| 精品毛片视频| 欧美大片a一级毛片视频| 九九久久99| 天天做人人爱夜夜爽2020毛片| 韩国毛片基地| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 91麻豆精品国产片在线观看| 精品在线视频播放| 成人高清免费| 久久精品欧美一区二区| 亚久久伊人精品青青草原2020| 日本伦理片网站| 国产美女在线观看| 黄色福利片| 精品久久久久久中文字幕一区 | 国产福利免费观看| 欧美a级片视频| 中文字幕一区二区三区精彩视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 美女免费精品高清毛片在线视| 91麻豆国产福利精品| 色综合久久手机在线| 日本免费区| 欧美一级视频免费| 国产成人精品综合久久久| 韩国三级香港三级日本三级| 四虎影视库国产精品一区| 四虎影视精品永久免费网站| 成人免费观看的视频黄页| 国产精品自拍在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 四虎久久精品国产| 精品国产三级a∨在线观看| 国产综合91天堂亚洲国产| 亚欧成人毛片一区二区三区四区| 国产麻豆精品免费密入口| 毛片电影网| 亚洲www美色| 韩国三级香港三级日本三级| 一本伊大人香蕉高清在线观看| 亚洲精品中文一区不卡| 亚欧成人毛片一区二区三区四区| 日韩专区在线播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 一级毛片视频在线观看| 欧美激情中文字幕一区二区| 日韩在线观看视频网站| 国产不卡福利| 毛片电影网| 国产亚洲精品成人a在线| 精品国产香蕉在线播出| 久久国产精品自线拍免费| 日本免费区| 999精品在线| 黄视频网站免费看| 国产不卡在线播放| 麻豆网站在线看| 国产亚洲精品aaa大片| 二级片在线观看| 欧美爱色| 日韩男人天堂| 成人高清视频免费观看| 欧美一级视| 可以在线看黄的网站| 韩国三级视频在线观看| 中文字幕一区二区三区精彩视频 | 黄视频网站在线看| 99久久精品国产片| 亚洲 男人 天堂| 午夜在线影院| 国产精品12| 成人免费一级毛片在线播放视频| 黄色免费网站在线| 国产一区二区福利久久| a级黄色毛片免费播放视频| 青青久久精品| 日本在线www| 国产不卡高清在线观看视频| 黄视频网站在线免费观看| 一级女性全黄生活片免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品国产三级a∨在线观看| 精品视频一区二区三区| 成人免费一级纶理片| 国产a视频| 欧美另类videosbestsex| 欧美激情影院| 韩国毛片免费大片| 久久国产一久久高清| 免费的黄视频| 香蕉视频一级| 欧美大片aaaa一级毛片| 亚洲天堂免费| 黄色免费三级| 九九久久国产精品大片| 成人高清视频免费观看| 夜夜操天天爽| 国产不卡在线看| 久久精品大片| 成人高清视频免费观看| 九九久久99| 亚飞与亚基在线观看| 韩国妈妈的朋友在线播放| 成人影院久久久久久影院| 午夜在线亚洲| 一本高清在线| 亚洲爆爽| 一级女性大黄生活片免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产国产人免费视频成69堂| 精品视频在线观看一区二区| 日韩专区一区| 你懂的日韩| 中文字幕一区二区三区 精品| 欧美激情一区二区三区在线 | 免费一级片网站| 亚洲精品影院久久久久久| 日本在线不卡视频| 你懂的在线观看视频| 四虎精品在线观看| 国产不卡在线观看视频| 91麻豆精品国产片在线观看| 一级女人毛片人一女人| 高清一级片| 国产一区精品| 日本在线www| 日韩免费片| 国产原创视频在线| 国产视频一区在线| 久久国产精品只做精品| 午夜精品国产自在现线拍| 九九九在线视频| 日日日夜夜操| 一本伊大人香蕉高清在线观看| 黄视频网站免费| 久草免费资源| 97视频免费在线| 国产精品自拍在线观看| 日韩中文字幕在线观看视频| 国产国语在线播放视频| 精品国产亚洲人成在线| 中文字幕Aⅴ资源网| 久久国产精品只做精品| 国产美女在线一区二区三区| a级毛片免费观看网站| 国产不卡在线观看视频| 美女免费精品视频在线观看| 99色精品| 四虎影视久久久| 国产麻豆精品| 亚洲女人国产香蕉久久精品 | 91麻豆高清国产在线播放| 日本特黄特色aa大片免费| 日本在线不卡免费视频一区| 可以免费在线看黄的网站| 国产视频久久久久| 午夜激情视频在线观看| 二级片在线观看| 欧美a免费| 91麻豆高清国产在线播放| 日韩免费在线视频| 可以免费看毛片的网站| 欧美a级大片| 日本乱中文字幕系列| 国产麻豆精品高清在线播放| a级毛片免费观看网站| 一级毛片视频在线观看| 欧美日本二区| 日韩中文字幕在线播放| 亚洲天堂在线播放| 国产麻豆精品高清在线播放| 亚久久伊人精品青青草原2020| 国产成人精品在线| 午夜家庭影院| 日韩中文字幕在线播放| 日韩专区在线播放| 国产一区精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡在线看| 精品视频在线观看视频免费视频| 久久99这里只有精品国产| 999久久狠狠免费精品| 国产精品免费精品自在线观看| 欧美激情一区二区三区视频| 精品视频一区二区三区| 91麻豆精品国产高清在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 成人a大片高清在线观看| 国产极品白嫩美女在线观看看| 99热精品一区|