Drive for better visionIBinder & BpBinderFebruary, 2012                         Himax Media                         Soluti...
基礎類別 : IBinder           Binder 是在 IPC 中,用來與另一端溝通的道具           繼承 RefBase ,所以能使用 strong/weak pointer           僅提供介面給 B...
衍生類別 : BpBinder & BBinder           BpBinder 在客戶端, p 代表 proxy ,代理客戶端與 Service 互            動           BBinder 在服務端     ...
status_t BBinder::transact(code, Parcel& data,     Parcel* reply, flags)             功能                   將 code 作為命令,處理...
void BBinder::attachObject(objectID, object,     cleanupCookie, func)             功能                   保存 <object, clean...
BBinder::findObject(objectID)             功能                   找出 objectID 對應的 <object, cleanupCookie, func> 組合Himax Med...
BBinder::detachObject(objectID)             功能                   刪除 objectID 對應的 <object, cleanupCookie, func> 組合Himax M...
BBinder* BBinder::localBinder()             功能                   傳回自己的位址Himax Media Solutions Proprietary & Confidential...
PING_TRANSACTION           localBinder              BBinder                  transact      DUMP_TRANSACTION               ...
BpBinder::BpBinder(handle)             功能                   設定 BpBinder 的 handle 值,並透過 IPC 送出 BC_INCREFS 命令             ...
status_t BpBinder::transact(code, Parcel& data,     Parcel* reply, flags)             功能                    將 code 作為命令,...
String16& BpBinder::getInterfaceDescriptor()             功能                   送出 INTERFACE_TRANSACTION ,取得對方的描述字串       ...
status_t BpBinder::pingBinder()             功能                   送出 PING_TRANSACTION ,判斷對應的 binder 是否存在          IPCThre...
status_t BpBinder::dump(int fd, const     Vector<String16>& args)             功能                   送出 DUMP_TRANSACTION ,...
class BpBinder::DeathRecipient             功能                   如果 BpBinder 的使用者要接收訃聞,要先繼承這個 class             實作      ...
status_t BpBinder::linkToDeath(sp<DeathRecipient>&     recipient, cookie=NULL, flags=0)             功能                  ...
status_t BpBinder::unlinkToDeath(wp<DeathRecipient>&     recipient, cookie=NULL, flags=0, wp<DeathRecipient>*     outRecip...
void BpBinder::sendObituary()             功能                   發出訃聞,只會在 service binder 死亡時發出一次             實作          ...
BpBinder::~BpBinder()             功能                   刪除 BpBinder 物件             實作                   由 IPC 送出命令 BC_C...
BpBinder::onFirstRef()             功能                   第一次有 strong pointer 參考時,會呼叫此函式             實作                 ...
BpBinder::onLastStrongRef()             功能                   最後一個 strong pointer 消失時,會呼叫此函式             實作             ...
BpBinder::onIncStrongAttempted()             功能                   想要用 strong ref ,但又不確定物件是否還在,會呼叫                    att...
handle       0       1      2      3       4     5                       ProcessState                       IPCThreadState...
Drive for better vision
Upcoming SlideShare
Loading in...5
×

07 b binder_bp_binder

871

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
871
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 1. 大部分 BpBinder 的 member function ,都是透過 IPCThreadState 的 transact() 送到 /dev/binder 2.BpBinder 和 BBinder 都有儲存 object 的空間,但 BpBinder 額外多了訃聞接收者的列表 3.ProcessState 保存一份所有 handle+binder 的列表, BpBinder 就是由這裡創造出來的
  • Transcript of "07 b binder_bp_binder"

    1. 1. Drive for better visionIBinder & BpBinderFebruary, 2012 Himax Media Solutions 承景科技股份有限公司
    2. 2. 基礎類別 : IBinder  Binder 是在 IPC 中,用來與另一端溝通的道具  繼承 RefBase ,所以能使用 strong/weak pointer  僅提供介面給 BBinder 及 BpBinder 繼承,本身沒有實作任何函 式Himax Media Solutions Proprietary & Confidential 2
    3. 3. 衍生類別 : BpBinder & BBinder  BpBinder 在客戶端, p 代表 proxy ,代理客戶端與 Service 互 動  BBinder 在服務端  兩種 Binder 是成對的,也只能與對應的 Binder 互動, Binder 系統使用 handle 值來標記 Binder IBinder BBinder BpBinderHimax Media Solutions Proprietary & Confidential 3
    4. 4. status_t BBinder::transact(code, Parcel& data, Parcel* reply, flags)  功能  將 code 作為命令,處理 data 裡面的資料,將回應寫在 reply 裡面  實作  BBinder 只有實作三種命令,其他的要等繼承者來實作  PING_TRANSACTION: 傳回 pingBinder() 的結果,在 BBinder 中永遠 為 0 ,實際的 pingBinder() 由子類別實作  INTERFACE_TRANSACTION: 傳回介面描述字串,目前是空字串,實際 的字串由子類別實作  DUMP_TRANSACTION: 呼叫 dump(...) .將 data 裡面的多個字串,輸 出到檔案中,但實際的 dump(...) 由子類別實作Himax Media Solutions Proprietary & Confidential 4
    5. 5. void BBinder::attachObject(objectID, object, cleanupCookie, func)  功能  保存 <object, cleanupCookie, func> 的組合  實作  先檢查 mExtras 有沒有分配空間,如果沒有則直接分配  以 objectId 為 key ,將 <object, cleanupCookie, func> 的組 合插入 mObjects 中Himax Media Solutions Proprietary & Confidential 5
    6. 6. BBinder::findObject(objectID)  功能  找出 objectID 對應的 <object, cleanupCookie, func> 組合Himax Media Solutions Proprietary & Confidential 6
    7. 7. BBinder::detachObject(objectID)  功能  刪除 objectID 對應的 <object, cleanupCookie, func> 組合Himax Media Solutions Proprietary & Confidential 7
    8. 8. BBinder* BBinder::localBinder()  功能  傳回自己的位址Himax Media Solutions Proprietary & Confidential 8
    9. 9. PING_TRANSACTION localBinder BBinder transact DUMP_TRANSACTION INTERFACE_TRANSACTION attachObject detachObject findObject mObjects key  <obj, cookie, func>Himax Media Solutions Proprietary & Confidential 9
    10. 10. BpBinder::BpBinder(handle)  功能  設定 BpBinder 的 handle 值,並透過 IPC 送出 BC_INCREFS 命令  設定 BpBinder 為 weak lifetime IPCThreadState BC_INCREFS, handle /dev/binder create BpBinder handleHimax Media Solutions Proprietary & Confidential 10
    11. 11. status_t BpBinder::transact(code, Parcel& data, Parcel* reply, flags)  功能  將 code 作為命令,送出 data 裡面的資料,對方會將回應放在 reply  實作  實際的 transact 由 IPCThreadState 執行,這裡會指定 handle , 等同於 BpBinder 創造時設定的 handle  如果執行 transact 造成 DEAD_OBJECT 的錯誤,表示對方的 Binder 已經刪除,所以設定 mAlive=0 ,當作 BpBinder 死掉了 IPCThreadState code, data /dev/binder transact() BpBinder replyHimax Media Solutions Proprietary & Confidential 11
    12. 12. String16& BpBinder::getInterfaceDescriptor()  功能  送出 INTERFACE_TRANSACTION ,取得對方的描述字串 IPCThreadState INTERFACE_TRANSACTION /dev/binder transact() BpBinder String16Himax Media Solutions Proprietary & Confidential 12
    13. 13. status_t BpBinder::pingBinder()  功能  送出 PING_TRANSACTION ,判斷對應的 binder 是否存在 IPCThreadState PING_TRANSACTION /dev/binder transact() BpBinder intHimax Media Solutions Proprietary & Confidential 13
    14. 14. status_t BpBinder::dump(int fd, const Vector<String16>& args)  功能  送出 DUMP_TRANSACTION ,讓對方將字串 args 寫入檔案 fd 中 DUMP_TRANSACTION IPCThreadState fd, num, String16, ... /dev/binder transact() BpBinderHimax Media Solutions Proprietary & Confidential 14
    15. 15. class BpBinder::DeathRecipient  功能  如果 BpBinder 的使用者要接收訃聞,要先繼承這個 class  實作  subclass 必須實作這個函式: virtual void binderDied(const wp<IBinder>& who)  當 service binder 死亡時,會送出訃聞給所有接收者Himax Media Solutions Proprietary & Confidential 15
    16. 16. status_t BpBinder::linkToDeath(sp<DeathRecipient>& recipient, cookie=NULL, flags=0)  功能  設定訃聞的接收者及參數  實作  由 IPC 送出資料 <BC_REQUEST_DEATH_NOTIFICATION, handle, proxy>  將 {recipient, cookie, flags} 加入訃聞名單 mObituaries 中  如果訃聞已經送出,就不能再增加 BC_REQUEST_DEATH_NOTIFICATION, handle, this BpBinder /dev/binder wp<recipient>, cookie, flags mObituariesHimax Media Solutions Proprietary & Confidential 16
    17. 17. status_t BpBinder::unlinkToDeath(wp<DeathRecipient>& recipient, cookie=NULL, flags=0, wp<DeathRecipient>* outRecipient=NULL)  功能  刪除訃聞的接收者  實作  找到 recipient 或 cookie 符合的對象,由 outRecipient 保存指 標,並刪除此對象  如果 mObituaries 清空,會送出 BC_CLEAR_DEATH_NOTIFICATION ,並刪除使用的空間 BC_CLEAR_DEATH_NOTIFICATION, handle, this BpBinder /dev/binder wp<recipient>, cookie, flags mObituariesHimax Media Solutions Proprietary & Confidential 17
    18. 18. void BpBinder::sendObituary()  功能  發出訃聞,只會在 service binder 死亡時發出一次  實作  由 IPC 送出命令 BC_CLEAR_DEATH_NOTIFICATION  對每一位訃聞接收者,會先提昇為 strong pointer ,如果提升失 敗,表示接收者可能已被刪除  如果接收者還在,就呼叫 recipient->binderDied(this) BC_CLEAR_DEATH_NOTIFICATION, handle, this BpBinder /dev/binder wp<recipient> sp<recipient> binderDied(this mObituaries )Himax Media Solutions Proprietary & Confidential 18
    19. 19. BpBinder::~BpBinder()  功能  刪除 BpBinder 物件  實作  由 IPC 送出命令 BC_CLEAR_DEATH_NOTIFICATION ,但不需要送出 訃聞,直接把訃聞接收者名單刪除  在 ProcessState 中刪除這個 binder 指標  由 IPC 送出命令 <BC_DECREFS, handle> ,表示這個 binder 已消 失 BC_CLEAR_DEATH_NOTIFICATION, handle, this BC_DECREFS, handle BpBinder /dev/binder 0 1 2 3 4 5 mObituaries ProcessStateHimax Media Solutions Proprietary & Confidential 19
    20. 20. BpBinder::onFirstRef()  功能  第一次有 strong pointer 參考時,會呼叫此函式  實作  送出 <BC_ACQUIRE, handle> 命令 IPCThreadState BC_ACQUIRE, handle /dev/binder BpBinder sp<BpBinder>Himax Media Solutions Proprietary & Confidential 20
    21. 21. BpBinder::onLastStrongRef()  功能  最後一個 strong pointer 消失時,會呼叫此函式  實作  送出 <BC_RELEASE, handle> 命令 IPCThreadState BC_RELEASE, handle /dev/binder BpBinder sp<BpBinder>Himax Media Solutions Proprietary & Confidential 21
    22. 22. BpBinder::onIncStrongAttempted()  功能  想要用 strong ref ,但又不確定物件是否還在,會呼叫 attemptIncStrong() ,此時會觸發此函式  實作  送出 <BC_ATTEMPT_ACQUIRE, 0, handle> 命令  如果回應不是 NO_ERROR ,表示失敗 BC_ATTEMPT_ACQUIRE, 0, IPCThreadState handle /dev/binder BpBinderHimax Media Solutions Proprietary & Confidential 22
    23. 23. handle 0 1 2 3 4 5 ProcessState IPCThreadState command + data /dev/binder transact() reply attachObject BpBinder detachObject wp<recipient>, cookie, flags findObject mObjects mObituariesHimax Media Solutions Proprietary & Confidential 23
    24. 24. Drive for better vision

    ×