1.1 請回答一下Android進程間的通信方式店归?
文件通信刃麸、共享內(nèi)存醒叁、Binder、Socket泊业、管道把沼、信號等
在Android中Binder又有多種表現(xiàn)形式,例如:ContentProvider吁伺、Messenger饮睬、AIDL、Token等
1.2 請談?wù)勀銓inder機制的理解篮奄?
Binder機制:
- 為了保證進程空間不被其他進程破壞或干擾捆愁,Linux中的進程是相互獨立或相互隔離的。
- 進程空間分為用戶空間和內(nèi)核空間窟却。用戶空間不可以進行數(shù)據(jù)交互昼丑;內(nèi)核空間可以進行數(shù)據(jù)交互,所有進程共用一個內(nèi)核空間夸赫。
- Binder機制相對于Linux內(nèi)傳統(tǒng)的進程間通信方式:(1)性能更好菩帝;Binder機制只需要拷貝數(shù)據(jù)一次,管道、消息隊列呼奢、Socket等都需要拷貝數(shù)據(jù)兩次宜雀;而共享內(nèi)存雖然不需要拷貝,但實現(xiàn)復(fù)雜度高控妻。(2)安全性更高州袒;Binder機制通過UID/PID在內(nèi)核空間添加了身份標識,安全性更高弓候。
- Binder跨進程通信機制:基于C/S架構(gòu)郎哭,由Client、Server菇存、Server Manager和Binder驅(qū)動組成夸研。
- Binder驅(qū)動實現(xiàn)的原理:通過內(nèi)存映射,即系統(tǒng)調(diào)用了 mmap() 函數(shù)依鸥。
- Server Manager的作用:管理Service的注冊和查詢亥至。
- Binder驅(qū)動的作用:(1)傳遞進程間的數(shù)據(jù),通過系統(tǒng)調(diào)用mmap()函數(shù)贱迟;(2)實現(xiàn)線程的控制姐扮,通過Binder驅(qū)動的線程池匀谣,并由Binder驅(qū)動自身進行管理眷柔。
- Server進程會創(chuàng)建很多線程處理Binder請求亚享,這些線程采用Binder驅(qū)動的線程池啄枕,由Binder驅(qū)動自身進行管理霹疫。一個進程的Binder線程池默認最大是16個绵疲,超過的請求會阻塞等待空閑的線程梭姓。
- Android中進行進程間通信主要通過Binder類(已經(jīng)實現(xiàn)了IBinder接口)仪搔,即具備了跨進程通信的能力忧换。
1.3 談?wù)?AIDL恬惯?
AIDL 是一種輔助工具,不用AIDL ,一樣可以實現(xiàn)跨進程通訊AIDL 的原理是binder,真正有跨進程通訊能力的也是Binder,所以 AIDL 只是一個能幫你少寫代碼,少出錯的輔助工具,由于設(shè)計的太好,使用太方便,所以非常常用
就像 retrofit 和okhttp 關(guān)系一樣, retrofit 提供 更加友好的api,真正的網(wǎng)絡(luò)請求還是由 okhttp發(fā)起的