vip - 08 binder面試系列帶你讀懂進(jìn)程通信機(jī)制詳解_第1頁(yè)
vip - 08 binder面試系列帶你讀懂進(jìn)程通信機(jī)制詳解_第2頁(yè)
vip - 08 binder面試系列帶你讀懂進(jìn)程通信機(jī)制詳解_第3頁(yè)
vip - 08 binder面試系列帶你讀懂進(jìn)程通信機(jī)制詳解_第4頁(yè)
vip - 08 binder面試系列帶你讀懂進(jìn)程通信機(jī)制詳解_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android高級(jí)開(kāi)發(fā)正式課碼牛學(xué)院-用代碼碼出牛逼人生Binder面試系列,帶你讀懂binder進(jìn)程通信機(jī)制談一談Binder的原理和實(shí)現(xiàn)一次拷貝的流程能大致能總結(jié)出Binder通信過(guò)程能講講什么是用戶空間和內(nèi)核空間嗎

Binder驅(qū)動(dòng)轉(zhuǎn)發(fā)消息的原理20:05開(kāi)車

視頻資料加雪兒老師微信技術(shù)點(diǎn):碼牛學(xué)院Android講師介紹David復(fù)旦大學(xué)工程碩士,原Oppo資深研發(fā)工程師,網(wǎng)易特邀Android講師,專注技術(shù)十年,產(chǎn)品控、代碼控,擁有豐富的項(xiàng)目經(jīng)驗(yàn),主持研發(fā)了多個(gè)成功上線的大型互聯(lián)網(wǎng)項(xiàng)目。熱愛(ài)互聯(lián)網(wǎng),熱衷于各種Android底層技術(shù),精通NDK架構(gòu)和前端開(kāi)發(fā),擅長(zhǎng)移動(dòng)互聯(lián)網(wǎng)高并發(fā)、可維護(hù)性架構(gòu)設(shè)計(jì),有豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)。愿意和他人分享自己對(duì)技術(shù)的理解和感悟,講課邏輯清晰,生動(dòng)幽默。River《Android開(kāi)發(fā)入門與實(shí)戰(zhàn)第二版》作者之一,《NFC:Arduino、Android與PhoneGap近場(chǎng)通信》譯者,國(guó)內(nèi)首批Android開(kāi)發(fā),曾任職于銀聯(lián),華夏幸福等知名公司,擅長(zhǎng)項(xiàng)目重構(gòu),架構(gòu),以及性能優(yōu)化,擁有多年的項(xiàng)目開(kāi)發(fā)以及管理經(jīng)驗(yàn),原網(wǎng)易特邀Android講師。授課風(fēng)格幽默風(fēng)趣,有激情,注重站在學(xué)員的角度考慮問(wèn)題。Zee中南大學(xué)計(jì)算機(jī)信息專業(yè)畢業(yè),前新浪架構(gòu)師,58同城項(xiàng)目負(fù)責(zé)人。8年Android行業(yè)從業(yè)經(jīng)驗(yàn),豐富的項(xiàng)目研發(fā)以及管理經(jīng)驗(yàn),原網(wǎng)易特邀Android講師,對(duì)架構(gòu)方面有深入的研究。授課激情有活力,能耐心幫助學(xué)員解決項(xiàng)目中遇到的問(wèn)題。課程安排01Linux原有進(jìn)程通信詳解020304面試總結(jié)mmap函數(shù)原理Binder一次拷貝原理Binder通信機(jī)制:是為什么會(huì)有Binder通信機(jī)制,為什么不能用linux中已有的進(jìn)程框架呢?Google工程師究竟是如何考量的

Binder機(jī)制了解binder之前我們看看原有Linux進(jìn)程是如何通信的吧!為什么需要在內(nèi)存中拷貝兩次呢?在了解Linux進(jìn)程通信前我們先理解下戀愛(ài)的故事吧!戀愛(ài)故事課程小結(jié)男孩(進(jìn)程A)女孩(進(jìn)程B)本地郵局(用戶空間)本地郵局(用戶空間)全國(guó)郵局(內(nèi)核空間)收發(fā)信收發(fā)信男孩稱為進(jìn)程A,工作城市A城,女孩稱為進(jìn)程B,工作城市B城本地郵局稱為用戶空間全國(guó)郵局稱為內(nèi)核空間本地郵局是他們離的最近的地方。他們可以接觸到本地郵局,并且直接收信和發(fā)信戀愛(ài)角色用戶空間,可以被清理,和使用,App越多可使用的空間越少內(nèi)核空間:不管有沒(méi)有啟動(dòng)應(yīng)用,都會(huì)占用一部分空間,大約是總空間的1/4用戶空間與內(nèi)核空間為什么會(huì)有內(nèi)核空間和用戶空間見(jiàn)預(yù)習(xí)資料為什么會(huì)有內(nèi)核空間和用戶空間程序進(jìn)程1虛擬地址空間運(yùn)行物理內(nèi)存進(jìn)程1內(nèi)存映射虛擬內(nèi)存-磁盤什么是用戶空間(很多人也稱之為本地空間或邏輯空間)進(jìn)程尋址空間0~4G進(jìn)程在用戶態(tài)只能訪問(wèn)0~3G,只有進(jìn)入內(nèi)核態(tài)才能訪問(wèn)3G~4G進(jìn)程通過(guò)系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)每個(gè)進(jìn)程虛擬空間的3G~4G部分是相同的進(jìn)程間,用戶空間的數(shù)據(jù)不可共享(本地郵局是男孩或女孩獨(dú)有),所以用戶空間相當(dāng)于私有空間進(jìn)程間,內(nèi)核空間的數(shù)據(jù)可共享(全國(guó)郵局是所有人共有),所以內(nèi)核空間相當(dāng)于公共空間普通linux進(jìn)程通信男孩寫(xiě)好信之后,發(fā)送信件給本地郵局,相當(dāng)于一次拷貝我們把這個(gè)過(guò)程稱為(copy_from_user)女孩收到當(dāng)?shù)剜]局通知,需要從本地郵局取信。相當(dāng)于第二次拷貝,我們把這個(gè)過(guò)程稱為(copy_to_user)普通linux進(jìn)程通信兩次拷貝究竟性能怎么樣,Binder是如何做到的呢?后來(lái)在疫情結(jié)束后,這個(gè)女孩去了全國(guó)郵局依賴的快遞公司上班去了,所有的信封需要用快遞公司來(lái)處理剛好這家快遞公司處理的是他們兩個(gè)城市的信件。戀愛(ài)故事進(jìn)化版為了方便收信封,居然還有這操作驚訝這就給女孩創(chuàng)造了便利,不用去本地郵局取信件Linux進(jìn)程通信變成了這樣男孩(進(jìn)程A)本地郵局(用戶空間)全國(guó)郵局(內(nèi)核空間)收發(fā)信女孩(進(jìn)程B)A城與B城的快遞公司A城與B城的信件讀取信這就給女孩創(chuàng)造了便利,不用去本地郵局取信件但是男孩還是要發(fā)送信件。binder拷貝也是發(fā)生在男孩這個(gè)地方copy_from_user,女孩由于在快遞公司上班可以隨意瀏覽男孩的信件。不需要再取信件了。也就減少了從本地郵局取快遞這次拷貝過(guò)程女孩少跑一趟大家還記不記的接收端怎么寫(xiě)的,對(duì)!接收端一定必須是服務(wù)Service,接收端不能是其他java對(duì)象。Service就是那個(gè)女孩。她必須在快遞公司上班才能減少一次拷貝。所以這個(gè)Service,在通信前會(huì)注冊(cè)在ServiceManager中。而男孩可以是任意對(duì)象,出現(xiàn)在任意地方思考BinderJava層男孩(進(jìn)程A)本地郵局(用戶空間)全國(guó)郵局(內(nèi)核空間)收發(fā)信女孩(進(jìn)程B)A城與B城的快遞公司A城與B城的信件讀取信每個(gè)用戶都需要打開(kāi)binder驅(qū)動(dòng),做好mmap映射才能實(shí)現(xiàn)進(jìn)程通信就像我們開(kāi)寬帶電信賬戶,必須到電信營(yíng)業(yè)廳申請(qǐng),每個(gè)進(jìn)程類似于電信賬戶,Binder驅(qū)動(dòng)類似電信管理的網(wǎng)絡(luò),如果需要向其他賬戶發(fā)送郵件調(diào)用ioctl函數(shù)Binder通信(最初)Binder分為4層BinderJava層,開(kāi)發(fā)者接觸最多的一層BinderC++實(shí)現(xiàn)層,提供jni回調(diào),在系統(tǒng)源碼中Binder框架層,binder.cservermanager.c都在這一層Binder驅(qū)動(dòng)層,在最底層的驅(qū)動(dòng)中,驅(qū)動(dòng)被編譯成了一個(gè)文件,名字叫binderhandle含義03mmap映射實(shí)現(xiàn)原理內(nèi)存映射:將用戶空間的一段內(nèi)存區(qū)域映射到內(nèi)核空間,映射成功后,用戶對(duì)這段內(nèi)存區(qū)域的修改可以直接反映到內(nèi)核空間,同樣,內(nèi)核空間對(duì)這段區(qū)域的修改也直接反映用戶空間。那么對(duì)于內(nèi)核空間<---->用戶空間兩者之間需要大量數(shù)據(jù)傳輸?shù)炔僮鞯脑捫适欠浅8叩?。?nèi)存映射mmap03原有的讀取文件操作mmap函數(shù)映射原理硬盤的寫(xiě)入單位是頁(yè)大小是4K,所以如果數(shù)據(jù)小于4那么會(huì)把多個(gè)數(shù)據(jù)放在緩存中等到足夠4K的時(shí)候,在一起寫(xiě)到閃存中。mmap操作原理(后續(xù)驅(qū)動(dòng)講解)數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間似乎多余,為什么不直接讓磁盤把數(shù)據(jù)送到用戶空間的緩沖區(qū)呢?思考硬盤通常不能直接訪問(wèn)用戶空間磁盤基于塊存儲(chǔ)的硬件設(shè)備操作的固定大小的數(shù)據(jù)塊,用戶進(jìn)程請(qǐng)求的可能是任意大小或者非對(duì)齊的數(shù)據(jù)塊,在這兩者數(shù)據(jù)交互過(guò)程中內(nèi)核負(fù)責(zé)數(shù)據(jù)的分解、再組合工作,起到一個(gè)中間人的角色。mmap函數(shù)是linux下的系統(tǒng)調(diào)用mmap提供了不同于一般對(duì)普通文件的訪問(wèn)方式,進(jìn)程可以像讀寫(xiě)內(nèi)存一樣對(duì)普通文件的操作普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),不必再調(diào)用read(),write()等操作。mmap并不分配空間,只是將文件映射到調(diào)用進(jìn)程的地址空間里(但是會(huì)占掉你的virutalmemory),然后你就可以用memcpy等操作寫(xiě)文件,而不用write()了.寫(xiě)完后,內(nèi)存中的內(nèi)容并不會(huì)立即更新到文件中,而是有一段時(shí)間的延遲mmap函數(shù)映射原理Android內(nèi)核使用vm_area_struct結(jié)構(gòu)來(lái)表示一個(gè)獨(dú)立的虛擬內(nèi)存區(qū)域由于每個(gè)不同質(zhì)的虛擬內(nèi)存區(qū)域功能和內(nèi)部機(jī)制都不同,因此一個(gè)進(jìn)程使用多個(gè)vm_area_struct結(jié)構(gòu)來(lái)分別表示不同類型的虛擬內(nèi)存區(qū)域。各個(gè)vm_area_struct結(jié)構(gòu)使用鏈表或者樹(shù)形結(jié)構(gòu)鏈接,方便進(jìn)程快速訪問(wèn)vm_area_struct映射結(jié)構(gòu)體(后續(xù)驅(qū)動(dòng)講解)mmap函數(shù)是linux下的系統(tǒng)調(diào)用mmap提供了不同于一般對(duì)普通文件的訪問(wèn)方式,進(jìn)程可以像讀寫(xiě)內(nèi)存一樣對(duì)普通文件的操作普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),不必再調(diào)用read(),write()等操作。mmap并不分配空間,只是將文件映射到調(diào)用進(jìn)程的地址空間里(但是會(huì)占掉你虛擬內(nèi)存),然后你就可以用memcpy等操作寫(xiě)文件,而不用write()寫(xiě)完后,內(nèi)存中的內(nèi)容并不會(huì)立即更新到文件中,而是有一段時(shí)間的延遲mmap操作原理(后續(xù)驅(qū)動(dòng)講解)04簡(jiǎn)單看下整個(gè)Bidner的調(diào)用圖心中有個(gè)印象Binder架構(gòu)分為四層Framework層JNI層Native層KernelBinder整體架構(gòu)03系統(tǒng)服務(wù)如何獲取的,Client端如何獲取Binder數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Client端startServiceServiceManagerDavid老師啟動(dòng)99號(hào)技師過(guò)來(lái)按摩大唐經(jīng)理隔壁按摩場(chǎng)所招聘經(jīng)理ServiceManagerNativeBinderProxy

招聘系統(tǒng)(Binder底層)技師房間沒(méi)99號(hào),去隔壁按摩場(chǎng)所借大唐經(jīng)理趕緊到技師房間找到99號(hào)隔壁場(chǎng)所也沒(méi)99號(hào),打出招聘啟事招聘接了招聘99號(hào)技師的活數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Client端獲取服務(wù)回調(diào)BinderBinderProxy招聘大Boss招聘經(jīng)理隔壁按摩場(chǎng)所要不要把人真正帶過(guò)來(lái)呢?ServiceManagerNative招聘系統(tǒng)(Binder底層)execTransact丟給業(yè)務(wù)員大boss業(yè)務(wù)能力強(qiáng),很快招到David老師要的99號(hào)技師將99號(hào)技師,帶到了隔壁場(chǎng)所通知大堂經(jīng)理,人已經(jīng)找來(lái)了在任何IPC進(jìn)程通信框架中分為,服務(wù)注冊(cè),服務(wù)獲取,服務(wù)調(diào)用而服務(wù)獲取是不需要服務(wù)端返回任何對(duì)象和信息過(guò)來(lái),只需要告訴我,服務(wù)是不是存在?準(zhǔn)備好沒(méi)有?IPCBinder架構(gòu)分為四層Framework層

Binder整體架構(gòu)04系統(tǒng)服務(wù)是怎么注冊(cè)的,例如AMS,PMS思考誰(shuí)提供服務(wù)呢?數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)context.getSystemServiceMap集合SYSTEM_SERVICE_FETCHERSDavid老師說(shuō)給我拿99號(hào)技師過(guò)來(lái)大唐經(jīng)理趕緊到技師房間找到99號(hào)99號(hào)技師是怎么聯(lián)系上天之道的?當(dāng)99號(hào)技師還比較單純,剛踏入社會(huì)時(shí)服務(wù)怎么注冊(cè)的,才能理解服務(wù)于Binder之間映射原理Static靜態(tài)代碼塊注冊(cè)registerService03Binder驅(qū)動(dòng)映射原理虛擬進(jìn)程地址空間(vm_area_struct)和虛擬內(nèi)核地址空間(vm_struct)都映射到同一塊物理內(nèi)存空間。當(dāng)Client端與Server端發(fā)送數(shù)據(jù)時(shí)Client(作為數(shù)據(jù)發(fā)送端)先從自己的進(jìn)程空間把IPC通信數(shù)據(jù)copy_from_user拷貝到內(nèi)核空間,而Server端(作為數(shù)據(jù)接收端)與內(nèi)核共享數(shù)據(jù),不再需要拷貝數(shù)據(jù),而是通過(guò)內(nèi)存地址空間的偏移量,即可獲悉內(nèi)存地址,整個(gè)過(guò)程只發(fā)生一次內(nèi)存拷貝。一般地做法,需要Client端進(jìn)程空間拷貝到內(nèi)核空間,再由內(nèi)核空間拷貝到Server進(jìn)程空間,會(huì)發(fā)生兩次拷貝。Binder內(nèi)存機(jī)制數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder的內(nèi)存轉(zhuǎn)移關(guān)系數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)數(shù)據(jù)發(fā)送方需要包裹好數(shù)據(jù)協(xié)議通過(guò)copy_from_user拷貝數(shù)據(jù)Binder整體架構(gòu)軟飯陷阱銀行對(duì)接員鈔票轉(zhuǎn)運(yùn)系統(tǒng)銀行流水系統(tǒng)開(kāi)心的吃軟飯銀行處理中心開(kāi)始打錢18歲妹子大老板不斷要錢年輕人Binder原理binder_parseBinder文件虛擬內(nèi)存映射binder_state循環(huán)解析從binder的指令binder_send_replybinder_write循環(huán)器外部接口func(進(jìn)程A)取到數(shù)據(jù)進(jìn)程B傳統(tǒng)I/O成傳統(tǒng)I/O成Android訪問(wèn)文件的傳統(tǒng)方法是用open打開(kāi)它們,如果有多個(gè)進(jìn)程訪問(wèn)同一個(gè)文件,在linux層為每一個(gè)進(jìn)程都分配了一個(gè)該文件的副本,這不必要地浪費(fèi)了存儲(chǔ)空間和時(shí)間進(jìn)程A與進(jìn)程B在通信時(shí)會(huì)發(fā)生兩次拷貝。

共享存儲(chǔ)映射IO進(jìn)程A和進(jìn)程B都將該頁(yè)映射到自己的地址空間,當(dāng)進(jìn)程A第一次訪問(wèn)該頁(yè)中的數(shù)據(jù)時(shí),它生成一個(gè)缺頁(yè)中斷.內(nèi)核此時(shí)讀入這一頁(yè)到內(nèi)存并更新頁(yè)表使之指向它.以后,當(dāng)進(jìn)程B訪問(wèn)同一頁(yè)面而出現(xiàn)缺頁(yè)中斷時(shí),該頁(yè)已經(jīng)在內(nèi)存,內(nèi)核只需要將進(jìn)程B的頁(yè)表登記項(xiàng)指向次頁(yè)即可傳統(tǒng)I/O成02SharedPreferencesImpl源碼分析,為什么用它性能那么差勁SharedPreferencesImpl源碼分析mMapdavid.xml應(yīng)用層修改了Map加鎖putStringcommit()開(kāi)線程全量寫(xiě)入xml解析全量XML樹(shù)返回應(yīng)用層更新Map加鎖加鎖加鎖最新活動(dòng)雪兒老師的QQ:1979846055最新活動(dòng)雪兒老師的QQ:1979846055課程配套服務(wù)01.答疑服務(wù)專門的答疑老師替學(xué)員解答問(wèn)題01.學(xué)習(xí)計(jì)劃1V1為你定制專屬的學(xué)習(xí)計(jì)劃01.考核與作業(yè)考核與作業(yè)意義在于理論與實(shí)踐并行01.專屬班級(jí)專屬班級(jí)打開(kāi)你的人際交流圈01.新技術(shù)分享時(shí)刻關(guān)注國(guó)際市場(chǎng)新技術(shù)的動(dòng)態(tài),分享給學(xué)員01.就業(yè)指導(dǎo)簡(jiǎn)歷指導(dǎo)和面試指導(dǎo)并行,讓你的崗位不侮辱你的能力01.企業(yè)內(nèi)推眾多一線企業(yè)的內(nèi)推崗位等你拿01.升級(jí)更新最新技術(shù)一直免費(fèi)學(xué)01.錢程無(wú)憂Toppro優(yōu)先權(quán),告別死工資01.漲薪無(wú)憂畢業(yè)不滿三年的學(xué)員學(xué)完課程不漲5K,全額退款碼牛學(xué)院-用代碼碼出牛逼人生Android高級(jí)UI注:貝塞爾曲線,動(dòng)畫(huà),布局原理不僅僅只是Android上可以使用,其他語(yǔ)言在實(shí)現(xiàn)這些效果時(shí)大同小異; UI概述1:UI繪制流程2:事件分發(fā)機(jī)制3:Paint/貝塞爾曲線4:動(dòng)畫(huà)源碼,進(jìn)階5:屏幕適配6:項(xiàng)目實(shí)戰(zhàn)碼牛學(xué)院-用代碼碼出牛逼人生Android高級(jí)架構(gòu)師注:架構(gòu)不管在哪門語(yǔ)言都是需要的,架構(gòu)不單單是代碼,更是思路;

架構(gòu)概述1:設(shè)計(jì)原則/模式

2:Framework/啟動(dòng)等源碼分析3:Google最新推出的組件4:常見(jiàn)第三方框架分析手寫(xiě)碼牛學(xué)院-用代碼碼出牛逼人生Android

NDK深層進(jìn)階注:4G時(shí)代出來(lái)了抖音等大量音視頻應(yīng)用,5G時(shí)代必然會(huì)涌現(xiàn)更多的需要大數(shù)據(jù)量的應(yīng)用,NDK的學(xué)習(xí)迫在眉睫;而C/C+語(yǔ)言也將成為加密/防反編譯的趨勢(shì); NDK概述1:C/C++基礎(chǔ)/進(jìn)階

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論