在瞬息萬(wàn)變的互聯(lián)網(wǎng)行業(yè)中,年過二十四的 QQ 堪稱超長(zhǎng)壽的產(chǎn)品,見證了中國(guó)互聯(lián)網(wǎng)崛起的完整歷程。然而,如今這個(gè)元老級(jí)產(chǎn)品經(jīng)歷了一次從內(nèi)到外徹底的重構(gòu)。
在這次重構(gòu)中,QQ 選擇了 Electron 作為 UI 跨平臺(tái)開發(fā)框架。盡管 Electron 被 Slack、Visual Studio Code 和 Discord 等大型產(chǎn)品廣泛使用,但也引發(fā)了一些網(wǎng)友的擔(dān)憂,例如內(nèi)存占用、安裝包體積和啟動(dòng)速度等方面的問題。
好奇于 QQ 的決策,于是infoQ采訪了 QQ 技術(shù)團(tuán)隊(duì),窺探這次變革的脈絡(luò),揭示出那些潛藏在背后的思考。
QQ 重構(gòu)背后的思考:24 歲的 QQ 有什么樣的技術(shù)債?
QQ 的第一個(gè)版本發(fā)布于 1998 年,在 Windows 技術(shù)棧的基礎(chǔ)上用純?cè)姆绞介_發(fā),在當(dāng)時(shí)互聯(lián)網(wǎng)帶寬非常小的情況下,QQ 將安裝包控制在了只有 200K 左右。2007 年后智能手機(jī)開始露出苗頭,騰訊行動(dòng)得比較早,部分前端技術(shù)開發(fā)開始轉(zhuǎn)型到了移動(dòng)端,在桌面端, QQ 隨著業(yè)務(wù)和組織的發(fā)展,針對(duì)三大操作系統(tǒng)陸續(xù)組建了三支不同的研發(fā)團(tuán)隊(duì),各自負(fù)責(zé)自己的一套代碼。
三端不同代碼,老產(chǎn)品歷史包袱,加上移動(dòng)時(shí)代研發(fā)人員的轉(zhuǎn)型,導(dǎo)致桌面 QQ 維護(hù)成本很高。QQ 技術(shù)團(tuán)隊(duì)介紹,拿之前的桌面 QQ 為例,WindowsQQ 以前的 UI 框架用的是騰訊自研的 GF 框架,10 多年了,GF 這個(gè)框架文檔還不全,新加入這個(gè)項(xiàng)目的團(tuán)隊(duì)人員,要基于這個(gè)基礎(chǔ)框架去做一些事情,是效率很低的一件事情,慢慢的就沒有人愿意去用這個(gè)框架了。簡(jiǎn)而言之,就是技術(shù)債。
舊版的桌面端 QQ,Windows 的功能最豐富,macOS 次之, Linux 功能非常簡(jiǎn)潔。比如“屏幕共享”這個(gè)功能,移動(dòng)端有,Windows 端有,但是 macOS 端是沒有的。那用戶就會(huì)遇到一個(gè)問題,像 macOS 端無(wú)法與其它端 QQ 用戶一起來(lái)使用這個(gè)功能。
“多端不統(tǒng)一不利于用戶對(duì)于 QQ 的統(tǒng)一認(rèn)知。我們這次的架構(gòu)升級(jí)就是想盡量通過一套核心代碼去拉平所有平臺(tái)的體驗(yàn),讓它具有更好的可維護(hù)性和可擴(kuò)展性,讓桌面 QQ 能夠更好地迭代產(chǎn)品交互和功能,升級(jí)用戶體驗(yàn),再次煥發(fā)生長(zhǎng)的生命力。”
于是 QQ NT 項(xiàng)目是在 2022 年 3 月份正式啟動(dòng), macOS QQ 在 6 月份開始發(fā)布內(nèi)測(cè), 9 月份正式上架了 App Store,迭代了幾個(gè)版本之后,QQ 團(tuán)隊(duì)就同步開發(fā) Linux。在 2022 年,QQ 發(fā)布了新的 macOS 和 Linux 版本,包括 QQ 后臺(tái)其實(shí)也做了很大的改變和重構(gòu),核心系統(tǒng)做了全新重寫,云原生成熟度也得到了很大的提升。從 2023 年開始,QQ 團(tuán)隊(duì)聚焦做 Windows 端的開發(fā),在 3 月底就開始內(nèi)測(cè),7 月初上架官網(wǎng)。同時(shí)移動(dòng)端 QQ NT 也在 7 月初完成了核心系統(tǒng)的重寫和全量升級(jí)。在目前全新的框架設(shè)計(jì)下,無(wú)論是核心系統(tǒng)、功能迭代還是設(shè)計(jì)語(yǔ)言上,都可以盡可能地“原子化”,來(lái)讓 QQ 后續(xù)更好地迭代功能。
重構(gòu)之路:最大的壓力與挑戰(zhàn)源自何處?
“QQ 的重構(gòu)其實(shí)是兩方面的重構(gòu):一個(gè)是面向復(fù)雜業(yè)務(wù)的梳理重構(gòu),一個(gè)面向工程技術(shù)債的全新技術(shù)重構(gòu),重構(gòu)之路也是兩者相互伴隨的過程。”
首先,在整個(gè) QQ 重構(gòu)過程中最大的挑戰(zhàn)來(lái)自于 QQ 功能的復(fù)雜化,QQ 有很多十分復(fù)雜的歷史功能,這些功能模塊也曾經(jīng)由非常多不同的人經(jīng)手負(fù)責(zé)過。其中哪些功能是不合理的或沒有價(jià)值的,如何去做取舍往往是最難的。“雖然技術(shù)上我們做了很多事情,但技術(shù)上的實(shí)現(xiàn)或許并沒有那么難,我們處理起來(lái)更有經(jīng)驗(yàn)和從容。相比于技術(shù)的復(fù)雜度,業(yè)務(wù)上的往往需要考慮的更多,這本身就是很大的挑戰(zhàn)。”
因?yàn)?QQ 已經(jīng)是近 25 年的產(chǎn)品了,有很多細(xì)小復(fù)雜的功能。雖然這些功能看看起來(lái)很小,但用戶量其實(shí)又很大,稍微改動(dòng)可能就會(huì)有很多的用戶反饋,QQ 團(tuán)隊(duì)都得非常的關(guān)注。僅從產(chǎn)品功能角度上看,有些功能本身就已經(jīng)是很重的負(fù)債,而 QQ 團(tuán)隊(duì)內(nèi)部有一個(gè)叫做“QQ 節(jié)能計(jì)劃”的項(xiàng)目,會(huì)有比較嚴(yán)謹(jǐn)?shù)捻?xiàng)目流程去評(píng)估是否需要下架。
技術(shù)上重構(gòu)也有不少挑戰(zhàn),這次重構(gòu)是一次跨平臺(tái)的重構(gòu),而在多個(gè)平臺(tái)里面比較有挑戰(zhàn)則是 Linux 平臺(tái)。
作為程序員,很多人免不了要跟 Linux 打交道。但是這么多年來(lái),對(duì)于使用 Linux 系統(tǒng)的用戶來(lái)講,有一個(gè)特別讓人煩惱的問題,那就是沒有一個(gè)好用的 IM 聊天工具。被寄予厚望的 QQ,此前在 Linux 版本上功能也沒有 Windows 和 macOS 版本全面,迭代速度也明顯慢過其他兩個(gè)版本。業(yè)界甚至猜測(cè) Linux 第一個(gè)版本是由騰訊實(shí)習(xí)生所寫,畢竟這個(gè)說法進(jìn)一步加重了其初版的“簡(jiǎn)陋”特性,也為其“停更”的原因提供了更合理的解釋。
QQ 技術(shù)團(tuán)隊(duì)表示,較之另兩個(gè)版本,Linux 版本的研發(fā)最為復(fù)雜:一方面操作系統(tǒng)本身很多碎片化,市面上有非常多的發(fā)行版,也不缺乏一些千奇百怪的版本;另一方面因?yàn)闄C(jī)器運(yùn)行環(huán)境或編譯器的缺失,使得解決適配問題的難度很大。許多發(fā)行版相關(guān)的機(jī)器和開發(fā)環(huán)境實(shí)際上他們并沒有,有時(shí)還需要外部公司幫助進(jìn)行一些測(cè)試工作。由于沒有相應(yīng)的開發(fā)環(huán)境,一旦出現(xiàn)閃退等問題,解決難度自然會(huì)變得更大。此外,有時(shí)候需要與國(guó)產(chǎn)操作系統(tǒng)廠商進(jìn)行特殊的合作,甚至需要對(duì)方寄送特定的編譯好的代碼庫(kù),但前后往往會(huì)花費(fèi)一個(gè)月的時(shí)間才能收到。而在本次重構(gòu)之后,“Linux 功能跟 Windows 一樣多了”。
技術(shù)上的另一大挑戰(zhàn)便是外界對(duì)于 QQ 桌面端使用 Electron 的質(zhì)疑,尤其是內(nèi)存方面。外界有些用戶在沒有使用和分析的情況下對(duì)此發(fā)表一些夸大和否定的言論,也確實(shí)給 QQ 技術(shù)團(tuán)隊(duì)帶來(lái)不小壓力,但他們卻始終堅(jiān)定選型方向,也相信其中的問題可以被攻克和解決。
技術(shù)選擇之爭(zhēng):為何 QQ 選擇 Electron 而非純 Native 技術(shù)棧?
確實(shí)當(dāng)時(shí)有很多人在問,為什么 Windows 不用原生去實(shí)現(xiàn)?為什么不用 Qt?
“首先不太想和以前一樣,Windows、macOS、Linux 三端各由一個(gè)團(tuán)隊(duì)分開負(fù)責(zé)。在國(guó)內(nèi)這種人才環(huán)境里面,相關(guān)的純?cè)拈_發(fā)人員其實(shí)非常難招了,桌面端的人才稀缺,同時(shí)也投入比較大。
而對(duì)于 Qt 技術(shù)棧,他們首先考慮的其實(shí)還是人才的問題,國(guó)內(nèi)熟練 Qt 技術(shù)棧的人非常少。如果對(duì)這個(gè)框架不了解,使用它反而是一個(gè)負(fù)向作用。
至于微軟的 Webview2,從本質(zhì)上講,Webview2 和 Electron 并沒有太大的區(qū)別,只是相對(duì)在其中打包了一些微軟自身的優(yōu)化措施,其他方面也不是很完善,而且還無(wú)法跨平臺(tái)。雖然內(nèi)存方面相較于 Electron 做了更多的優(yōu)化。但據(jù)了解,比如微軟 Teams 也沒有完全切到 Webview2。并且由于它沒有開源,因此也沒有辦法基于 Webview2 做定制優(yōu)化。
包括 Flutter,QQ 團(tuán)隊(duì)表示他們當(dāng)時(shí)也有過調(diào)研。他們放棄的一個(gè)原因是 Flutter 在桌面端的完善程度并不高,也擔(dān)心標(biāo)準(zhǔn)化的問題。雖然當(dāng)前 Flutter 非常流行,但誰(shuí)也說不好這是不是“2015 年的 React Native”。大家擔(dān)心隨著時(shí)間推移,這套技術(shù)可能會(huì)失去維護(hù)支持,因?yàn)楸旧?Google 使用 Flutter 的占比也比較小。
“雖然它很熱,但我們歷史上踩過了很多很多非標(biāo)準(zhǔn)化的坑,一旦某個(gè)技術(shù)棧熱度一過、維護(hù)力度不夠,它就會(huì)成為全新的負(fù)債,做選型時(shí)必然也是避免再有類似經(jīng)歷。”
至于為什么最后選擇 Electron,QQ 技術(shù)團(tuán)隊(duì)表示主要是基于以下幾個(gè)考量:
首先最看重的是框架成熟度和技術(shù)棧的標(biāo)準(zhǔn)化。Electron 基于 Web 技術(shù)棧,有足夠低的上手和使用成本,不需要為了使用框架本身,還需要投入額外巨大人力成本去做基建和周邊工具鏈的建設(shè),以前在 RN、Flutter 的實(shí)踐上都有類似的情況。而使用 Electron,現(xiàn)有的 Web 前端的大部分基建都可以直接復(fù)用,而且使用 Web 開發(fā) UI 的效率,在主流技術(shù)棧里算是很高的了。至于迭代效率我覺得從新版桌面 QQ 功能的迭代速度就可以證明,這放在以前是完全辦不到的。另外由于 Web 技術(shù)棧是標(biāo)準(zhǔn)化的,假如 Electron 修改開源協(xié)議或者要閉源了,他們也能很方便的去寫出一套類似的框架。只不過現(xiàn)在已經(jīng)有開源的了,沒必要再去重復(fù)建設(shè)一個(gè)。而且隨著 Web 標(biāo)準(zhǔn)長(zhǎng)久發(fā)展,Web 技術(shù)棧也不會(huì)有大的問題,而且還會(huì)越來(lái)越好。
其次是技術(shù)經(jīng)驗(yàn)及人才儲(chǔ)備,技術(shù)選型是否適合當(dāng)前團(tuán)隊(duì)也是一個(gè)很重要的考慮點(diǎn),團(tuán)隊(duì)是否有相關(guān)的技術(shù)積累,是否有人才儲(chǔ)備來(lái)持續(xù)投入這個(gè)技術(shù)棧。Qt 的確在性能上是一個(gè)很好的選擇,但目前團(tuán)隊(duì)對(duì) Qt 沒有太多積累,基建基本沒有,而且相關(guān)人才其實(shí)比較匱乏,招聘就更難了。而當(dāng)前 QQ 技術(shù)團(tuán)隊(duì) Web 前端團(tuán)隊(duì)還是有比較多的積累,在 QQ 頻道項(xiàng)目中,也完整驗(yàn)證了 Electron 的技術(shù)可行性。
最后就是 Electron 具備的桌面端跨平臺(tái)的優(yōu)勢(shì)。但 QQ NT 架構(gòu)并不是僅指 Electron,Electron 主要是作為 UI 跨平臺(tái)的框架,只是占比很小的一部分,并且 QQ 桌面端不是全部用 Electron 實(shí)現(xiàn),QQ NT 最核心的部分還是 QQ 底層通用抽象的模塊,稱之為 NT 內(nèi)核,包括核心登錄、消息系統(tǒng)、關(guān)系鏈、富媒體、長(zhǎng)連接、數(shù)據(jù)庫(kù)等等模塊,完全用 C++ 實(shí)現(xiàn),全平臺(tái)通用。因此底層是完全跨平臺(tái)的架構(gòu),而 Electron 只是上層桌面端 UI 跨平臺(tái)較薄的一層。
“其實(shí)我們當(dāng)時(shí)選型的時(shí)候,也的確看得到大家對(duì) Electron 的評(píng)價(jià)褒貶不一,但我們還是有信心去解決這個(gè)問題,前期也做了一些技術(shù)的 Demo 和預(yù)研。實(shí)際上 Electron 并沒有糟糕到這個(gè)地步。我們覺得可能是國(guó)內(nèi)很多沒有用過 Electron 的開發(fā)者,對(duì)這個(gè)框架有些忌憚。其實(shí)你到 Electron 的網(wǎng)站去看,還是有非常多國(guó)內(nèi)外的億級(jí) DAU 產(chǎn)品都使用 Electron 框架。目前這幾年主流的桌面端應(yīng)用基本都選擇了 Electron,如 Visual Studio Code、Discord、Slack、Skype、Whatsapp、Figma 等等,新的應(yīng)用基本上也是首選 Electron,版本的迭代速度和社區(qū)氛圍都很在線。”
“我們覺得不需要單純因?yàn)榭诒畣栴},就對(duì)這個(gè)選型沒有了期待。還是要從實(shí)際出發(fā),哪種技術(shù)棧適合你的產(chǎn)品,看看到底能不能有技術(shù)實(shí)力去把這個(gè)事情搞定。”
內(nèi)存優(yōu)化:如何有效控制 Electron 的內(nèi)存占用?
外界之所以會(huì)覺得 Electron 內(nèi)存占用高,是因?yàn)槠浔旧硎且粋€(gè)多進(jìn)程的架構(gòu),主進(jìn)程基于 Node.js, 而每個(gè)窗口都對(duì)應(yīng)一個(gè)渲染進(jìn)程以及 V8 實(shí)例??梢哉f從技術(shù)框架層面上,上手寫代碼很容易,但不容易去管控它的內(nèi)存。
QQ 技術(shù)團(tuán)隊(duì)認(rèn)為 Electron 的開發(fā)者更多的是前端的開發(fā)者,可能在思維上沒有去考慮怎么在這樣一套技術(shù)框架里,去對(duì)內(nèi)存數(shù)據(jù)進(jìn)行管理和管控。開發(fā)者需要從前端開發(fā)者的思維,轉(zhuǎn)變?yōu)榭蛻舳碎_發(fā)者的思維。
綜合來(lái)看,對(duì)內(nèi)存的看法其實(shí)不完全是 Electron 的技術(shù)框架所導(dǎo)致的,更多的是門檻上、開發(fā)思維上,導(dǎo)致內(nèi)存沒有得到很好的關(guān)注和優(yōu)化。其實(shí)最簡(jiǎn)單的 Electron 應(yīng)用大概也就只有幾十兆的內(nèi)存占用。因?yàn)榍岸嗽靖噙€是停留在開發(fā)即用即走的 Web 站點(diǎn),很少實(shí)現(xiàn)一個(gè)超大客戶端,缺乏控制內(nèi)存的經(jīng)驗(yàn),所以面對(duì) QQ 這么大一個(gè)產(chǎn)品的時(shí)候,你就必須非常在意內(nèi)存的使用和管控。
至于優(yōu)化內(nèi)存的突破口,可以說是從各個(gè)層面:從消息的鏈路中的每條消息的收發(fā)上,數(shù)據(jù)是怎么管理,包括像窗口及會(huì)話的管理,都得精打細(xì)算,也會(huì)做一些數(shù)據(jù)本地化和一些機(jī)制的按需加載,包括渲染上他們也提出一個(gè)根本的原則:“要做到所見才占用”,既我們看到的內(nèi)容才占用這一部分內(nèi)存,沒看到和用不到的任何場(chǎng)景的內(nèi)存就不應(yīng)該再占用,通過各種方式來(lái)去讓內(nèi)存達(dá)到一個(gè)設(shè)定的目標(biāo)。
他們也使用了不同維度的內(nèi)存分析工具,從 V8 引擎到進(jìn)程,再到整個(gè)應(yīng)用程序,打通整個(gè)鏈路進(jìn)行多角度的細(xì)節(jié)分析,以此來(lái)定位內(nèi)存使用的瓶頸。之后采取一系列的針對(duì)性優(yōu)化策略,包括緩存策略、按需加載、優(yōu)雅降級(jí)等,同時(shí)使用線上監(jiān)控、自動(dòng)化測(cè)試手段,包括借助開發(fā)框架、工具建設(shè)、代碼審查等,來(lái)阻止性能退化。(更多細(xì)節(jié)可以參看技術(shù)文章:新 QQ NT 桌面版如何實(shí)現(xiàn)內(nèi)存優(yōu)化探索?)
經(jīng)過一系列組合優(yōu)化之后,QQ 的內(nèi)存在長(zhǎng)時(shí)間掛機(jī)的條件下,平均穩(wěn)定在 220M 左右。“現(xiàn)在優(yōu)化還是不錯(cuò)的,比老版本要好很多。我們認(rèn)為這個(gè)難題還是可以被很好的攻克,內(nèi)存并不是大家認(rèn)為的這么不可控,但是也需要團(tuán)隊(duì)去花費(fèi)相當(dāng)精力去探索和實(shí)踐,才能去把內(nèi)存控制到一個(gè)比較理想的狀態(tài)。”
未來(lái)展望:QQ 的前端發(fā)展規(guī)劃是怎樣的?
目前 QQ 的前端團(tuán)隊(duì)作為一個(gè)公線團(tuán)隊(duì),不僅負(fù)責(zé)桌面 QQ 的研發(fā),還有 QQ 基礎(chǔ)運(yùn)營(yíng)、QQ 空間以及基于 QQ 生態(tài)的創(chuàng)新項(xiàng)目研發(fā),有比較多的線上項(xiàng)目的開發(fā)與維護(hù)和內(nèi)部研效工具的建設(shè)。涉及的技術(shù)棧,包括 H5、Electron、Cocos、小程序、WebGL、WebAssembly、WebRTC 等。他們也表示會(huì)繼續(xù)夯實(shí)這些技術(shù),同時(shí)也不斷地打破立下的性能目標(biāo),希望讓桌面 QQ 覆蓋更多平臺(tái)。
他們也正在積極擁抱 AI,讓 AI 在質(zhì)量和效率上輔助日常開發(fā)。比如:前端設(shè)計(jì)稿還原,之前更多是一個(gè)耗時(shí)的體力活,D2C 是 QQ 前端一直探索的方向,之前使用純規(guī)則轉(zhuǎn)換生成代碼,在視覺還原上效果還不錯(cuò),但是代碼可讀性和可維護(hù)性不能很好的滿足預(yù)期,所以除了一些日拋型的運(yùn)營(yíng)活動(dòng)有些使用之外,比較難擴(kuò)大成果。現(xiàn)在 D2C 結(jié)合大模型,生成的代碼質(zhì)量高了很多,也能很方便的將代碼與 UI 組件庫(kù)做映射,達(dá)到可以在核心業(yè)務(wù)中高效使用,達(dá)到通過 AI 提升研發(fā)效率的目的。針對(duì)一些無(wú)設(shè)計(jì)稿的管理平臺(tái)開發(fā),使用 P2C 提效,目前也有了一些不錯(cuò)的案例。
另外,QQ 技術(shù)團(tuán)隊(duì)也在積極探索 AI 更廣闊的應(yīng)用場(chǎng)景,比如代碼評(píng)審,基本的 Lint 檢檢是難以實(shí)現(xiàn)的,但將已經(jīng)掌握的內(nèi)存泄漏模式通過規(guī)則的形式給到 AI,可以很方便地給開發(fā)同學(xué)一些不錯(cuò)的建議,為性能看家護(hù)院提供多一道保障。
寫在最后
QQ NT 項(xiàng)目于 2022 年 3 月份啟動(dòng),macOS QQ 花了該團(tuán)隊(duì) 3 個(gè)月的開發(fā)時(shí)間,9 月份上架 App Store,迭代了幾個(gè)版本后同步開始開發(fā) Linux QQ,并于這一年的最后一天上架各 Linux 應(yīng)用市場(chǎng),作為給 Linux 用戶的一份特殊的新年禮物。2023 年 QQ 團(tuán)隊(duì)開始去聚焦做 Windows QQ NT 的開發(fā),7 月正式上架應(yīng)用市場(chǎng)和官網(wǎng)。同時(shí)移動(dòng)端的 QQ 從 2022 年的 Q4 開始開發(fā),也已經(jīng)完成了全量升級(jí)和發(fā)布。
另外,桌面 QQ 也是在 NT 版本中第一次支持 64 位,這需要將音視頻、安全、字節(jié)碼、圖形庫(kù)等 C++ 模塊,包括 Electron 框架都重新進(jìn)行編譯,花費(fèi)了比較大的工作量。但在 64 位系統(tǒng)上,QQ 從此便不再需要以 32 位應(yīng)用的方式通過額外的兼容和轉(zhuǎn)換來(lái)運(yùn)行。畢竟額外操作會(huì)增加開銷,導(dǎo)致性能下降。
至此,QQ 實(shí)現(xiàn)了多個(gè)系統(tǒng)平臺(tái)之間架構(gòu)的統(tǒng)一。而團(tuán)隊(duì)的未來(lái)規(guī)劃還是不斷地打破性能目標(biāo),并覆蓋更多平臺(tái),同時(shí)探索更多提升研發(fā)效率的辦法,加快研發(fā)速度。
騰訊 QQ 用跨平臺(tái) Electron 取代之前原生應(yīng)用程序的開發(fā)模式,這一舉動(dòng)引發(fā)的反響確實(shí)巨大。但我們也能看出,不同于小型產(chǎn)品團(tuán)隊(duì),在大公司里具有一定規(guī)模的產(chǎn)品組織架構(gòu)之下,快速滿足用戶需求,并逐漸需要為第三、第四乃至第五種運(yùn)行平臺(tái)提供支持時(shí),保持一致性和協(xié)調(diào)性并不是想象中的那么容易。而緩慢而低效,最終會(huì)令你輸?shù)舯荣悺?/p>
不管使用什么跨平臺(tái)開發(fā)框架,都要去選擇最合適自己團(tuán)隊(duì)的,也因此在 Web 標(biāo)準(zhǔn)技術(shù)棧上有豐富積累的 QQ 團(tuán)隊(duì)才會(huì)選擇 Electron。并且我們認(rèn)為沒有人真正討厭 Electron,只是我們對(duì) QQ,對(duì)國(guó)內(nèi) App 寄予了非常高的期盼。
(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。 )