Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 506, comments - 13, trackbacks - 0, articles - 1

          本文由騰訊技術(shù)何金源分享,原題“不畏移山,手機QQ技術(shù)架構(gòu)升級變遷史”,本文進行了排版和內(nèi)容優(yōu)化等。

          1、引言

          接上篇《總是被低估,從未被超越,揭秘QQ極致絲滑背后的硬核IM技術(shù)優(yōu)化》,本文則將重點介紹手機 QQ 客戶端技術(shù)架構(gòu)升級背后的故事。

          手機 QQ 經(jīng)過20多年發(fā)展,功能不斷增加,代碼不斷累積,架構(gòu)已經(jīng)變得越來越臃腫,影響到協(xié)作團隊開發(fā)效率,對用戶體驗、質(zhì)量穩(wěn)定都有較大風(fēng)險,因此手機 QQ 亟需技術(shù)架構(gòu)的升級。但是對如此龐大的項目進行架構(gòu)升級,在行業(yè)內(nèi)也是少有的,手機 QQ 架構(gòu)升級面臨的困難和挑戰(zhàn)都十分巨大,本文將圍繞最新手機 QQ 客戶端項目背景、項目歷程、項目挑戰(zhàn)、項目成果等方面進行深入介紹。

           
           

          2、手機QQ的歷史包袱

          在過去20多年里,手機 QQ 從原來純粹的即時通訊IM工具,成長為承載了空間、頻道、短視頻、超秀、增值服務(wù)等眾多業(yè)務(wù)的平臺。

          隨著業(yè)務(wù)越來越復(fù)雜,最初設(shè)計的技術(shù)架構(gòu)變得越來越不適配,業(yè)務(wù)相互之間耦合越來越嚴(yán)重,時常會遇到改一個問題,牽扯出 N 個問題,問題改不動,代碼債越積越多的情況,歷史的包袱如同一座大山橫在每一位手機 QQ 項目成員面前。

          2020年,我們開始著手做架構(gòu)升級。

          鑒于手機 QQ 的業(yè)務(wù)復(fù)雜度、代碼量級都非常大,評估下來架構(gòu)升級的工作量大得驚人,于是我們采用分階段、逐步演進的策略去進行架構(gòu)升級。

          整體回顧,手機 QQ 的架構(gòu)升級時間線是這樣的:

          3、“解耦重構(gòu)”架構(gòu)設(shè)計

          雖然歷史包袱如同一座大山,但是手機 QQ 項目成員也有移山的意志和決心。

          在2020年,手機 QQ 啟動了名為“工業(yè)化實踐”的技術(shù)架構(gòu)升級項目,這標(biāo)志著手機 QQ 工程首次系統(tǒng)性地進行業(yè)務(wù)邊界劃分、解耦和重構(gòu)升級。

          從上圖可看出,舊架構(gòu)雖然有模塊化和插件化,但存在以下不足:

          • 1)邊界不清晰:主工程承載基礎(chǔ)和大部分業(yè)務(wù)代碼,導(dǎo)致基礎(chǔ)和業(yè)務(wù)代碼邊界不清晰;
          • 2)代碼耦合緊:基礎(chǔ)核心類持續(xù)膨脹、業(yè)務(wù)之間代碼依賴不合理;
          • 3)開發(fā)效率低:代碼修改擴散造成 CR、解沖突、定位問題成本高,同時拖慢編譯速度。

          針對以上不足,對手機 QQ 工程重新設(shè)計了架構(gòu):

          1)新架構(gòu)按業(yè)務(wù)劃分模塊,業(yè)務(wù)模塊之間是相互解耦的,業(yè)務(wù)模塊之間通過接口和路由進行通信;

          2)同時按層級設(shè)計劃分,層級自上而下依賴,上層模塊可依賴下層模塊,但下層模塊不能逆向依賴上層模塊。

          手 Q 客戶端新架構(gòu):

          新架構(gòu)的主要收益:

          • 1)模塊更加內(nèi)聚:新特性開發(fā)影響范圍逐步收斂到模塊內(nèi)部,提升研發(fā)效率;
          • 2)接口更加清晰:依賴數(shù)減少,可測性提升,更易于通過單元測試、接口測試保障代碼邏輯正確性,提升產(chǎn)品質(zhì)量。

          4、“解耦重構(gòu)”的實踐歷程

          4.1概述

          手機 QQ 工程各個業(yè)務(wù)之間的依賴非常嚴(yán)重,對它進行解耦重構(gòu)不是一蹴而就的事情,需要按階段制定目標(biāo),一步一步地優(yōu)化。

          通過整理,手機 QQ 工程解耦重構(gòu)劃分為以下三個階段。

          4.2階段一(2020.11 - 2021.2)

          基本完成約300萬行核心代碼的解耦,一共約30個基礎(chǔ)模塊和40個基礎(chǔ)組件完成解耦,核心業(yè)務(wù)模塊基本完成解耦。

          開發(fā)新功能時,因為接口與服務(wù)實現(xiàn)是隔離的,通過接口依賴的代碼不會再耦合嚴(yán)重。

          4.3階段二(2021.3 - 2021.6)

          目標(biāo):業(yè)務(wù)模塊繼續(xù)解耦,建設(shè)防劣化機制。

          成果:

          • 1)API 代碼占比與依賴數(shù)不增加;
          • 2)完成防劣化機制搭建,在合入階段攔住不合理修改;
          • 3)完善動態(tài)化能力,優(yōu)化插件與宿主間通信機制和發(fā)布效率。

          4.4階段三(2021.7 以后)

          目標(biāo):進一步完善基礎(chǔ)模塊和組件化,實現(xiàn)子工程化。

          成果:

          • 1)完善基礎(chǔ)模塊和公共組件重構(gòu),建立基礎(chǔ)模塊發(fā)布組件流程;
          • 2)對頻道、小世界業(yè)務(wù)實現(xiàn)子工程化,獨立編譯運行。

          5、“解耦重構(gòu)”的技術(shù)收益

          在重構(gòu)基礎(chǔ)上,梳理依賴關(guān)系,通過三個階段改善模塊化水平,提高編譯速度和研發(fā)效率,流水線的編譯耗時提升50%。

          代碼沖突方面也得到明顯改善,對比重構(gòu)前后數(shù)據(jù),沖突文件數(shù)減少60%,沖突次數(shù)減少30%,大大提升開發(fā)效率。

          6、手機QQ下一代架構(gòu):NT架構(gòu)

          在成功邁出改革的第一步之后,我們將注意力轉(zhuǎn)向了手機 QQ 面臨的版本碎片化問題。

          不同端各自發(fā)展,形成了所謂的“煙囪式”結(jié)構(gòu),其中代碼的復(fù)用率極低。這種結(jié)構(gòu)帶來了多端體驗不一致、端內(nèi)業(yè)務(wù)體驗參差不齊以及每次版本更新時高昂的開發(fā)和維護成本等問題。

          為了解決這些問題,并在提升用戶體驗、優(yōu)化性能和提高研發(fā)效率方面實現(xiàn)突破,我們不得不深入思考。

          正是這些迫切的需求和挑戰(zhàn)促使我們啟動了改革的第二步——推進手機 QQ NT 架構(gòu)升級項目。

          在 NT 架構(gòu)設(shè)計之初,我們堅定認(rèn)為不應(yīng)該繼續(xù)縫縫補補,而是應(yīng)該采用最新且合理的技術(shù)理念,摒棄了簡單的修補式方法。這次升級不僅是技術(shù)上的一次大刀闊斧的改造,更是一場深思熟慮的技術(shù)轉(zhuǎn)型。

          我們重視在不造成架構(gòu)大規(guī)模動蕩的前提下,制定了一條清晰、可行的實施路徑。目標(biāo)是以更少的人力投入實現(xiàn)更高的工作效率和成果,確保了升級過程中的高效和穩(wěn)健。這種方法不僅保證了項目的順利進行,也為未來的技術(shù)發(fā)展和迭代奠定了堅實的基礎(chǔ)。

          7、NT架構(gòu)落地之難

          由于手機 QQ 的歷史悠久且擁有龐大的用戶群,該項目在業(yè)務(wù)和用戶層面都展現(xiàn)了巨大的復(fù)雜性。

          具體來看,項目層面的挑戰(zhàn)包括:

          • 1)代碼總量龐大:手機端代碼近千萬行,形成了一個技術(shù)上的龐然大物;
          • 2)測試復(fù)雜性高:測試用例眾多,功能繁雜,且存在部分文檔缺失的情況;
          • 3)依賴組件過時:項目中依賴了一些陳舊且缺乏維護的組件,以及大量無人維護的二進制庫;
          • 4)研發(fā)流程保障:在進行架構(gòu)升級的同時,必須確保研發(fā)工作流程能夠平穩(wěn)過渡,以免影響到研發(fā)效率。

          用戶層面上的挑戰(zhàn)則包括:

          • 1)在長達一年以上的升級過程中,日常版本需要正常迭代;
          • 2)用戶本地數(shù)據(jù)量巨大,如超過 10G 的本地消息數(shù)據(jù)庫;
          • 3)項目需在技術(shù)優(yōu)化的同時提升用戶體驗與活躍度,確保技術(shù)優(yōu)化在用戶端實現(xiàn)價值。

          面對這些復(fù)雜度,項目的核心難點主要集中在以下三個方面。

          1)海量功能項目的架構(gòu)升級和統(tǒng)一:針對全終端、全功能和全項目團隊的整體升級,確保架構(gòu)升級過程中不能有任何缺失。手機 QQ 是在發(fā)展了20多年進行徹底重構(gòu),難度空前,沒有資料可參考。

          2)IM 全鏈路架構(gòu)重寫升級:解決陳年技術(shù)債,優(yōu)化消息架構(gòu),平穩(wěn)遷移用戶歷史數(shù)據(jù),并提升消息性能。QQ 消息架構(gòu)有陳年技術(shù)債,很多 QQ 歷史版本里,沒有統(tǒng)一的消息 ID 生成規(guī)則,沒有統(tǒng)一的存儲和索引方案,消息類型也是無序擴張。所以,既需要對IM全鏈路重寫優(yōu)化,同時在過程中,還需要平穩(wěn)遷移用戶歷史數(shù)據(jù),最終完成升級,保護用戶數(shù)據(jù)、用戶體驗不受影響。

          3)用戶體驗提升與活躍數(shù)據(jù)提升:逐步優(yōu)化核心功能體驗,不影響用戶習(xí)慣,通過提升體驗推動產(chǎn)品數(shù)據(jù)增長。代碼的重寫不能全盤一次性推倒重來。核心功能體驗要保持,逐步優(yōu)化,不能影響用戶使用習(xí)慣。

          這些挑戰(zhàn)不僅說明了手機 QQ NT 架構(gòu)升級項目的復(fù)雜性,也證明了我們在面對前所未有的技術(shù)難題時的決心。

          8、NT架構(gòu)設(shè)計

          為了實現(xiàn)架構(gòu)升級和統(tǒng)一,項目團隊先用 C++ 開發(fā)了具備 QQ IM 核心功能的跨平臺內(nèi)核層:把 IM 核心業(yè)務(wù)邏輯(好友、群、頻道等消息邏輯、資料與關(guān)系鏈邏輯、圖片語音視頻等富媒體收發(fā)邏輯、實時音視頻邏輯等),QQ 通用組件(數(shù)據(jù)庫、協(xié)議編解碼、網(wǎng)絡(luò)傳輸?shù)龋?,以及線程/網(wǎng)絡(luò)/IO 等通用資源管理模塊和操作系統(tǒng)封裝部分,由原來的各平臺原生語言實現(xiàn),統(tǒng)一下沉到 C++ 跨平臺層。

          為了控制項目質(zhì)量風(fēng)險,NT 跨平臺內(nèi)核先接入用戶量相對較少,對功能補齊緊迫度高的桌面端,完全用新架構(gòu)重寫桌面端。

          在桌面端成功完成功能驗證和質(zhì)量測試之后,我們開始了向移動端的遷移工作,并順利完成了 iOS 和安卓平臺的集成。

          當(dāng)然,移動端的接入遠遠不像圖中描述的這般容易,接下來將介紹其中的解決方案和主要過程。

          9、 IM客戶端全鏈路重寫升級

          在新的 NT 架構(gòu)基礎(chǔ)上,對 QQ 來說,最核心的技術(shù)升級,是 IM 全鏈路的升級。

          IM 消息數(shù)據(jù)源復(fù)雜,歷史包袱很重,升級過程的遇到的第一個難點就是數(shù)據(jù)轉(zhuǎn)換及存量數(shù)據(jù)遷移到新版本問題。

          比如:

          • 1)老版本的 QQ,好友消息沒有唯一標(biāo)識字段,導(dǎo)入和去重影響大;
          • 2)2012年以前的版本,群消息沒有支持漫游,消息無唯一字段;
          • 3)各平臺消息數(shù)據(jù)格式不同,復(fù)雜度高,iOS 和 Android 分別有約200種消息類型;
          • 4)富媒體(圖片、視頻、語音、文件)資源,存儲的目錄結(jié)構(gòu)、命名都不同;
          • 5)特殊消息,如結(jié)構(gòu)化消息、Ark 消息、小灰條消息,需要做轉(zhuǎn)換,完成業(yè)務(wù)的梳理和下架工作;
          • 6)還有因為各種功能的變遷帶來的遺留數(shù)據(jù)問題,如已經(jīng)退出或者解散的群和討論組等。

          所以,首先需要做 IM 的精簡。項目團隊基于用戶價值考慮,零基思維,完成消息格式統(tǒng)一,對消息和會話類型進行徹底精簡,為 QQ 消息長治久安打下基礎(chǔ)。

          有了全端格式統(tǒng)一和類型精簡的基礎(chǔ),開始用大小、性能、安全性綜合最優(yōu)方案設(shè)計跨平臺統(tǒng)一的全新客戶端 DB,然后再考慮舊 DB 的數(shù)據(jù),如何平穩(wěn)升級到新 DB。

          移動端和桌面端不同,活躍用戶全年在線,有些手機本地純文本消息的 DB 文件超過10G,加上富媒體、文件等,總數(shù)據(jù)量超過100G,而且移動端又有存儲空間小、功耗敏感、后臺殺進程等多方面限制,需要設(shè)計出一套周密的升級策略,保護用戶核心數(shù)據(jù)資產(chǎn)不丟失。

          方案核心要點:

          • 1)斷點續(xù)導(dǎo):移動端場景,進程隨時可能被殺或退出。確保消息不丟失、不重復(fù);
          • 2)用戶分級:跟進消息數(shù)據(jù)大小,用戶分為三類,做不同的體驗優(yōu)化,減少對用戶的影響;
          • 3)優(yōu)化發(fā)燙和耗電:限制導(dǎo)入速度,防止手機發(fā)燙。手機切后臺后停止導(dǎo)入。對消息數(shù)據(jù)多的用戶,引導(dǎo)用戶設(shè)置在后臺導(dǎo)入;
          • 4)監(jiān)控:做好各種導(dǎo)入異常上報監(jiān)控,隨時跟進用戶反饋。

          通過設(shè)計周密的升級策略,內(nèi)部多輪推演,外部從百級開始放量,全方位監(jiān)控,并用兜底策略保障不丟消息。最終結(jié)合監(jiān)控數(shù)據(jù)和用戶反饋數(shù)據(jù),完成了全量用戶的全量數(shù)據(jù)平穩(wěn)遷移新 DB。

          10、客戶端核心功能優(yōu)化提升

          不僅是消息,在 NT 架構(gòu)重寫升級過程中,對 QQ 核心功能也一起做了更徹底的重構(gòu),手機 QQ 原生功能進行了大規(guī)模解耦,通用的部分進行優(yōu)化并下沉為統(tǒng)一的 NT-Runtime 原生組件(NT 組件服務(wù)及框架層)?;谥貥?gòu)后的架構(gòu),也對性能進行全面優(yōu)化。

          首先是消息相關(guān)核心模塊的優(yōu)化。

          消息邏輯下沉到 C++ 跨平臺,也推動上層進行架構(gòu)刷新。

          以聊天窗口(AIO)為例:基于全新數(shù)據(jù)流架構(gòu) + 數(shù)據(jù)預(yù)加載 + UI 邏輯并行化的設(shè)計思路,完成單向數(shù)據(jù)流驅(qū)動與異步加載渲染,系統(tǒng)資源全力供給 AIO 消息列表,最終性能指標(biāo)提升明顯,AIO 內(nèi)查看、跳轉(zhuǎn)、滑動消息,順暢絲滑。

          核心技術(shù)優(yōu)化方案:

          • 1)采用基于單向數(shù)據(jù)流的 MVI 架構(gòu),實現(xiàn)業(yè)務(wù)解耦;
          • 2)預(yù)加載和異步渲染,實現(xiàn)消息無縫滑動;
          • 3)消息加載并行化,減少首屏和滑動時的加載時間;
          • 4)消息動態(tài)加載、釋放,優(yōu)化內(nèi)存占用。
          • 5)200+業(yè)務(wù)組件懶加載,實現(xiàn)數(shù)據(jù)分層和按需加載。

          其它 QQ 主場景,如消息列表頁、消息與富媒體收發(fā)、圖片視頻查看等,也采用相同的路徑進行優(yōu)化,最終性能全面提升。

          11、本文小結(jié)

          在手機 QQ 超過20年的發(fā)展歷程中,應(yīng)用功能的不斷擴展和代碼量的持續(xù)增長積累了巨大的技術(shù)債務(wù),給原有的客戶端架構(gòu)帶來了沉重的負(fù)擔(dān)。最新版手機QQ通過一系列的架構(gòu)演變和技術(shù)升級,成功地實現(xiàn)了從臃腫不堪到模塊化、高效、穩(wěn)定的轉(zhuǎn)變。

          客戶端架構(gòu)由各端煙囪式架構(gòu)逐步升級為多端跨平臺復(fù)用的 NT 架構(gòu),降低多端維護人力成本,提升 QQ 全端開發(fā)效率,為 QQ 的持續(xù)發(fā)展和技術(shù)迭代打下了堅實的基礎(chǔ)。

          展望未來,QQ 將基于 NT 架構(gòu),在技術(shù)創(chuàng)新的道路上繼續(xù)前行,不斷進行架構(gòu)優(yōu)化和技術(shù)升級,為用戶提供更加流暢穩(wěn)定的產(chǎn)品體驗。

          12、相關(guān)資料

          [1] 總是被低估,從未被超越,揭秘QQ極致絲滑背后的硬核IM技術(shù)優(yōu)化

          [2] 大型IM工程重構(gòu)實踐:企業(yè)微信Android端的重構(gòu)之路

          [3] 企業(yè)微信針對百萬級組織架構(gòu)的客戶端性能優(yōu)化實踐

          [4] 微信團隊分享:詳解iOS版微信視頻號直播中因幀率異常導(dǎo)致的功耗問題

          [5] 騰訊技術(shù)分享:Android版手機QQ的緩存監(jiān)控與優(yōu)化實踐

          [6] 騰訊技術(shù)分享:Android手Q的線程死鎖監(jiān)控系統(tǒng)技術(shù)實踐

          [7] 全面解密新QQ桌面版的Electron內(nèi)存優(yōu)化實踐

          [8] 移動端IM實踐:iOS版微信界面卡頓監(jiān)測方案

          [9] 微信團隊原創(chuàng)分享:Android版微信的臃腫之困與模塊化實踐之路

          [10] 微信Windows端IM消息數(shù)據(jù)庫的優(yōu)化實踐:查詢慢、體積大、文件損壞等

          [11] 微信團隊分享:微信支付代碼重構(gòu)帶來的移動端軟件架構(gòu)上的思考

          [12] 微信客戶端團隊負(fù)責(zé)人技術(shù)訪談:如何著手客戶端性能監(jiān)控和優(yōu)化

          [13] 抖音技術(shù)分享:飛鴿IM桌面端基于Rust語言進行重構(gòu)的技術(shù)選型和實踐總結(jié)

          [14] 阿里技術(shù)分享:閑魚IM基于Flutter的移動端跨端改造實踐

          [15] QQ設(shè)計團隊分享:新版 QQ 8.0 語音消息改版背后的功能設(shè)計思路

          13、更多鵝廠技術(shù)文章匯總

          1. 微信朋友圈千億訪問量背后的技術(shù)挑戰(zhàn)和實踐總結(jié)
          2. 騰訊技術(shù)分享:騰訊是如何大幅降低帶寬和網(wǎng)絡(luò)流量的(圖片壓縮篇)
          3. IM全文檢索技術(shù)專題(二):微信移動端的全文檢索多音字問題解決方案
          4. 微信團隊分享:iOS版微信的高性能通用key-value組件技術(shù)實踐
          5. 微信團隊分享:iOS版微信是如何防止特殊字符導(dǎo)致的炸群、APP崩潰的?
          6. 微信團隊分享:微信Android版小視頻編碼填過的那些坑
          7. IM全文檢索技術(shù)專題(一):微信移動端的全文檢索優(yōu)化之路
          8. 企業(yè)微信客戶端中組織架構(gòu)數(shù)據(jù)的同步更新方案優(yōu)化實戰(zhàn)
          9. 微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解
          10. 微信“紅包照片”背后的技術(shù)難題
          11. 移動端IM實踐:iOS版微信的多設(shè)備字體適配方案探討
          12. 騰訊信鴿技術(shù)分享:百億級實時消息推送的實戰(zhàn)經(jīng)驗
          13. IPv6技術(shù)詳解:基本概念、應(yīng)用現(xiàn)狀、技術(shù)實踐(上篇)
          14. 騰訊技術(shù)分享:GIF動圖技術(shù)詳解及手機QQ動態(tài)表情壓縮技術(shù)實踐
          15. 微信團隊分享:Kotlin漸被認(rèn)可,Android版微信的技術(shù)嘗鮮之旅
          16. 社交軟件紅包技術(shù)解密(一):全面解密QQ紅包技術(shù)方案——架構(gòu)、技術(shù)實現(xiàn)等
          17. 社交軟件紅包技術(shù)解密(四):微信紅包系統(tǒng)是如何應(yīng)對高并發(fā)的
          18. 社交軟件紅包技術(shù)解密(十):手Q客戶端針對2020年春節(jié)紅包的技術(shù)實踐
          19. 微信團隊分享:極致優(yōu)化,iOS版微信編譯速度3倍提升的實踐總結(jié)
          20. IM“掃一掃”功能很好做?看看微信“掃一掃識物”的完整技術(shù)實現(xiàn)
          21. 微信團隊分享:微信支付代碼重構(gòu)帶來的移動端軟件架構(gòu)上的思考
          22. IM開發(fā)寶典:史上最全,微信各種功能參數(shù)和邏輯規(guī)則資料匯總
          23. 微信團隊分享:微信直播聊天室單房間1500萬在線的消息架構(gòu)演進之路
          24. 企業(yè)微信的IM架構(gòu)設(shè)計揭秘:消息模型、萬人群、已讀回執(zhí)、消息撤回等
          25. IM全文檢索技術(shù)專題(四):微信iOS端的最新全文檢索技術(shù)優(yōu)化實踐
          26. 微信團隊分享:微信后臺在海量并發(fā)請求下是如何做到不崩潰的
          27. 微信Windows端IM消息數(shù)據(jù)庫的優(yōu)化實踐:查詢慢、體積大、文件損壞等
          28. 微信技術(shù)分享:揭秘微信后臺安全特征數(shù)據(jù)倉庫的架構(gòu)設(shè)計
          29. IM跨平臺技術(shù)學(xué)習(xí)(九):全面解密新QQ桌面版的Electron內(nèi)存優(yōu)化實踐
          30. 企業(yè)微信針對百萬級組織架構(gòu)的客戶端性能優(yōu)化實踐
          31. 揭秘企業(yè)微信是如何支持超大規(guī)模IM組織架構(gòu)的——技術(shù)解讀四維關(guān)系鏈
          32. 微信團隊分享:詳解iOS版微信視頻號直播中因幀率異常導(dǎo)致的功耗問題
          33. 微信團隊分享:微信后端海量數(shù)據(jù)查詢從1000ms降到100ms的技術(shù)實踐
          34. 大型IM工程重構(gòu)實踐:企業(yè)微信Android端的重構(gòu)之路
          35. IM技術(shù)干貨:假如你來設(shè)計微信的群聊,你該怎么設(shè)計?
          36. 微信團隊分享:來看看微信十年前的IM消息收發(fā)架構(gòu),你做到了嗎
          37. 長連接網(wǎng)關(guān)技術(shù)專題(十一):揭秘騰訊公網(wǎng)TGW網(wǎng)關(guān)系統(tǒng)的技術(shù)架構(gòu)演進


          (本文已同步發(fā)布于:http://www.52im.net/thread-4658-1-1.html



          作者:Jack Jiang (點擊作者姓名進入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發(fā)交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 武隆县| 唐山市| 富阳市| 崇文区| 百色市| 凤城市| 肥城市| 青铜峡市| 高安市| 聂拉木县| 诸暨市| 利津县| 巴里| 海林市| 筠连县| 墨江| 裕民县| 屏东市| 邢台市| 班玛县| 图木舒克市| 舟曲县| 老河口市| 乌恰县| 蓬溪县| 沁阳市| 神池县| 札达县| 上饶县| 德化县| 哈密市| 政和县| 马关县| 樟树市| 盐源县| 那曲县| 板桥市| 洞头县| 枝江市| 德格县| 广汉市|